From d50ef564bae897d31ddb889cb947ac78e6bcbe06 Mon Sep 17 00:00:00 2001 From: Mathew Date: Sat, 1 Aug 2026 00:03:53 +0200 Subject: [PATCH] (Feat) Add Cooking and Workbench --- Config/DefaultEngine.ini | 2 +- .../EditorTools/DA_IconPreset_Default.uasset | 3 + Content/Game/3d/Building/Table/M_Table.uasset | 3 + .../Game/3d/Building/Table/Table_FBX.uasset | 3 + .../Table/textures/M_table_Metal.uasset | 3 + .../Table/textures/M_table_Normal.uasset | 3 + .../Table/textures/M_table_Roughness.uasset | 3 + .../Table/textures/M_table_albedo.uasset | 3 + .../Table/textures/M_table_albedo_Mat.uasset | 3 + Content/Game/3d/Cooking/Campfire_Logs.uasset | 3 + .../Game/3d/Cooking/Campfire_Logs_001.uasset | 3 + .../Game/3d/Cooking/Campfire_Logs_002.uasset | 3 + .../Game/3d/Cooking/Campfire_Logs_003.uasset | 3 + Content/Game/3d/Cooking/LogS.uasset | 3 + Content/Game/3d/Cooking/Logs1.uasset | 3 + Content/Game/3d/Cooking/Rocks_003.uasset | 3 + Content/Game/3d/Cooking/Wood_004.uasset | 3 + Content/Game/3d/Cooking/Wood_light_001.uasset | 3 + .../Game/Animation/Fps/Armor_Fur_mat.uasset | 3 + .../Game/Animation/Fps/Armor_Upper_mat.uasset | 3 + .../Game/Animation/Fps/BasePose__2_.uasset | 3 + .../Animation/Fps/BasePose__2__Anim.uasset | 3 + .../Fps/BasePose__2__PhysicsAsset.uasset | 3 + .../Fps/BasePose__2__Skeleton.uasset | 3 + Content/Game/Animation/Fps/GrabItem.uasset | 3 + Content/Game/Animation/Fps/MaleBody_M.uasset | 3 + Content/Game/Animation/Fps/Run_NoItem.uasset | 3 + Content/Game/Animation/Fps/lambert3.uasset | 3 + Content/Game/Animation/Fps/lambert4.uasset | 3 + .../Game/Building/Cooking/BP_Campfire.uasset | 3 + .../Building/Crafting/BP_Workbench.uasset | 3 + .../Crafting/DA_Craft_Test_Branche.uasset | 4 +- .../Game/Data/Crafting/DA_RecipeBook.uasset | 4 +- .../Tools/Stone/DA_Craft_Stone_Axe.uasset | 3 + .../Tools/Wood/DA_Craft_Wood_Axe.uasset | 3 + Content/Game/Data/Item/DA_Branch.uasset | 3 - Content/Game/Data/Item/DA_RawMeat.uasset | 3 + Content/Game/Data/Item/DA_Rocher.uasset | 4 +- .../Game/Data/Item/Food/DA_CookedMeat.uasset | 3 + Content/Game/Data/Item/Food/DA_RawMeat.uasset | 3 + .../Game/Data/Item/Pickable/DA_Branch.uasset | 3 + .../Game/Data/Item/Pickable/DA_Rocher.uasset | 3 + .../Data/Item/Tools/Stone/DA_Hammer.uasset | 3 + .../Data/Item/Tools/Stone/DA_Stone_Axe.uasset | 3 + .../Item/Tools/Stone/DA_Stone_Pickaxe.uasset | 3 + .../Data/Item/Tools/Wood/DA_Wood_Axe.uasset | 3 + .../Item/Tools/Wood/DA_Wood_Pickaxe.uasset | 3 + .../Game/Images/Tools/Stone/Stone_Axe.uasset | 3 + .../Images/Tools/Stone/pickaxe_stone.uasset | 3 + .../Game/Images/Tools/Wood/Wood_Axe.uasset | 3 + .../Images/Tools/Wood/Wood_Pickaxe.uasset | 3 + Content/Game/Input/IMC_Default.uasset | 4 +- Content/Game/Maps/Dev/Dev_Scene.umap | 3 + Content/Game/Maps/GameScene.umap | 4 +- Content/Game/PickupItem/BP_Pickup_Test.uasset | 4 +- Content/Game/UI/Craft/WBP_Crafting.uasset | 4 +- .../Game/UI/Craft/WBP_InventoryScreen.uasset | 4 +- .../Setting/Input/WBP_SettingsControls.uasset | 4 +- Content/UI/Icons/T_Icon_Food_06.uasset | 3 + Content/UI/Icons/T_Icon_Food_07.uasset | 3 + .../Demo/Scene/Materials/MI_Apple_01.uasset | 3 + .../Demo/Scene/Materials/MI_Apple_02.uasset | 3 + .../Scene/Materials/MI_Vefects_Grid_01.uasset | 3 + .../Scene/Materials/MI_Vefects_Grid_02.uasset | 3 + .../Demo/Scene/Materials/M_Apple_01.uasset | 3 + .../Scene/Materials/M_Vefects_Grid.uasset | 3 + .../Demo/Scene/Meshes/SM_VFX_Apple_01.uasset | 3 + .../Scene/Meshes/SM_VFX_Apple_01_HD.uasset | 3 + .../Meshes/SM_VFX_Sphere_128_Scaled.uasset | 3 + .../Apple/T_VFX_Apple_01_Low_BC.uasset | 3 + .../Apple/T_VFX_Apple_01_Low_GS.uasset | 3 + .../Apple/T_VFX_Apple_01_Low_N.uasset | 3 + .../Textures/Grid/T_VFX_Grid_01_Masks.uasset | 3 + .../Textures/Grid/T_VFX_Grid_01_Normal.uasset | 3 + .../Grid/T_VFX_Grid_01_Texture.uasset | 3 + .../Sky/T_Lush_HDRI_05_Blur_Opti.uasset | 3 + .../Textures/Sky/T_VFX_Lush_HDRI_05.uasset | 3 + .../Demo/Sequence/LS_Cam_Anim_01.uasset | 3 + .../Animations/AirDash_Vexa.uasset | 3 + .../Animations/AirStomp_Vexa.uasset | 3 + .../Animations/Appearance_Vexa.uasset | 3 + .../Animations/Dash_Vexa.uasset | 3 + .../Animations/Death_Vexa.uasset | 3 + .../Animations/GunShot01_Vexa.uasset | 3 + .../Animations/GunShot02_Vexa.uasset | 3 + .../Animations/GunShot03_Vexa.uasset | 3 + .../Animations/GunShotComplete_Vexa.uasset | 3 + .../Animations/HandsSpell_Vexa.uasset | 3 + .../Animations/Healing_Vexa.uasset | 3 + .../Animations/IdleChill_Vexa.uasset | 3 + .../Animations/Idle_Vexa.uasset | 3 + .../Animations/Jump01_Vexa.uasset | 3 + .../Animations/Jump02_Vexa.uasset | 3 + .../Animations/Jump03_Vexa.uasset | 3 + .../Animations/JumpComplete_Vexa.uasset | 3 + .../Animations/MagicWand_Vexa.uasset | 3 + .../RecivingHeavyDamage_Vexa.uasset | 3 + .../RecivingLightDamage_Vexa.uasset | 3 + .../Animations/SnappySpell_Vexa.uasset | 3 + .../Animations/Stomp_Vexa.uasset | 3 + .../Animations/SummonCreature_Vexa.uasset | 3 + .../Animations/SwordAttack_Vexa.uasset | 3 + .../Animations/SwordSlash_Vexa.uasset | 3 + .../Materials/Dark/MI_Vexa_Body_Dark.uasset | 3 + .../Materials/Dark/MI_Vexa_Hair_Dark.uasset | 3 + .../Materials/Dark/MI_Vexa_Jacket_Dark.uasset | 3 + .../Materials/Flat/MI_Vexa_Body_Flat.uasset | 3 + .../Materials/Flat/MI_Vexa_Hair_Flat.uasset | 3 + .../Materials/Flat/MI_Vexa_Jacket_Flat.uasset | 3 + .../Materials/Flat/M_Vexa_Flat.uasset | 3 + .../Materials/Logo/MI_Logo_01.uasset | 3 + .../Materials/Logo/MI_Logo_01_Normal.uasset | 3 + .../Materials/Logo/M_Logo.uasset | 3 + .../Materials/Logo/M_Logo_Normal.uasset | 3 + .../Materials/Master/M_Vexa.uasset | 3 + .../Meshes/SM_Vefects_Vexa.uasset | 3 + .../SK/SK_Vefects_Vexa.uasset | 3 + .../SK/Vefects_Vexa_PhysicsAsset.uasset | 3 + .../SK/Vefects_Vexa_Skeleton.uasset | 3 + .../Body/T_Vexa_Body_Base_Color_Dark.uasset | 3 + .../Textures/Body/T_Vexa_Body_MR_01.uasset | 3 + .../Textures/Body/T_Vexa_Body_Normal.uasset | 3 + .../Hair/T_Vexa_Hair_Base_Color_Dark.uasset | 3 + .../T_Vexa_Hair_Base_Color_Grayscale.uasset | 3 + .../Textures/Hair/T_Vexa_Hair_MR_01.uasset | 3 + .../Textures/Hair/T_Vexa_Hair_Normal.uasset | 3 + .../T_Vexa_Jacket_Base_Color_Dark.uasset | 3 + .../T_Vexa_Jacket_Base_Color_Grayscale.uasset | 3 + .../Jacket/T_Vexa_Jacket_MR_01.uasset | 3 + .../Jacket/T_Vexa_Jacket_Normal.uasset | 3 + .../T_Vefects_Vexa_Custom_Logo_01_Mask.uasset | 3 + ..._Vefects_Vexa_Custom_Logo_01_Normal.uasset | 3 + .../Extra/Materials/MI_Extra_Frame_01.uasset | 3 + .../Extra/Materials/MI_Extra_Learn_VFX.uasset | 3 + .../Materials/MI_Extra_Vefects_Book_01.uasset | 3 + .../MI_Extra_Vefects_Bundle_01.uasset | 3 + .../MI_Extra_Vefects_Bundle_02.uasset | 3 + .../MI_Extra_Vefects_Bundle_03.uasset | 3 + .../MI_Extra_Vefects_Bundle_04.uasset | 3 + .../MI_Extra_Vefects_Bundle_05.uasset | 3 + .../MI_Extra_Vefects_Bundle_06.uasset | 3 + .../MI_Extra_Vefects_Bundle_07.uasset | 3 + .../MI_Extra_Vefects_Bundle_08.uasset | 3 + .../MI_Extra_Vefects_Bundle_09.uasset | 3 + .../MI_Extra_Vefects_Bundle_10.uasset | 3 + .../MI_Extra_Vefects_Bundle_11.uasset | 3 + .../MI_Extra_Vefects_Bundle_12.uasset | 3 + .../MI_Extra_Vefects_Bundle_13.uasset | 3 + .../MI_Extra_Vefects_Bundle_14.uasset | 3 + .../MI_Extra_Vefects_Bundle_15.uasset | 3 + .../MI_Extra_Vefects_Bundle_Master_01.uasset | 3 + .../Demo/Extra/Materials/MI_Opaque_02.uasset | 3 + .../Extra/Materials/MI_Opaque_Dark_01.uasset | 3 + .../Materials/MI_Opaque_Fresnel_01.uasset | 3 + .../Materials/MI_Opaque_Fresnel_02.uasset | 3 + .../Materials/MI_Opaque_Fresnel_03.uasset | 3 + .../Materials/MI_Opaque_Fresnel_04.uasset | 3 + .../Materials/MI_Opaque_Fresnel_05.uasset | 3 + .../Materials/MI_Opaque_Fresnel_06.uasset | 3 + .../Materials/MI_Opaque_Fresnel_07.uasset | 3 + .../Materials/MI_Opaque_Fresnel_08.uasset | 3 + .../Materials/MI_Opaque_Fresnel_09.uasset | 3 + .../Demo/Extra/Materials/MI_Text_01.uasset | 3 + .../Extra/Materials/M_Extra_Billboard.uasset | 3 + .../Demo/Extra/Materials/M_Extra_Frame.uasset | 3 + .../Demo/Extra/Materials/M_Opaque.uasset | 3 + .../Extra/Materials/M_Opaque_Fresnel.uasset | 3 + .../Demo/Extra/Materials/M_Text_01.uasset | 3 + .../Extra/SM/SM_Extra_Billboard_01.uasset | 3 + .../SM/SM_Extra_Billboard_Base_01.uasset | 3 + .../Demo/Extra/Textures/T_Learn_VFX.uasset | 3 + .../T_Vefects_Anime_Stylized_VFX.uasset | 3 + .../Extra/Textures/T_Vefects_Anime_VFX.uasset | 3 + .../Extra/Textures/T_Vefects_Blood_VFX.uasset | 3 + .../Textures/T_Vefects_Explosions_VFX.uasset | 3 + .../Textures/T_Vefects_Flipbook_VFX.uasset | 3 + .../Textures/T_Vefects_Item_Pickup_VFX.uasset | 3 + .../Extra/Textures/T_Vefects_Loot_VFX.uasset | 3 + .../T_Vefects_Realistic_Water_VFX.uasset | 3 + .../Extra/Textures/T_Vefects_Sand_VFX.uasset | 3 + .../Extra/Textures/T_Vefects_Shots_VFX.uasset | 3 + .../Extra/Textures/T_Vefects_Slime_VFX.uasset | 3 + .../Textures/T_Vefects_Smoke_Bombs_VFX.uasset | 3 + .../Extra/Textures/T_Vefects_Space_VFX.uasset | 3 + .../Demo/Extra/Textures/T_Vefects_VFX.uasset | 3 + .../Extra/Textures/T_Vefects_VFX_Book.uasset | 3 + .../Textures/T_Vefects_VFX_Mega_Bundle.uasset | 3 + .../Textures/T_Vefects_Vignette_VFX.uasset | 3 + .../Stylized_Fire/Demo/_Extra/Maps/Extra.umap | 3 + .../Demo/_Extra/Maps/LearnVFX.umap | 3 + .../Maps/Stylized_Fire_Overview.umap | 3 + .../Stylized_Fire_Overview_BuiltData.uasset | 3 + .../Maps/Stylized_Fire_Overview_Stack.umap | 3 + ...lized_Fire_Overview_Stack_BuiltData.uasset | 3 + .../Stylized_Fire_Overview_Stack_Radial.umap | 3 + .../Maps/Stylized_Fire_Tests.umap | 3 + .../Particles/NS_Stylized_Fire_01_Dark.uasset | 3 + .../Particles/NS_Stylized_Fire_02_Dark.uasset | 3 + .../NS_Stylized_Fire_Radial_01_Dark.uasset | 3 + .../NS_Stylized_Fire_Radial_02_Dark.uasset | 3 + .../MI_VFX_Stylized_Fire_01_Electric.uasset | 3 + .../MI_VFX_Stylized_Fire_02_Electric.uasset | 3 + ...FX_Stylized_Fire_Radial_01_Electric.uasset | 3 + ...FX_Stylized_Fire_Radial_02_Electric.uasset | 3 + .../NS_Stylized_Fire_01_Electric.uasset | 3 + .../NS_Stylized_Fire_02_Electric.uasset | 3 + ...NS_Stylized_Fire_Radial_01_Electric.uasset | 3 + ...NS_Stylized_Fire_Radial_02_Electric.uasset | 3 + .../MI_VFX_Stylized_Fire_01_Ethereal.uasset | 3 + .../MI_VFX_Stylized_Fire_02_Ethereal.uasset | 3 + ...FX_Stylized_Fire_Radial_01_Ethereal.uasset | 3 + ...FX_Stylized_Fire_Radial_02_Ethereal.uasset | 3 + .../NS_Stylized_Fire_01_Ethereal.uasset | 3 + .../NS_Stylized_Fire_02_Ethereal.uasset | 3 + ...NS_Stylized_Fire_Radial_01_Ethereal.uasset | 3 + ...NS_Stylized_Fire_Radial_02_Ethereal.uasset | 3 + .../Materials/MI_VFX_Stylized_Fire_01.uasset | 3 + .../MI_VFX_Stylized_Fire_01_DF.uasset | 3 + .../Materials/MI_VFX_Stylized_Fire_02.uasset | 3 + .../MI_VFX_Stylized_Fire_Radial_01.uasset | 3 + .../MI_VFX_Stylized_Fire_Radial_02.uasset | 3 + .../Particles/NS_Stylized_Fire_01.uasset | 3 + .../NS_Stylized_Fire_01_Infinite.uasset | 3 + .../Particles/NS_Stylized_Fire_01_Once.uasset | 3 + .../Particles/NS_Stylized_Fire_02.uasset | 3 + .../NS_Stylized_Fire_02_Infinite.uasset | 3 + .../Particles/NS_Stylized_Fire_02_Once.uasset | 3 + .../NS_Stylized_Fire_Large_01.uasset | 3 + .../NS_Stylized_Fire_Radial_01.uasset | 3 + .../NS_Stylized_Fire_Radial_02.uasset | 3 + .../MI_VFX_Stylized_Fire_01_Mystic.uasset | 3 + .../MI_VFX_Stylized_Fire_02_Mystic.uasset | 3 + ..._VFX_Stylized_Fire_Radial_01_Mystic.uasset | 3 + ..._VFX_Stylized_Fire_Radial_02_Mystic.uasset | 3 + .../NS_Stylized_Fire_01_Mystic.uasset | 3 + .../NS_Stylized_Fire_02_Mystic.uasset | 3 + .../NS_Stylized_Fire_Radial_01_Mystic.uasset | 3 + .../NS_Stylized_Fire_Radial_02_Mystic.uasset | 3 + .../MI_VFX_Stylized_Fire_01_Poison.uasset | 3 + .../MI_VFX_Stylized_Fire_02_Poison.uasset | 3 + ..._VFX_Stylized_Fire_Radial_01_Poison.uasset | 3 + ..._VFX_Stylized_Fire_Radial_02_Poison.uasset | 3 + .../NS_Stylized_Fire_01_Poison.uasset | 3 + .../NS_Stylized_Fire_02_Poison.uasset | 3 + .../NS_Stylized_Fire_Radial_01_Poison.uasset | 3 + .../NS_Stylized_Fire_Radial_02_Poison.uasset | 3 + .../Particles/NS_Stylized_Fire_01_Pure.uasset | 3 + .../Particles/NS_Stylized_Fire_02_Pure.uasset | 3 + .../NS_Stylized_Fire_Radial_01_Pure.uasset | 3 + .../NS_Stylized_Fire_Radial_02_Pure.uasset | 3 + .../MI_VFX_Stylized_Fire_01_Rainbow.uasset | 3 + .../MI_VFX_Stylized_Fire_02_Rainbow.uasset | 3 + ...VFX_Stylized_Fire_Radial_01_Rainbow.uasset | 3 + ...VFX_Stylized_Fire_Radial_02_Rainbow.uasset | 3 + .../NS_Stylized_Fire_01_Rainbow.uasset | 3 + .../NS_Stylized_Fire_02_Rainbow.uasset | 3 + .../NS_Stylized_Fire_Radial_01_Rainbow.uasset | 3 + .../NS_Stylized_Fire_Radial_02_Rainbow.uasset | 3 + ...X_Render_Particles_On_Top_Always_01.uasset | 3 + ...X_Render_Particles_On_Top_Always_02.uasset | 3 + ...er_Particles_On_Top_Always_02_Wrong.uasset | 3 + ...er_Particles_On_Top_Always_Wrong_01.uasset | 3 + .../MI_VFX_Stylized_Fire_01_GS.uasset | 3 + .../MI_VFX_Stylized_Fire_02_GS.uasset | 3 + .../MI_VFX_Stylized_Fire_Radial_01_GS.uasset | 3 + .../MI_VFX_Stylized_Fire_Radial_02_GS.uasset | 3 + ...I_VFX_Stylized_Fire_Radial_02_GS_02.uasset | 3 + ..._VFX_Render_Particles_On_Top_Always.uasset | 3 + ...ender_Particles_On_Top_Always_Wrong.uasset | 3 + .../Materials/M_VFX_Stylized_Fire_01.uasset | 3 + .../M_VFX_Stylized_Fire_Radial_01.uasset | 3 + .../Particles/NE_Stylized_Fire_00.uasset | 3 + .../Textures/LUTs/T_VFX_LUT_Blood_01.uasset | 3 + .../LUTs/T_VFX_LUT_Blood_01_Mirrored.uasset | 3 + .../Textures/LUTs/T_VFX_LUT_Blood_02.uasset | 3 + .../Textures/LUTs/T_VFX_LUT_Blood_03.uasset | 3 + .../LUTs/T_VFX_LUT_Blood_03_Mirrored.uasset | 3 + .../Textures/LUTs/T_VFX_LUT_Candy_01.uasset | 3 + .../LUTs/T_VFX_LUT_Candy_01_Mirrored.uasset | 3 + .../LUTs/T_VFX_LUT_Electric_01.uasset | 3 + .../Textures/LUTs/T_VFX_LUT_Fail_01.uasset | 3 + .../Textures/LUTs/T_VFX_LUT_Fail_02.uasset | 3 + .../Textures/LUTs/T_VFX_LUT_Fire_01.uasset | 3 + .../LUTs/T_VFX_LUT_Fire_01_Mirrored.uasset | 3 + .../Textures/LUTs/T_VFX_LUT_Fire_02.uasset | 3 + .../Textures/LUTs/T_VFX_LUT_Fire_03.uasset | 3 + .../LUTs/T_VFX_LUT_Flame_Example_01.uasset | 3 + .../Textures/LUTs/T_VFX_LUT_GS_01.uasset | 3 + .../LUTs/T_VFX_LUT_GS_01_Mirrored.uasset | 3 + .../Textures/LUTs/T_VFX_LUT_GS_02.uasset | 3 + .../LUTs/T_VFX_LUT_GS_02_Mirrored.uasset | 3 + .../Textures/LUTs/T_VFX_LUT_Light_01.uasset | 3 + .../LUTs/T_VFX_LUT_Light_01_Mirrored.uasset | 3 + .../Textures/LUTs/T_VFX_LUT_Nature_01.uasset | 3 + .../LUTs/T_VFX_LUT_Nature_01_Mirrored.uasset | 3 + .../Textures/LUTs/T_VFX_LUT_Night_01.uasset | 3 + .../LUTs/T_VFX_LUT_Night_01_Inverted.uasset | 3 + .../LUTs/T_VFX_LUT_Night_01_Mirrored.uasset | 3 + .../T_VFX_LUT_Rainbow_Desaturated_01.uasset | 3 + ...LUT_Rainbow_Desaturated_01_Mirrored.uasset | 3 + .../Textures/LUTs/T_VFX_LUT_Water_01.uasset | 3 + .../LUTs/T_VFX_LUT_Water_01_Mirrored.uasset | 3 + .../Textures/T_VFX_Lens_Flare_01.uasset | 3 + .../T_VFX_Lens_Flares_Random_01.uasset | 3 + .../Shared/Textures/T_VFX_Perlin_01.uasset | 3 + .../Shared/Textures/T_VFX_Perlin_01_N.uasset | 3 + .../Shared/Textures/T_VFX_Perlin_02.uasset | 3 + .../Shared/Textures/T_VFX_Perlin_02_N.uasset | 3 + ...T_VFX_Stylized_Fire_Masks_Packed_01.uasset | 3 + ...T_VFX_Stylized_Fire_Masks_Packed_02.uasset | 3 + ...T_VFX_Stylized_Fire_Masks_Packed_03.uasset | 3 + ...T_VFX_Stylized_Fire_Masks_Packed_04.uasset | 3 + ...T_VFX_Stylized_Fire_Masks_Packed_05.uasset | 3 + ...T_VFX_Stylized_Fire_Masks_Packed_06.uasset | 3 + ...T_VFX_Stylized_Fire_Masks_Packed_07.uasset | 3 + ..._VFX_Stylized_Fire_Swirls_Packed_01.uasset | 3 + ...X_Stylized_Fire_Swirls_Packed_01_HD.uasset | 3 + .../MI_VFX_Stylized_Fire_01_Water.uasset | 3 + .../MI_VFX_Stylized_Fire_02_Water.uasset | 3 + ...I_VFX_Stylized_Fire_Radial_01_Water.uasset | 3 + ...I_VFX_Stylized_Fire_Radial_02_Water.uasset | 3 + .../NS_Stylized_Fire_01_Water.uasset | 3 + .../NS_Stylized_Fire_02_Water.uasset | 3 + .../NS_Stylized_Fire_Radial_01_Water.uasset | 3 + .../NS_Stylized_Fire_Radial_02_Water.uasset | 3 + Plugins/IconStudio/IconStudio.uplugin | 24 + .../Source/IconStudio/IconStudio.Build.cs | 41 + .../IconStudio/Private/IconStudioModule.cpp | 114 +++ .../IconStudio/Private/IconStudioPreset.cpp | 23 + .../IconStudio/Private/IconStudioRenderer.cpp | 579 ++++++++++++ .../IconStudio/Private/IconStudioSession.cpp | 24 + .../IconStudio/Private/IconStudioSettings.cpp | 13 + .../Private/IconStudioSubsystem.cpp | 619 +++++++++++++ .../IconStudio/Private/SIconStudioTab.cpp | 362 ++++++++ .../IconStudio/Private/SIconStudioTab.h | 67 ++ .../IconStudio/Public/IconStudioPreset.h | 176 ++++ .../IconStudio/Public/IconStudioRenderer.h | 112 +++ .../IconStudio/Public/IconStudioSession.h | 67 ++ .../IconStudio/Public/IconStudioSettings.h | 61 ++ .../IconStudio/Public/IconStudioSubsystem.h | 133 +++ .../IconStudio/Public/IconStudioTypes.h | 100 +++ .../Private/CookingStation.cpp | 840 ++++++++++++++++++ .../Private/CraftingComponent.cpp | 36 +- .../Private/CraftingStation.cpp | 49 + .../Private/FpsPlayerController.cpp | 51 ++ .../Private/InteractionComponent.cpp | 26 +- .../Private/InteractionPromptWidget.cpp | 13 +- .../Survival_projet/Private/ItemDataAsset.cpp | 76 ++ Source/Survival_projet/Private/PickupItem.cpp | 11 +- .../Survival_projet/Public/CookingStation.h | 482 ++++++++++ .../Public/CraftingComponent.h | 20 +- .../Survival_projet/Public/CraftingStation.h | 65 ++ .../Public/FpsPlayerController.h | 31 +- Source/Survival_projet/Public/Interactable.h | 10 +- .../Public/InteractionComponent.h | 31 +- .../Public/InteractionPromptWidget.h | 12 +- Source/Survival_projet/Public/ItemDataAsset.h | 117 ++- Source/Survival_projet/Public/PickupItem.h | 2 +- .../Survival_projet/Survival_projet.Build.cs | 6 +- Survival_projet.uproject | 7 + 360 files changed, 5316 insertions(+), 67 deletions(-) create mode 100644 Content/EditorTools/DA_IconPreset_Default.uasset create mode 100644 Content/Game/3d/Building/Table/M_Table.uasset create mode 100644 Content/Game/3d/Building/Table/Table_FBX.uasset create mode 100644 Content/Game/3d/Building/Table/textures/M_table_Metal.uasset create mode 100644 Content/Game/3d/Building/Table/textures/M_table_Normal.uasset create mode 100644 Content/Game/3d/Building/Table/textures/M_table_Roughness.uasset create mode 100644 Content/Game/3d/Building/Table/textures/M_table_albedo.uasset create mode 100644 Content/Game/3d/Building/Table/textures/M_table_albedo_Mat.uasset create mode 100644 Content/Game/3d/Cooking/Campfire_Logs.uasset create mode 100644 Content/Game/3d/Cooking/Campfire_Logs_001.uasset create mode 100644 Content/Game/3d/Cooking/Campfire_Logs_002.uasset create mode 100644 Content/Game/3d/Cooking/Campfire_Logs_003.uasset create mode 100644 Content/Game/3d/Cooking/LogS.uasset create mode 100644 Content/Game/3d/Cooking/Logs1.uasset create mode 100644 Content/Game/3d/Cooking/Rocks_003.uasset create mode 100644 Content/Game/3d/Cooking/Wood_004.uasset create mode 100644 Content/Game/3d/Cooking/Wood_light_001.uasset create mode 100644 Content/Game/Animation/Fps/Armor_Fur_mat.uasset create mode 100644 Content/Game/Animation/Fps/Armor_Upper_mat.uasset create mode 100644 Content/Game/Animation/Fps/BasePose__2_.uasset create mode 100644 Content/Game/Animation/Fps/BasePose__2__Anim.uasset create mode 100644 Content/Game/Animation/Fps/BasePose__2__PhysicsAsset.uasset create mode 100644 Content/Game/Animation/Fps/BasePose__2__Skeleton.uasset create mode 100644 Content/Game/Animation/Fps/GrabItem.uasset create mode 100644 Content/Game/Animation/Fps/MaleBody_M.uasset create mode 100644 Content/Game/Animation/Fps/Run_NoItem.uasset create mode 100644 Content/Game/Animation/Fps/lambert3.uasset create mode 100644 Content/Game/Animation/Fps/lambert4.uasset create mode 100644 Content/Game/Building/Cooking/BP_Campfire.uasset create mode 100644 Content/Game/Building/Crafting/BP_Workbench.uasset create mode 100644 Content/Game/Data/Crafting/Tools/Stone/DA_Craft_Stone_Axe.uasset create mode 100644 Content/Game/Data/Crafting/Tools/Wood/DA_Craft_Wood_Axe.uasset delete mode 100644 Content/Game/Data/Item/DA_Branch.uasset create mode 100644 Content/Game/Data/Item/DA_RawMeat.uasset create mode 100644 Content/Game/Data/Item/Food/DA_CookedMeat.uasset create mode 100644 Content/Game/Data/Item/Food/DA_RawMeat.uasset create mode 100644 Content/Game/Data/Item/Pickable/DA_Branch.uasset create mode 100644 Content/Game/Data/Item/Pickable/DA_Rocher.uasset create mode 100644 Content/Game/Data/Item/Tools/Stone/DA_Hammer.uasset create mode 100644 Content/Game/Data/Item/Tools/Stone/DA_Stone_Axe.uasset create mode 100644 Content/Game/Data/Item/Tools/Stone/DA_Stone_Pickaxe.uasset create mode 100644 Content/Game/Data/Item/Tools/Wood/DA_Wood_Axe.uasset create mode 100644 Content/Game/Data/Item/Tools/Wood/DA_Wood_Pickaxe.uasset create mode 100644 Content/Game/Images/Tools/Stone/Stone_Axe.uasset create mode 100644 Content/Game/Images/Tools/Stone/pickaxe_stone.uasset create mode 100644 Content/Game/Images/Tools/Wood/Wood_Axe.uasset create mode 100644 Content/Game/Images/Tools/Wood/Wood_Pickaxe.uasset create mode 100644 Content/Game/Maps/Dev/Dev_Scene.umap create mode 100644 Content/UI/Icons/T_Icon_Food_06.uasset create mode 100644 Content/UI/Icons/T_Icon_Food_07.uasset create mode 100644 Content/Vefects/Stylized_Fire/Demo/Scene/Materials/MI_Apple_01.uasset create mode 100644 Content/Vefects/Stylized_Fire/Demo/Scene/Materials/MI_Apple_02.uasset create mode 100644 Content/Vefects/Stylized_Fire/Demo/Scene/Materials/MI_Vefects_Grid_01.uasset create mode 100644 Content/Vefects/Stylized_Fire/Demo/Scene/Materials/MI_Vefects_Grid_02.uasset create mode 100644 Content/Vefects/Stylized_Fire/Demo/Scene/Materials/M_Apple_01.uasset create mode 100644 Content/Vefects/Stylized_Fire/Demo/Scene/Materials/M_Vefects_Grid.uasset create mode 100644 Content/Vefects/Stylized_Fire/Demo/Scene/Meshes/SM_VFX_Apple_01.uasset create mode 100644 Content/Vefects/Stylized_Fire/Demo/Scene/Meshes/SM_VFX_Apple_01_HD.uasset create mode 100644 Content/Vefects/Stylized_Fire/Demo/Scene/Meshes/SM_VFX_Sphere_128_Scaled.uasset create mode 100644 Content/Vefects/Stylized_Fire/Demo/Scene/Textures/Apple/T_VFX_Apple_01_Low_BC.uasset create mode 100644 Content/Vefects/Stylized_Fire/Demo/Scene/Textures/Apple/T_VFX_Apple_01_Low_GS.uasset create mode 100644 Content/Vefects/Stylized_Fire/Demo/Scene/Textures/Apple/T_VFX_Apple_01_Low_N.uasset create mode 100644 Content/Vefects/Stylized_Fire/Demo/Scene/Textures/Grid/T_VFX_Grid_01_Masks.uasset create mode 100644 Content/Vefects/Stylized_Fire/Demo/Scene/Textures/Grid/T_VFX_Grid_01_Normal.uasset create mode 100644 Content/Vefects/Stylized_Fire/Demo/Scene/Textures/Grid/T_VFX_Grid_01_Texture.uasset create mode 100644 Content/Vefects/Stylized_Fire/Demo/Scene/Textures/Sky/T_Lush_HDRI_05_Blur_Opti.uasset create mode 100644 Content/Vefects/Stylized_Fire/Demo/Scene/Textures/Sky/T_VFX_Lush_HDRI_05.uasset create mode 100644 Content/Vefects/Stylized_Fire/Demo/Sequence/LS_Cam_Anim_01.uasset create mode 100644 Content/Vefects/Stylized_Fire/Demo/Stylized_Female_Character_Vexa/Animations/AirDash_Vexa.uasset create mode 100644 Content/Vefects/Stylized_Fire/Demo/Stylized_Female_Character_Vexa/Animations/AirStomp_Vexa.uasset create mode 100644 Content/Vefects/Stylized_Fire/Demo/Stylized_Female_Character_Vexa/Animations/Appearance_Vexa.uasset create mode 100644 Content/Vefects/Stylized_Fire/Demo/Stylized_Female_Character_Vexa/Animations/Dash_Vexa.uasset create mode 100644 Content/Vefects/Stylized_Fire/Demo/Stylized_Female_Character_Vexa/Animations/Death_Vexa.uasset create mode 100644 Content/Vefects/Stylized_Fire/Demo/Stylized_Female_Character_Vexa/Animations/GunShot01_Vexa.uasset create mode 100644 Content/Vefects/Stylized_Fire/Demo/Stylized_Female_Character_Vexa/Animations/GunShot02_Vexa.uasset create mode 100644 Content/Vefects/Stylized_Fire/Demo/Stylized_Female_Character_Vexa/Animations/GunShot03_Vexa.uasset create mode 100644 Content/Vefects/Stylized_Fire/Demo/Stylized_Female_Character_Vexa/Animations/GunShotComplete_Vexa.uasset create mode 100644 Content/Vefects/Stylized_Fire/Demo/Stylized_Female_Character_Vexa/Animations/HandsSpell_Vexa.uasset create mode 100644 Content/Vefects/Stylized_Fire/Demo/Stylized_Female_Character_Vexa/Animations/Healing_Vexa.uasset create mode 100644 Content/Vefects/Stylized_Fire/Demo/Stylized_Female_Character_Vexa/Animations/IdleChill_Vexa.uasset create mode 100644 Content/Vefects/Stylized_Fire/Demo/Stylized_Female_Character_Vexa/Animations/Idle_Vexa.uasset create mode 100644 Content/Vefects/Stylized_Fire/Demo/Stylized_Female_Character_Vexa/Animations/Jump01_Vexa.uasset create mode 100644 Content/Vefects/Stylized_Fire/Demo/Stylized_Female_Character_Vexa/Animations/Jump02_Vexa.uasset create mode 100644 Content/Vefects/Stylized_Fire/Demo/Stylized_Female_Character_Vexa/Animations/Jump03_Vexa.uasset create mode 100644 Content/Vefects/Stylized_Fire/Demo/Stylized_Female_Character_Vexa/Animations/JumpComplete_Vexa.uasset create mode 100644 Content/Vefects/Stylized_Fire/Demo/Stylized_Female_Character_Vexa/Animations/MagicWand_Vexa.uasset create mode 100644 Content/Vefects/Stylized_Fire/Demo/Stylized_Female_Character_Vexa/Animations/RecivingHeavyDamage_Vexa.uasset create mode 100644 Content/Vefects/Stylized_Fire/Demo/Stylized_Female_Character_Vexa/Animations/RecivingLightDamage_Vexa.uasset create mode 100644 Content/Vefects/Stylized_Fire/Demo/Stylized_Female_Character_Vexa/Animations/SnappySpell_Vexa.uasset create mode 100644 Content/Vefects/Stylized_Fire/Demo/Stylized_Female_Character_Vexa/Animations/Stomp_Vexa.uasset create mode 100644 Content/Vefects/Stylized_Fire/Demo/Stylized_Female_Character_Vexa/Animations/SummonCreature_Vexa.uasset create mode 100644 Content/Vefects/Stylized_Fire/Demo/Stylized_Female_Character_Vexa/Animations/SwordAttack_Vexa.uasset create mode 100644 Content/Vefects/Stylized_Fire/Demo/Stylized_Female_Character_Vexa/Animations/SwordSlash_Vexa.uasset create mode 100644 Content/Vefects/Stylized_Fire/Demo/Stylized_Female_Character_Vexa/Materials/Dark/MI_Vexa_Body_Dark.uasset create mode 100644 Content/Vefects/Stylized_Fire/Demo/Stylized_Female_Character_Vexa/Materials/Dark/MI_Vexa_Hair_Dark.uasset create mode 100644 Content/Vefects/Stylized_Fire/Demo/Stylized_Female_Character_Vexa/Materials/Dark/MI_Vexa_Jacket_Dark.uasset create mode 100644 Content/Vefects/Stylized_Fire/Demo/Stylized_Female_Character_Vexa/Materials/Flat/MI_Vexa_Body_Flat.uasset create mode 100644 Content/Vefects/Stylized_Fire/Demo/Stylized_Female_Character_Vexa/Materials/Flat/MI_Vexa_Hair_Flat.uasset create mode 100644 Content/Vefects/Stylized_Fire/Demo/Stylized_Female_Character_Vexa/Materials/Flat/MI_Vexa_Jacket_Flat.uasset create mode 100644 Content/Vefects/Stylized_Fire/Demo/Stylized_Female_Character_Vexa/Materials/Flat/M_Vexa_Flat.uasset create mode 100644 Content/Vefects/Stylized_Fire/Demo/Stylized_Female_Character_Vexa/Materials/Logo/MI_Logo_01.uasset create mode 100644 Content/Vefects/Stylized_Fire/Demo/Stylized_Female_Character_Vexa/Materials/Logo/MI_Logo_01_Normal.uasset create mode 100644 Content/Vefects/Stylized_Fire/Demo/Stylized_Female_Character_Vexa/Materials/Logo/M_Logo.uasset create mode 100644 Content/Vefects/Stylized_Fire/Demo/Stylized_Female_Character_Vexa/Materials/Logo/M_Logo_Normal.uasset create mode 100644 Content/Vefects/Stylized_Fire/Demo/Stylized_Female_Character_Vexa/Materials/Master/M_Vexa.uasset create mode 100644 Content/Vefects/Stylized_Fire/Demo/Stylized_Female_Character_Vexa/Meshes/SM_Vefects_Vexa.uasset create mode 100644 Content/Vefects/Stylized_Fire/Demo/Stylized_Female_Character_Vexa/SK/SK_Vefects_Vexa.uasset create mode 100644 Content/Vefects/Stylized_Fire/Demo/Stylized_Female_Character_Vexa/SK/Vefects_Vexa_PhysicsAsset.uasset create mode 100644 Content/Vefects/Stylized_Fire/Demo/Stylized_Female_Character_Vexa/SK/Vefects_Vexa_Skeleton.uasset create mode 100644 Content/Vefects/Stylized_Fire/Demo/Stylized_Female_Character_Vexa/Textures/Body/T_Vexa_Body_Base_Color_Dark.uasset create mode 100644 Content/Vefects/Stylized_Fire/Demo/Stylized_Female_Character_Vexa/Textures/Body/T_Vexa_Body_MR_01.uasset create mode 100644 Content/Vefects/Stylized_Fire/Demo/Stylized_Female_Character_Vexa/Textures/Body/T_Vexa_Body_Normal.uasset create mode 100644 Content/Vefects/Stylized_Fire/Demo/Stylized_Female_Character_Vexa/Textures/Hair/T_Vexa_Hair_Base_Color_Dark.uasset create mode 100644 Content/Vefects/Stylized_Fire/Demo/Stylized_Female_Character_Vexa/Textures/Hair/T_Vexa_Hair_Base_Color_Grayscale.uasset create mode 100644 Content/Vefects/Stylized_Fire/Demo/Stylized_Female_Character_Vexa/Textures/Hair/T_Vexa_Hair_MR_01.uasset create mode 100644 Content/Vefects/Stylized_Fire/Demo/Stylized_Female_Character_Vexa/Textures/Hair/T_Vexa_Hair_Normal.uasset create mode 100644 Content/Vefects/Stylized_Fire/Demo/Stylized_Female_Character_Vexa/Textures/Jacket/T_Vexa_Jacket_Base_Color_Dark.uasset create mode 100644 Content/Vefects/Stylized_Fire/Demo/Stylized_Female_Character_Vexa/Textures/Jacket/T_Vexa_Jacket_Base_Color_Grayscale.uasset create mode 100644 Content/Vefects/Stylized_Fire/Demo/Stylized_Female_Character_Vexa/Textures/Jacket/T_Vexa_Jacket_MR_01.uasset create mode 100644 Content/Vefects/Stylized_Fire/Demo/Stylized_Female_Character_Vexa/Textures/Jacket/T_Vexa_Jacket_Normal.uasset create mode 100644 Content/Vefects/Stylized_Fire/Demo/Stylized_Female_Character_Vexa/Textures/Logo/T_Vefects_Vexa_Custom_Logo_01_Mask.uasset create mode 100644 Content/Vefects/Stylized_Fire/Demo/Stylized_Female_Character_Vexa/Textures/Logo/T_Vefects_Vexa_Custom_Logo_01_Normal.uasset create mode 100644 Content/Vefects/Stylized_Fire/Demo/_Extra/Demo/Extra/Materials/MI_Extra_Frame_01.uasset create mode 100644 Content/Vefects/Stylized_Fire/Demo/_Extra/Demo/Extra/Materials/MI_Extra_Learn_VFX.uasset create mode 100644 Content/Vefects/Stylized_Fire/Demo/_Extra/Demo/Extra/Materials/MI_Extra_Vefects_Book_01.uasset create mode 100644 Content/Vefects/Stylized_Fire/Demo/_Extra/Demo/Extra/Materials/MI_Extra_Vefects_Bundle_01.uasset create mode 100644 Content/Vefects/Stylized_Fire/Demo/_Extra/Demo/Extra/Materials/MI_Extra_Vefects_Bundle_02.uasset create mode 100644 Content/Vefects/Stylized_Fire/Demo/_Extra/Demo/Extra/Materials/MI_Extra_Vefects_Bundle_03.uasset create mode 100644 Content/Vefects/Stylized_Fire/Demo/_Extra/Demo/Extra/Materials/MI_Extra_Vefects_Bundle_04.uasset create mode 100644 Content/Vefects/Stylized_Fire/Demo/_Extra/Demo/Extra/Materials/MI_Extra_Vefects_Bundle_05.uasset create mode 100644 Content/Vefects/Stylized_Fire/Demo/_Extra/Demo/Extra/Materials/MI_Extra_Vefects_Bundle_06.uasset create mode 100644 Content/Vefects/Stylized_Fire/Demo/_Extra/Demo/Extra/Materials/MI_Extra_Vefects_Bundle_07.uasset create mode 100644 Content/Vefects/Stylized_Fire/Demo/_Extra/Demo/Extra/Materials/MI_Extra_Vefects_Bundle_08.uasset create mode 100644 Content/Vefects/Stylized_Fire/Demo/_Extra/Demo/Extra/Materials/MI_Extra_Vefects_Bundle_09.uasset create mode 100644 Content/Vefects/Stylized_Fire/Demo/_Extra/Demo/Extra/Materials/MI_Extra_Vefects_Bundle_10.uasset create mode 100644 Content/Vefects/Stylized_Fire/Demo/_Extra/Demo/Extra/Materials/MI_Extra_Vefects_Bundle_11.uasset create mode 100644 Content/Vefects/Stylized_Fire/Demo/_Extra/Demo/Extra/Materials/MI_Extra_Vefects_Bundle_12.uasset create mode 100644 Content/Vefects/Stylized_Fire/Demo/_Extra/Demo/Extra/Materials/MI_Extra_Vefects_Bundle_13.uasset create mode 100644 Content/Vefects/Stylized_Fire/Demo/_Extra/Demo/Extra/Materials/MI_Extra_Vefects_Bundle_14.uasset create mode 100644 Content/Vefects/Stylized_Fire/Demo/_Extra/Demo/Extra/Materials/MI_Extra_Vefects_Bundle_15.uasset create mode 100644 Content/Vefects/Stylized_Fire/Demo/_Extra/Demo/Extra/Materials/MI_Extra_Vefects_Bundle_Master_01.uasset create mode 100644 Content/Vefects/Stylized_Fire/Demo/_Extra/Demo/Extra/Materials/MI_Opaque_02.uasset create mode 100644 Content/Vefects/Stylized_Fire/Demo/_Extra/Demo/Extra/Materials/MI_Opaque_Dark_01.uasset create mode 100644 Content/Vefects/Stylized_Fire/Demo/_Extra/Demo/Extra/Materials/MI_Opaque_Fresnel_01.uasset create mode 100644 Content/Vefects/Stylized_Fire/Demo/_Extra/Demo/Extra/Materials/MI_Opaque_Fresnel_02.uasset create mode 100644 Content/Vefects/Stylized_Fire/Demo/_Extra/Demo/Extra/Materials/MI_Opaque_Fresnel_03.uasset create mode 100644 Content/Vefects/Stylized_Fire/Demo/_Extra/Demo/Extra/Materials/MI_Opaque_Fresnel_04.uasset create mode 100644 Content/Vefects/Stylized_Fire/Demo/_Extra/Demo/Extra/Materials/MI_Opaque_Fresnel_05.uasset create mode 100644 Content/Vefects/Stylized_Fire/Demo/_Extra/Demo/Extra/Materials/MI_Opaque_Fresnel_06.uasset create mode 100644 Content/Vefects/Stylized_Fire/Demo/_Extra/Demo/Extra/Materials/MI_Opaque_Fresnel_07.uasset create mode 100644 Content/Vefects/Stylized_Fire/Demo/_Extra/Demo/Extra/Materials/MI_Opaque_Fresnel_08.uasset create mode 100644 Content/Vefects/Stylized_Fire/Demo/_Extra/Demo/Extra/Materials/MI_Opaque_Fresnel_09.uasset create mode 100644 Content/Vefects/Stylized_Fire/Demo/_Extra/Demo/Extra/Materials/MI_Text_01.uasset create mode 100644 Content/Vefects/Stylized_Fire/Demo/_Extra/Demo/Extra/Materials/M_Extra_Billboard.uasset create mode 100644 Content/Vefects/Stylized_Fire/Demo/_Extra/Demo/Extra/Materials/M_Extra_Frame.uasset create mode 100644 Content/Vefects/Stylized_Fire/Demo/_Extra/Demo/Extra/Materials/M_Opaque.uasset create mode 100644 Content/Vefects/Stylized_Fire/Demo/_Extra/Demo/Extra/Materials/M_Opaque_Fresnel.uasset create mode 100644 Content/Vefects/Stylized_Fire/Demo/_Extra/Demo/Extra/Materials/M_Text_01.uasset create mode 100644 Content/Vefects/Stylized_Fire/Demo/_Extra/Demo/Extra/SM/SM_Extra_Billboard_01.uasset create mode 100644 Content/Vefects/Stylized_Fire/Demo/_Extra/Demo/Extra/SM/SM_Extra_Billboard_Base_01.uasset create mode 100644 Content/Vefects/Stylized_Fire/Demo/_Extra/Demo/Extra/Textures/T_Learn_VFX.uasset create mode 100644 Content/Vefects/Stylized_Fire/Demo/_Extra/Demo/Extra/Textures/T_Vefects_Anime_Stylized_VFX.uasset create mode 100644 Content/Vefects/Stylized_Fire/Demo/_Extra/Demo/Extra/Textures/T_Vefects_Anime_VFX.uasset create mode 100644 Content/Vefects/Stylized_Fire/Demo/_Extra/Demo/Extra/Textures/T_Vefects_Blood_VFX.uasset create mode 100644 Content/Vefects/Stylized_Fire/Demo/_Extra/Demo/Extra/Textures/T_Vefects_Explosions_VFX.uasset create mode 100644 Content/Vefects/Stylized_Fire/Demo/_Extra/Demo/Extra/Textures/T_Vefects_Flipbook_VFX.uasset create mode 100644 Content/Vefects/Stylized_Fire/Demo/_Extra/Demo/Extra/Textures/T_Vefects_Item_Pickup_VFX.uasset create mode 100644 Content/Vefects/Stylized_Fire/Demo/_Extra/Demo/Extra/Textures/T_Vefects_Loot_VFX.uasset create mode 100644 Content/Vefects/Stylized_Fire/Demo/_Extra/Demo/Extra/Textures/T_Vefects_Realistic_Water_VFX.uasset create mode 100644 Content/Vefects/Stylized_Fire/Demo/_Extra/Demo/Extra/Textures/T_Vefects_Sand_VFX.uasset create mode 100644 Content/Vefects/Stylized_Fire/Demo/_Extra/Demo/Extra/Textures/T_Vefects_Shots_VFX.uasset create mode 100644 Content/Vefects/Stylized_Fire/Demo/_Extra/Demo/Extra/Textures/T_Vefects_Slime_VFX.uasset create mode 100644 Content/Vefects/Stylized_Fire/Demo/_Extra/Demo/Extra/Textures/T_Vefects_Smoke_Bombs_VFX.uasset create mode 100644 Content/Vefects/Stylized_Fire/Demo/_Extra/Demo/Extra/Textures/T_Vefects_Space_VFX.uasset create mode 100644 Content/Vefects/Stylized_Fire/Demo/_Extra/Demo/Extra/Textures/T_Vefects_VFX.uasset create mode 100644 Content/Vefects/Stylized_Fire/Demo/_Extra/Demo/Extra/Textures/T_Vefects_VFX_Book.uasset create mode 100644 Content/Vefects/Stylized_Fire/Demo/_Extra/Demo/Extra/Textures/T_Vefects_VFX_Mega_Bundle.uasset create mode 100644 Content/Vefects/Stylized_Fire/Demo/_Extra/Demo/Extra/Textures/T_Vefects_Vignette_VFX.uasset create mode 100644 Content/Vefects/Stylized_Fire/Demo/_Extra/Maps/Extra.umap create mode 100644 Content/Vefects/Stylized_Fire/Demo/_Extra/Maps/LearnVFX.umap create mode 100644 Content/Vefects/Stylized_Fire/Maps/Stylized_Fire_Overview.umap create mode 100644 Content/Vefects/Stylized_Fire/Maps/Stylized_Fire_Overview_BuiltData.uasset create mode 100644 Content/Vefects/Stylized_Fire/Maps/Stylized_Fire_Overview_Stack.umap create mode 100644 Content/Vefects/Stylized_Fire/Maps/Stylized_Fire_Overview_Stack_BuiltData.uasset create mode 100644 Content/Vefects/Stylized_Fire/Maps/Stylized_Fire_Overview_Stack_Radial.umap create mode 100644 Content/Vefects/Stylized_Fire/Maps/Stylized_Fire_Tests.umap create mode 100644 Content/Vefects/Stylized_Fire/VFX/Dark/Particles/NS_Stylized_Fire_01_Dark.uasset create mode 100644 Content/Vefects/Stylized_Fire/VFX/Dark/Particles/NS_Stylized_Fire_02_Dark.uasset create mode 100644 Content/Vefects/Stylized_Fire/VFX/Dark/Particles/NS_Stylized_Fire_Radial_01_Dark.uasset create mode 100644 Content/Vefects/Stylized_Fire/VFX/Dark/Particles/NS_Stylized_Fire_Radial_02_Dark.uasset create mode 100644 Content/Vefects/Stylized_Fire/VFX/Electric/Materials/MI_VFX_Stylized_Fire_01_Electric.uasset create mode 100644 Content/Vefects/Stylized_Fire/VFX/Electric/Materials/MI_VFX_Stylized_Fire_02_Electric.uasset create mode 100644 Content/Vefects/Stylized_Fire/VFX/Electric/Materials/MI_VFX_Stylized_Fire_Radial_01_Electric.uasset create mode 100644 Content/Vefects/Stylized_Fire/VFX/Electric/Materials/MI_VFX_Stylized_Fire_Radial_02_Electric.uasset create mode 100644 Content/Vefects/Stylized_Fire/VFX/Electric/Particles/NS_Stylized_Fire_01_Electric.uasset create mode 100644 Content/Vefects/Stylized_Fire/VFX/Electric/Particles/NS_Stylized_Fire_02_Electric.uasset create mode 100644 Content/Vefects/Stylized_Fire/VFX/Electric/Particles/NS_Stylized_Fire_Radial_01_Electric.uasset create mode 100644 Content/Vefects/Stylized_Fire/VFX/Electric/Particles/NS_Stylized_Fire_Radial_02_Electric.uasset create mode 100644 Content/Vefects/Stylized_Fire/VFX/Ethereal/Materials/MI_VFX_Stylized_Fire_01_Ethereal.uasset create mode 100644 Content/Vefects/Stylized_Fire/VFX/Ethereal/Materials/MI_VFX_Stylized_Fire_02_Ethereal.uasset create mode 100644 Content/Vefects/Stylized_Fire/VFX/Ethereal/Materials/MI_VFX_Stylized_Fire_Radial_01_Ethereal.uasset create mode 100644 Content/Vefects/Stylized_Fire/VFX/Ethereal/Materials/MI_VFX_Stylized_Fire_Radial_02_Ethereal.uasset create mode 100644 Content/Vefects/Stylized_Fire/VFX/Ethereal/Particles/NS_Stylized_Fire_01_Ethereal.uasset create mode 100644 Content/Vefects/Stylized_Fire/VFX/Ethereal/Particles/NS_Stylized_Fire_02_Ethereal.uasset create mode 100644 Content/Vefects/Stylized_Fire/VFX/Ethereal/Particles/NS_Stylized_Fire_Radial_01_Ethereal.uasset create mode 100644 Content/Vefects/Stylized_Fire/VFX/Ethereal/Particles/NS_Stylized_Fire_Radial_02_Ethereal.uasset create mode 100644 Content/Vefects/Stylized_Fire/VFX/Flames/Materials/MI_VFX_Stylized_Fire_01.uasset create mode 100644 Content/Vefects/Stylized_Fire/VFX/Flames/Materials/MI_VFX_Stylized_Fire_01_DF.uasset create mode 100644 Content/Vefects/Stylized_Fire/VFX/Flames/Materials/MI_VFX_Stylized_Fire_02.uasset create mode 100644 Content/Vefects/Stylized_Fire/VFX/Flames/Materials/MI_VFX_Stylized_Fire_Radial_01.uasset create mode 100644 Content/Vefects/Stylized_Fire/VFX/Flames/Materials/MI_VFX_Stylized_Fire_Radial_02.uasset create mode 100644 Content/Vefects/Stylized_Fire/VFX/Flames/Particles/NS_Stylized_Fire_01.uasset create mode 100644 Content/Vefects/Stylized_Fire/VFX/Flames/Particles/NS_Stylized_Fire_01_Infinite.uasset create mode 100644 Content/Vefects/Stylized_Fire/VFX/Flames/Particles/NS_Stylized_Fire_01_Once.uasset create mode 100644 Content/Vefects/Stylized_Fire/VFX/Flames/Particles/NS_Stylized_Fire_02.uasset create mode 100644 Content/Vefects/Stylized_Fire/VFX/Flames/Particles/NS_Stylized_Fire_02_Infinite.uasset create mode 100644 Content/Vefects/Stylized_Fire/VFX/Flames/Particles/NS_Stylized_Fire_02_Once.uasset create mode 100644 Content/Vefects/Stylized_Fire/VFX/Flames/Particles/NS_Stylized_Fire_Large_01.uasset create mode 100644 Content/Vefects/Stylized_Fire/VFX/Flames/Particles/NS_Stylized_Fire_Radial_01.uasset create mode 100644 Content/Vefects/Stylized_Fire/VFX/Flames/Particles/NS_Stylized_Fire_Radial_02.uasset create mode 100644 Content/Vefects/Stylized_Fire/VFX/Mystic/Materials/MI_VFX_Stylized_Fire_01_Mystic.uasset create mode 100644 Content/Vefects/Stylized_Fire/VFX/Mystic/Materials/MI_VFX_Stylized_Fire_02_Mystic.uasset create mode 100644 Content/Vefects/Stylized_Fire/VFX/Mystic/Materials/MI_VFX_Stylized_Fire_Radial_01_Mystic.uasset create mode 100644 Content/Vefects/Stylized_Fire/VFX/Mystic/Materials/MI_VFX_Stylized_Fire_Radial_02_Mystic.uasset create mode 100644 Content/Vefects/Stylized_Fire/VFX/Mystic/Particles/NS_Stylized_Fire_01_Mystic.uasset create mode 100644 Content/Vefects/Stylized_Fire/VFX/Mystic/Particles/NS_Stylized_Fire_02_Mystic.uasset create mode 100644 Content/Vefects/Stylized_Fire/VFX/Mystic/Particles/NS_Stylized_Fire_Radial_01_Mystic.uasset create mode 100644 Content/Vefects/Stylized_Fire/VFX/Mystic/Particles/NS_Stylized_Fire_Radial_02_Mystic.uasset create mode 100644 Content/Vefects/Stylized_Fire/VFX/Poison/Materials/MI_VFX_Stylized_Fire_01_Poison.uasset create mode 100644 Content/Vefects/Stylized_Fire/VFX/Poison/Materials/MI_VFX_Stylized_Fire_02_Poison.uasset create mode 100644 Content/Vefects/Stylized_Fire/VFX/Poison/Materials/MI_VFX_Stylized_Fire_Radial_01_Poison.uasset create mode 100644 Content/Vefects/Stylized_Fire/VFX/Poison/Materials/MI_VFX_Stylized_Fire_Radial_02_Poison.uasset create mode 100644 Content/Vefects/Stylized_Fire/VFX/Poison/Particles/NS_Stylized_Fire_01_Poison.uasset create mode 100644 Content/Vefects/Stylized_Fire/VFX/Poison/Particles/NS_Stylized_Fire_02_Poison.uasset create mode 100644 Content/Vefects/Stylized_Fire/VFX/Poison/Particles/NS_Stylized_Fire_Radial_01_Poison.uasset create mode 100644 Content/Vefects/Stylized_Fire/VFX/Poison/Particles/NS_Stylized_Fire_Radial_02_Poison.uasset create mode 100644 Content/Vefects/Stylized_Fire/VFX/Pure/Particles/NS_Stylized_Fire_01_Pure.uasset create mode 100644 Content/Vefects/Stylized_Fire/VFX/Pure/Particles/NS_Stylized_Fire_02_Pure.uasset create mode 100644 Content/Vefects/Stylized_Fire/VFX/Pure/Particles/NS_Stylized_Fire_Radial_01_Pure.uasset create mode 100644 Content/Vefects/Stylized_Fire/VFX/Pure/Particles/NS_Stylized_Fire_Radial_02_Pure.uasset create mode 100644 Content/Vefects/Stylized_Fire/VFX/Rainbow/Materials/MI_VFX_Stylized_Fire_01_Rainbow.uasset create mode 100644 Content/Vefects/Stylized_Fire/VFX/Rainbow/Materials/MI_VFX_Stylized_Fire_02_Rainbow.uasset create mode 100644 Content/Vefects/Stylized_Fire/VFX/Rainbow/Materials/MI_VFX_Stylized_Fire_Radial_01_Rainbow.uasset create mode 100644 Content/Vefects/Stylized_Fire/VFX/Rainbow/Materials/MI_VFX_Stylized_Fire_Radial_02_Rainbow.uasset create mode 100644 Content/Vefects/Stylized_Fire/VFX/Rainbow/Particles/NS_Stylized_Fire_01_Rainbow.uasset create mode 100644 Content/Vefects/Stylized_Fire/VFX/Rainbow/Particles/NS_Stylized_Fire_02_Rainbow.uasset create mode 100644 Content/Vefects/Stylized_Fire/VFX/Rainbow/Particles/NS_Stylized_Fire_Radial_01_Rainbow.uasset create mode 100644 Content/Vefects/Stylized_Fire/VFX/Rainbow/Particles/NS_Stylized_Fire_Radial_02_Rainbow.uasset create mode 100644 Content/Vefects/Stylized_Fire/VFX/Shared/Materials/MI_VFX_Render_Particles_On_Top_Always_01.uasset create mode 100644 Content/Vefects/Stylized_Fire/VFX/Shared/Materials/MI_VFX_Render_Particles_On_Top_Always_02.uasset create mode 100644 Content/Vefects/Stylized_Fire/VFX/Shared/Materials/MI_VFX_Render_Particles_On_Top_Always_02_Wrong.uasset create mode 100644 Content/Vefects/Stylized_Fire/VFX/Shared/Materials/MI_VFX_Render_Particles_On_Top_Always_Wrong_01.uasset create mode 100644 Content/Vefects/Stylized_Fire/VFX/Shared/Materials/MI_VFX_Stylized_Fire_01_GS.uasset create mode 100644 Content/Vefects/Stylized_Fire/VFX/Shared/Materials/MI_VFX_Stylized_Fire_02_GS.uasset create mode 100644 Content/Vefects/Stylized_Fire/VFX/Shared/Materials/MI_VFX_Stylized_Fire_Radial_01_GS.uasset create mode 100644 Content/Vefects/Stylized_Fire/VFX/Shared/Materials/MI_VFX_Stylized_Fire_Radial_02_GS.uasset create mode 100644 Content/Vefects/Stylized_Fire/VFX/Shared/Materials/MI_VFX_Stylized_Fire_Radial_02_GS_02.uasset create mode 100644 Content/Vefects/Stylized_Fire/VFX/Shared/Materials/M_VFX_Render_Particles_On_Top_Always.uasset create mode 100644 Content/Vefects/Stylized_Fire/VFX/Shared/Materials/M_VFX_Render_Particles_On_Top_Always_Wrong.uasset create mode 100644 Content/Vefects/Stylized_Fire/VFX/Shared/Materials/M_VFX_Stylized_Fire_01.uasset create mode 100644 Content/Vefects/Stylized_Fire/VFX/Shared/Materials/M_VFX_Stylized_Fire_Radial_01.uasset create mode 100644 Content/Vefects/Stylized_Fire/VFX/Shared/Particles/NE_Stylized_Fire_00.uasset create mode 100644 Content/Vefects/Stylized_Fire/VFX/Shared/Textures/LUTs/T_VFX_LUT_Blood_01.uasset create mode 100644 Content/Vefects/Stylized_Fire/VFX/Shared/Textures/LUTs/T_VFX_LUT_Blood_01_Mirrored.uasset create mode 100644 Content/Vefects/Stylized_Fire/VFX/Shared/Textures/LUTs/T_VFX_LUT_Blood_02.uasset create mode 100644 Content/Vefects/Stylized_Fire/VFX/Shared/Textures/LUTs/T_VFX_LUT_Blood_03.uasset create mode 100644 Content/Vefects/Stylized_Fire/VFX/Shared/Textures/LUTs/T_VFX_LUT_Blood_03_Mirrored.uasset create mode 100644 Content/Vefects/Stylized_Fire/VFX/Shared/Textures/LUTs/T_VFX_LUT_Candy_01.uasset create mode 100644 Content/Vefects/Stylized_Fire/VFX/Shared/Textures/LUTs/T_VFX_LUT_Candy_01_Mirrored.uasset create mode 100644 Content/Vefects/Stylized_Fire/VFX/Shared/Textures/LUTs/T_VFX_LUT_Electric_01.uasset create mode 100644 Content/Vefects/Stylized_Fire/VFX/Shared/Textures/LUTs/T_VFX_LUT_Fail_01.uasset create mode 100644 Content/Vefects/Stylized_Fire/VFX/Shared/Textures/LUTs/T_VFX_LUT_Fail_02.uasset create mode 100644 Content/Vefects/Stylized_Fire/VFX/Shared/Textures/LUTs/T_VFX_LUT_Fire_01.uasset create mode 100644 Content/Vefects/Stylized_Fire/VFX/Shared/Textures/LUTs/T_VFX_LUT_Fire_01_Mirrored.uasset create mode 100644 Content/Vefects/Stylized_Fire/VFX/Shared/Textures/LUTs/T_VFX_LUT_Fire_02.uasset create mode 100644 Content/Vefects/Stylized_Fire/VFX/Shared/Textures/LUTs/T_VFX_LUT_Fire_03.uasset create mode 100644 Content/Vefects/Stylized_Fire/VFX/Shared/Textures/LUTs/T_VFX_LUT_Flame_Example_01.uasset create mode 100644 Content/Vefects/Stylized_Fire/VFX/Shared/Textures/LUTs/T_VFX_LUT_GS_01.uasset create mode 100644 Content/Vefects/Stylized_Fire/VFX/Shared/Textures/LUTs/T_VFX_LUT_GS_01_Mirrored.uasset create mode 100644 Content/Vefects/Stylized_Fire/VFX/Shared/Textures/LUTs/T_VFX_LUT_GS_02.uasset create mode 100644 Content/Vefects/Stylized_Fire/VFX/Shared/Textures/LUTs/T_VFX_LUT_GS_02_Mirrored.uasset create mode 100644 Content/Vefects/Stylized_Fire/VFX/Shared/Textures/LUTs/T_VFX_LUT_Light_01.uasset create mode 100644 Content/Vefects/Stylized_Fire/VFX/Shared/Textures/LUTs/T_VFX_LUT_Light_01_Mirrored.uasset create mode 100644 Content/Vefects/Stylized_Fire/VFX/Shared/Textures/LUTs/T_VFX_LUT_Nature_01.uasset create mode 100644 Content/Vefects/Stylized_Fire/VFX/Shared/Textures/LUTs/T_VFX_LUT_Nature_01_Mirrored.uasset create mode 100644 Content/Vefects/Stylized_Fire/VFX/Shared/Textures/LUTs/T_VFX_LUT_Night_01.uasset create mode 100644 Content/Vefects/Stylized_Fire/VFX/Shared/Textures/LUTs/T_VFX_LUT_Night_01_Inverted.uasset create mode 100644 Content/Vefects/Stylized_Fire/VFX/Shared/Textures/LUTs/T_VFX_LUT_Night_01_Mirrored.uasset create mode 100644 Content/Vefects/Stylized_Fire/VFX/Shared/Textures/LUTs/T_VFX_LUT_Rainbow_Desaturated_01.uasset create mode 100644 Content/Vefects/Stylized_Fire/VFX/Shared/Textures/LUTs/T_VFX_LUT_Rainbow_Desaturated_01_Mirrored.uasset create mode 100644 Content/Vefects/Stylized_Fire/VFX/Shared/Textures/LUTs/T_VFX_LUT_Water_01.uasset create mode 100644 Content/Vefects/Stylized_Fire/VFX/Shared/Textures/LUTs/T_VFX_LUT_Water_01_Mirrored.uasset create mode 100644 Content/Vefects/Stylized_Fire/VFX/Shared/Textures/T_VFX_Lens_Flare_01.uasset create mode 100644 Content/Vefects/Stylized_Fire/VFX/Shared/Textures/T_VFX_Lens_Flares_Random_01.uasset create mode 100644 Content/Vefects/Stylized_Fire/VFX/Shared/Textures/T_VFX_Perlin_01.uasset create mode 100644 Content/Vefects/Stylized_Fire/VFX/Shared/Textures/T_VFX_Perlin_01_N.uasset create mode 100644 Content/Vefects/Stylized_Fire/VFX/Shared/Textures/T_VFX_Perlin_02.uasset create mode 100644 Content/Vefects/Stylized_Fire/VFX/Shared/Textures/T_VFX_Perlin_02_N.uasset create mode 100644 Content/Vefects/Stylized_Fire/VFX/Shared/Textures/T_VFX_Stylized_Fire_Masks_Packed_01.uasset create mode 100644 Content/Vefects/Stylized_Fire/VFX/Shared/Textures/T_VFX_Stylized_Fire_Masks_Packed_02.uasset create mode 100644 Content/Vefects/Stylized_Fire/VFX/Shared/Textures/T_VFX_Stylized_Fire_Masks_Packed_03.uasset create mode 100644 Content/Vefects/Stylized_Fire/VFX/Shared/Textures/T_VFX_Stylized_Fire_Masks_Packed_04.uasset create mode 100644 Content/Vefects/Stylized_Fire/VFX/Shared/Textures/T_VFX_Stylized_Fire_Masks_Packed_05.uasset create mode 100644 Content/Vefects/Stylized_Fire/VFX/Shared/Textures/T_VFX_Stylized_Fire_Masks_Packed_06.uasset create mode 100644 Content/Vefects/Stylized_Fire/VFX/Shared/Textures/T_VFX_Stylized_Fire_Masks_Packed_07.uasset create mode 100644 Content/Vefects/Stylized_Fire/VFX/Shared/Textures/T_VFX_Stylized_Fire_Swirls_Packed_01.uasset create mode 100644 Content/Vefects/Stylized_Fire/VFX/Shared/Textures/T_VFX_Stylized_Fire_Swirls_Packed_01_HD.uasset create mode 100644 Content/Vefects/Stylized_Fire/VFX/Water/Materials/MI_VFX_Stylized_Fire_01_Water.uasset create mode 100644 Content/Vefects/Stylized_Fire/VFX/Water/Materials/MI_VFX_Stylized_Fire_02_Water.uasset create mode 100644 Content/Vefects/Stylized_Fire/VFX/Water/Materials/MI_VFX_Stylized_Fire_Radial_01_Water.uasset create mode 100644 Content/Vefects/Stylized_Fire/VFX/Water/Materials/MI_VFX_Stylized_Fire_Radial_02_Water.uasset create mode 100644 Content/Vefects/Stylized_Fire/VFX/Water/Particles/NS_Stylized_Fire_01_Water.uasset create mode 100644 Content/Vefects/Stylized_Fire/VFX/Water/Particles/NS_Stylized_Fire_02_Water.uasset create mode 100644 Content/Vefects/Stylized_Fire/VFX/Water/Particles/NS_Stylized_Fire_Radial_01_Water.uasset create mode 100644 Content/Vefects/Stylized_Fire/VFX/Water/Particles/NS_Stylized_Fire_Radial_02_Water.uasset create mode 100644 Plugins/IconStudio/IconStudio.uplugin create mode 100644 Plugins/IconStudio/Source/IconStudio/IconStudio.Build.cs create mode 100644 Plugins/IconStudio/Source/IconStudio/Private/IconStudioModule.cpp create mode 100644 Plugins/IconStudio/Source/IconStudio/Private/IconStudioPreset.cpp create mode 100644 Plugins/IconStudio/Source/IconStudio/Private/IconStudioRenderer.cpp create mode 100644 Plugins/IconStudio/Source/IconStudio/Private/IconStudioSession.cpp create mode 100644 Plugins/IconStudio/Source/IconStudio/Private/IconStudioSettings.cpp create mode 100644 Plugins/IconStudio/Source/IconStudio/Private/IconStudioSubsystem.cpp create mode 100644 Plugins/IconStudio/Source/IconStudio/Private/SIconStudioTab.cpp create mode 100644 Plugins/IconStudio/Source/IconStudio/Private/SIconStudioTab.h create mode 100644 Plugins/IconStudio/Source/IconStudio/Public/IconStudioPreset.h create mode 100644 Plugins/IconStudio/Source/IconStudio/Public/IconStudioRenderer.h create mode 100644 Plugins/IconStudio/Source/IconStudio/Public/IconStudioSession.h create mode 100644 Plugins/IconStudio/Source/IconStudio/Public/IconStudioSettings.h create mode 100644 Plugins/IconStudio/Source/IconStudio/Public/IconStudioSubsystem.h create mode 100644 Plugins/IconStudio/Source/IconStudio/Public/IconStudioTypes.h create mode 100644 Source/Survival_projet/Private/CookingStation.cpp create mode 100644 Source/Survival_projet/Private/CraftingStation.cpp create mode 100644 Source/Survival_projet/Private/ItemDataAsset.cpp create mode 100644 Source/Survival_projet/Public/CookingStation.h create mode 100644 Source/Survival_projet/Public/CraftingStation.h diff --git a/Config/DefaultEngine.ini b/Config/DefaultEngine.ini index f3c4908..cb19120 100644 --- a/Config/DefaultEngine.ini +++ b/Config/DefaultEngine.ini @@ -3,7 +3,7 @@ [/Script/EngineSettings.GameMapsSettings] GameDefaultMap=/Game/Game/Maps/MenuScene.MenuScene GlobalDefaultGameMode=/Game/Game/GameMode/GM_FpsPlayer.GM_FpsPlayer_C -EditorStartupMap=/Game/Game/Maps/GameScene.GameScene +EditorStartupMap=/Game/Game/Maps/Dev/Dev_Scene.Dev_Scene GameInstanceClass=/Game/Game/Game-Instance/BP_SurvivalGameInstance.BP_SurvivalGameInstance_C [/Script/Engine.RendererSettings] diff --git a/Content/EditorTools/DA_IconPreset_Default.uasset b/Content/EditorTools/DA_IconPreset_Default.uasset new file mode 100644 index 0000000..a980682 --- /dev/null +++ b/Content/EditorTools/DA_IconPreset_Default.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:9317549a0d65e5e13b3f4bf7caefeb5a50cef3f119aedb39374fbb48f8c7fc71 +size 1375 diff --git a/Content/Game/3d/Building/Table/M_Table.uasset b/Content/Game/3d/Building/Table/M_Table.uasset new file mode 100644 index 0000000..eb1bfe5 --- /dev/null +++ b/Content/Game/3d/Building/Table/M_Table.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:2d5a89baeccc0d919133c80844cc3a94404a645ed756d0d5501e40bd2af8a2a3 +size 64195 diff --git a/Content/Game/3d/Building/Table/Table_FBX.uasset b/Content/Game/3d/Building/Table/Table_FBX.uasset new file mode 100644 index 0000000..af51515 --- /dev/null +++ b/Content/Game/3d/Building/Table/Table_FBX.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:1dc1f30bf0efa854b56f2798ce6cd8df2fb61b53e50de2119da2b7c0303e5536 +size 101276 diff --git a/Content/Game/3d/Building/Table/textures/M_table_Metal.uasset b/Content/Game/3d/Building/Table/textures/M_table_Metal.uasset new file mode 100644 index 0000000..6c00e76 --- /dev/null +++ b/Content/Game/3d/Building/Table/textures/M_table_Metal.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:d0efaef294667e4013fb8c1f809abf656383e2dad83ef18a0fd39bfb4dc8984d +size 156355 diff --git a/Content/Game/3d/Building/Table/textures/M_table_Normal.uasset b/Content/Game/3d/Building/Table/textures/M_table_Normal.uasset new file mode 100644 index 0000000..348c43f --- /dev/null +++ b/Content/Game/3d/Building/Table/textures/M_table_Normal.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:fb7ad906eabd7ffb362cd2c1593ea1fb2991d288be7ae44ba92ddb2fb2dcc88f +size 4194725 diff --git a/Content/Game/3d/Building/Table/textures/M_table_Roughness.uasset b/Content/Game/3d/Building/Table/textures/M_table_Roughness.uasset new file mode 100644 index 0000000..9c75c35 --- /dev/null +++ b/Content/Game/3d/Building/Table/textures/M_table_Roughness.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:69cb64b5dc64916ad3ccbb1b0c3246ea43df7c57a492cd2477645e4aa044c28c +size 347329 diff --git a/Content/Game/3d/Building/Table/textures/M_table_albedo.uasset b/Content/Game/3d/Building/Table/textures/M_table_albedo.uasset new file mode 100644 index 0000000..9649bab --- /dev/null +++ b/Content/Game/3d/Building/Table/textures/M_table_albedo.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:de91e2cb3b79378c3310e973bbe60a2a8df071a68d63e01c539f258b10508cfb +size 1055768 diff --git a/Content/Game/3d/Building/Table/textures/M_table_albedo_Mat.uasset b/Content/Game/3d/Building/Table/textures/M_table_albedo_Mat.uasset new file mode 100644 index 0000000..8aa38a7 --- /dev/null +++ b/Content/Game/3d/Building/Table/textures/M_table_albedo_Mat.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:1419ed01f134edb93756a21783ed227467f488f5faaaef5abcd3191125ba97c6 +size 17019 diff --git a/Content/Game/3d/Cooking/Campfire_Logs.uasset b/Content/Game/3d/Cooking/Campfire_Logs.uasset new file mode 100644 index 0000000..fa13362 --- /dev/null +++ b/Content/Game/3d/Cooking/Campfire_Logs.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:98f2574aa42c98f6a332ecbd76a44c2efacfc1f551882a22298d1036af76e870 +size 90408 diff --git a/Content/Game/3d/Cooking/Campfire_Logs_001.uasset b/Content/Game/3d/Cooking/Campfire_Logs_001.uasset new file mode 100644 index 0000000..8605127 --- /dev/null +++ b/Content/Game/3d/Cooking/Campfire_Logs_001.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:6294322ac2fc4e95df051913e7fc4948a4ebbbc77e7dfed440f3a88a232b5a15 +size 87088 diff --git a/Content/Game/3d/Cooking/Campfire_Logs_002.uasset b/Content/Game/3d/Cooking/Campfire_Logs_002.uasset new file mode 100644 index 0000000..20821ef --- /dev/null +++ b/Content/Game/3d/Cooking/Campfire_Logs_002.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:caba120cfd6d857346a2f0a8e3d3388bee91358385fec93828a8c54a5aade5e3 +size 86617 diff --git a/Content/Game/3d/Cooking/Campfire_Logs_003.uasset b/Content/Game/3d/Cooking/Campfire_Logs_003.uasset new file mode 100644 index 0000000..b1e5012 --- /dev/null +++ b/Content/Game/3d/Cooking/Campfire_Logs_003.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:b576f58d924593916fb474e7a05fabc5b7896b0c0c409d1ee12586968580899e +size 87221 diff --git a/Content/Game/3d/Cooking/LogS.uasset b/Content/Game/3d/Cooking/LogS.uasset new file mode 100644 index 0000000..dca4ef0 --- /dev/null +++ b/Content/Game/3d/Cooking/LogS.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:6bd883f0d853853987a395145f0eed109d754700c7a8b4a80cff6b6cb5bc29d2 +size 86230 diff --git a/Content/Game/3d/Cooking/Logs1.uasset b/Content/Game/3d/Cooking/Logs1.uasset new file mode 100644 index 0000000..71b40ec --- /dev/null +++ b/Content/Game/3d/Cooking/Logs1.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:ba3e90512fc42102c15a11c27bf858861d1a61c23c9d30288ff6d1e03c7a34c2 +size 86597 diff --git a/Content/Game/3d/Cooking/Rocks_003.uasset b/Content/Game/3d/Cooking/Rocks_003.uasset new file mode 100644 index 0000000..0161cf9 --- /dev/null +++ b/Content/Game/3d/Cooking/Rocks_003.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:00fcef0bb07b3be552bc8a0b73f3a03589834838afa9e2981671605cb9c4f03a +size 65334 diff --git a/Content/Game/3d/Cooking/Wood_004.uasset b/Content/Game/3d/Cooking/Wood_004.uasset new file mode 100644 index 0000000..5a5df13 --- /dev/null +++ b/Content/Game/3d/Cooking/Wood_004.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:aadce4e6c2e335d93449cf4b4093f672cfea58590df36020d61de475cece79be +size 64559 diff --git a/Content/Game/3d/Cooking/Wood_light_001.uasset b/Content/Game/3d/Cooking/Wood_light_001.uasset new file mode 100644 index 0000000..3b71b5c --- /dev/null +++ b/Content/Game/3d/Cooking/Wood_light_001.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:f2e839629e533283cff4dd1ebb15bc6e0f311c0465e5bcf1fdeb529d8cb955c9 +size 63496 diff --git a/Content/Game/Animation/Fps/Armor_Fur_mat.uasset b/Content/Game/Animation/Fps/Armor_Fur_mat.uasset new file mode 100644 index 0000000..3904607 --- /dev/null +++ b/Content/Game/Animation/Fps/Armor_Fur_mat.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:6ab0269e99d8e5e7179f7fed27abc2a0b85423dd5c4b09b87f116f56ec77e3c7 +size 61450 diff --git a/Content/Game/Animation/Fps/Armor_Upper_mat.uasset b/Content/Game/Animation/Fps/Armor_Upper_mat.uasset new file mode 100644 index 0000000..5ae49e7 --- /dev/null +++ b/Content/Game/Animation/Fps/Armor_Upper_mat.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:c76563f24e8b50a5b1123d596df351eee1f6a28da3e948884dcf02c9c46d648e +size 61484 diff --git a/Content/Game/Animation/Fps/BasePose__2_.uasset b/Content/Game/Animation/Fps/BasePose__2_.uasset new file mode 100644 index 0000000..348fe5c --- /dev/null +++ b/Content/Game/Animation/Fps/BasePose__2_.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:a25d6616f50e8ed026d08f9f487d874f1371aeeccd5ad149eb1a46a8127f4ae0 +size 4888213 diff --git a/Content/Game/Animation/Fps/BasePose__2__Anim.uasset b/Content/Game/Animation/Fps/BasePose__2__Anim.uasset new file mode 100644 index 0000000..323c41a --- /dev/null +++ b/Content/Game/Animation/Fps/BasePose__2__Anim.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:4c5fcd7af8da287e23fab18651f49176a095414a23271a2a9e950aa7cc21f45e +size 411834 diff --git a/Content/Game/Animation/Fps/BasePose__2__PhysicsAsset.uasset b/Content/Game/Animation/Fps/BasePose__2__PhysicsAsset.uasset new file mode 100644 index 0000000..2f6a86f --- /dev/null +++ b/Content/Game/Animation/Fps/BasePose__2__PhysicsAsset.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:c672dce24656db511bb153521b44c6dcf918b5021261459e7976543e16bbaae1 +size 11028 diff --git a/Content/Game/Animation/Fps/BasePose__2__Skeleton.uasset b/Content/Game/Animation/Fps/BasePose__2__Skeleton.uasset new file mode 100644 index 0000000..c080a80 --- /dev/null +++ b/Content/Game/Animation/Fps/BasePose__2__Skeleton.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:3a7de911125531c5a58fc4f87bd9a359ae9dc8f2d21ca11ac978ec559051cc43 +size 29645 diff --git a/Content/Game/Animation/Fps/GrabItem.uasset b/Content/Game/Animation/Fps/GrabItem.uasset new file mode 100644 index 0000000..c9090cc --- /dev/null +++ b/Content/Game/Animation/Fps/GrabItem.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:dfc7bb305b3f317fdfa1b42fcbe60ee546f00e7a9ed7ab929116ee28e2ae8f21 +size 418198 diff --git a/Content/Game/Animation/Fps/MaleBody_M.uasset b/Content/Game/Animation/Fps/MaleBody_M.uasset new file mode 100644 index 0000000..f06347f --- /dev/null +++ b/Content/Game/Animation/Fps/MaleBody_M.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:2645ae3ad17dc491b6b0334f2641fabd48c2ae5366071a9c9f3b45206e30cd34 +size 62565 diff --git a/Content/Game/Animation/Fps/Run_NoItem.uasset b/Content/Game/Animation/Fps/Run_NoItem.uasset new file mode 100644 index 0000000..3b83965 --- /dev/null +++ b/Content/Game/Animation/Fps/Run_NoItem.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:b058c7094cc99b7682baa4924d12dba67811baffa6b7f67d53b3f18b33e117fa +size 441628 diff --git a/Content/Game/Animation/Fps/lambert3.uasset b/Content/Game/Animation/Fps/lambert3.uasset new file mode 100644 index 0000000..7cf9567 --- /dev/null +++ b/Content/Game/Animation/Fps/lambert3.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:97d7b3a841f88ab3ccee7a4668887fca551a9649866c29d5141dc86633c679c9 +size 62153 diff --git a/Content/Game/Animation/Fps/lambert4.uasset b/Content/Game/Animation/Fps/lambert4.uasset new file mode 100644 index 0000000..00d6dd7 --- /dev/null +++ b/Content/Game/Animation/Fps/lambert4.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:d2d9ab871b1dff347d636b6d1cf69511fcb9c6ba5e464abb07bed93a252da3d8 +size 62153 diff --git a/Content/Game/Building/Cooking/BP_Campfire.uasset b/Content/Game/Building/Cooking/BP_Campfire.uasset new file mode 100644 index 0000000..2171f7f --- /dev/null +++ b/Content/Game/Building/Cooking/BP_Campfire.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:c2c06d154ec95ab5e5ea310c7aa480e2f52bd4ed3e9f9de22c145ad55dad384c +size 42014 diff --git a/Content/Game/Building/Crafting/BP_Workbench.uasset b/Content/Game/Building/Crafting/BP_Workbench.uasset new file mode 100644 index 0000000..e69efd6 --- /dev/null +++ b/Content/Game/Building/Crafting/BP_Workbench.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:69107449a25f5bef9ede7b93dce4191bf95250fae82f92774239cc6a6cac695b +size 34117 diff --git a/Content/Game/Data/Crafting/DA_Craft_Test_Branche.uasset b/Content/Game/Data/Crafting/DA_Craft_Test_Branche.uasset index 1238d45..55ff4af 100644 --- a/Content/Game/Data/Crafting/DA_Craft_Test_Branche.uasset +++ b/Content/Game/Data/Crafting/DA_Craft_Test_Branche.uasset @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:5c0618f5a33ad05efac6eb02816046922b073eb8000fa7f608e9a2ef5ce54078 -size 2117 +oid sha256:99154d988c33328b288aa1785ec67eb48d8231369fb62d80fa4b80dadf9bb724 +size 2135 diff --git a/Content/Game/Data/Crafting/DA_RecipeBook.uasset b/Content/Game/Data/Crafting/DA_RecipeBook.uasset index f9de246..36464ca 100644 --- a/Content/Game/Data/Crafting/DA_RecipeBook.uasset +++ b/Content/Game/Data/Crafting/DA_RecipeBook.uasset @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:c8eadcfdd73f6507cb2c697e2e716bc216fbf9798c015457602b409da60225ba -size 1612 +oid sha256:d0466b67c9dce61d9593d5b312ff4f714d783be20ca35a665bbe31281d8f17ea +size 1959 diff --git a/Content/Game/Data/Crafting/Tools/Stone/DA_Craft_Stone_Axe.uasset b/Content/Game/Data/Crafting/Tools/Stone/DA_Craft_Stone_Axe.uasset new file mode 100644 index 0000000..cb32bb3 --- /dev/null +++ b/Content/Game/Data/Crafting/Tools/Stone/DA_Craft_Stone_Axe.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:66015a6ef389ef656847b896425689e794321bd9e47aa893bd99ca13c6463083 +size 2549 diff --git a/Content/Game/Data/Crafting/Tools/Wood/DA_Craft_Wood_Axe.uasset b/Content/Game/Data/Crafting/Tools/Wood/DA_Craft_Wood_Axe.uasset new file mode 100644 index 0000000..abed5fa --- /dev/null +++ b/Content/Game/Data/Crafting/Tools/Wood/DA_Craft_Wood_Axe.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:1c298e5cfcd43870c225b3ff2957ca3965d027b6963d2d63d24d554ca65fe728 +size 2129 diff --git a/Content/Game/Data/Item/DA_Branch.uasset b/Content/Game/Data/Item/DA_Branch.uasset deleted file mode 100644 index 2228ed4..0000000 --- a/Content/Game/Data/Item/DA_Branch.uasset +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:cf1180e8f2ef03f520963334638c26b86f851b42a235408a8f4210be2f2ca144 -size 2416 diff --git a/Content/Game/Data/Item/DA_RawMeat.uasset b/Content/Game/Data/Item/DA_RawMeat.uasset new file mode 100644 index 0000000..0be2541 --- /dev/null +++ b/Content/Game/Data/Item/DA_RawMeat.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:512d5b407d24ddaad1dcea295070409a62defd81c3f3daf8a02e6aca0f28fb96 +size 1343 diff --git a/Content/Game/Data/Item/DA_Rocher.uasset b/Content/Game/Data/Item/DA_Rocher.uasset index bdc8ba4..3ee2082 100644 --- a/Content/Game/Data/Item/DA_Rocher.uasset +++ b/Content/Game/Data/Item/DA_Rocher.uasset @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:ba0ffbc3bfc181e98c0fbaadccfcef0ceef4e4ccd3a1cadba4e89dd1be8319eb -size 2345 +oid sha256:12039770775d7c9319a640f5f4136b1bc1f3548c9e3452c0634c014b3ad23427 +size 1343 diff --git a/Content/Game/Data/Item/Food/DA_CookedMeat.uasset b/Content/Game/Data/Item/Food/DA_CookedMeat.uasset new file mode 100644 index 0000000..a97ff61 --- /dev/null +++ b/Content/Game/Data/Item/Food/DA_CookedMeat.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:a65845d1bf56b2e05da56354c74ec0b9fab769bc4adf4c5d5522adf8bc5a54d5 +size 2438 diff --git a/Content/Game/Data/Item/Food/DA_RawMeat.uasset b/Content/Game/Data/Item/Food/DA_RawMeat.uasset new file mode 100644 index 0000000..f6f3ad8 --- /dev/null +++ b/Content/Game/Data/Item/Food/DA_RawMeat.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:da00c4b21beebd7b0e6c24788e97b5517d6843b9a09a7c175a759f3ea1a5d9a5 +size 2703 diff --git a/Content/Game/Data/Item/Pickable/DA_Branch.uasset b/Content/Game/Data/Item/Pickable/DA_Branch.uasset new file mode 100644 index 0000000..fb50c31 --- /dev/null +++ b/Content/Game/Data/Item/Pickable/DA_Branch.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:b7d91de77f90011438ff11059f6fb395cfdcd272810e3d4e03d1a5cfb75baf10 +size 2505 diff --git a/Content/Game/Data/Item/Pickable/DA_Rocher.uasset b/Content/Game/Data/Item/Pickable/DA_Rocher.uasset new file mode 100644 index 0000000..1332e65 --- /dev/null +++ b/Content/Game/Data/Item/Pickable/DA_Rocher.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:e200f204dba6da022ec48ee1a6a7b3aa4a333253365744667da5d7cc114ce143 +size 2372 diff --git a/Content/Game/Data/Item/Tools/Stone/DA_Hammer.uasset b/Content/Game/Data/Item/Tools/Stone/DA_Hammer.uasset new file mode 100644 index 0000000..3d3a8af --- /dev/null +++ b/Content/Game/Data/Item/Tools/Stone/DA_Hammer.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:6d942bbf48b1cf7004fe758a9d73db9e72a8d09fc98614925f3c791e1abc1756 +size 1936 diff --git a/Content/Game/Data/Item/Tools/Stone/DA_Stone_Axe.uasset b/Content/Game/Data/Item/Tools/Stone/DA_Stone_Axe.uasset new file mode 100644 index 0000000..186c07d --- /dev/null +++ b/Content/Game/Data/Item/Tools/Stone/DA_Stone_Axe.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:4a0a69aa47344c2fd3b8c4d6e82683090a3a65c5c8ef04fdae79660a2cfcfc0a +size 2024 diff --git a/Content/Game/Data/Item/Tools/Stone/DA_Stone_Pickaxe.uasset b/Content/Game/Data/Item/Tools/Stone/DA_Stone_Pickaxe.uasset new file mode 100644 index 0000000..02768c6 --- /dev/null +++ b/Content/Game/Data/Item/Tools/Stone/DA_Stone_Pickaxe.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:288407a3532c487eb342200c8ef37a5d4e39a176ca88f5c0bca00889a648ded0 +size 2094 diff --git a/Content/Game/Data/Item/Tools/Wood/DA_Wood_Axe.uasset b/Content/Game/Data/Item/Tools/Wood/DA_Wood_Axe.uasset new file mode 100644 index 0000000..975fecf --- /dev/null +++ b/Content/Game/Data/Item/Tools/Wood/DA_Wood_Axe.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:532fb600a27ff82d3bc939ea5037f99b154130b751edce2664a98f8a247b9e81 +size 2008 diff --git a/Content/Game/Data/Item/Tools/Wood/DA_Wood_Pickaxe.uasset b/Content/Game/Data/Item/Tools/Wood/DA_Wood_Pickaxe.uasset new file mode 100644 index 0000000..3a426d5 --- /dev/null +++ b/Content/Game/Data/Item/Tools/Wood/DA_Wood_Pickaxe.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:632b78260481fae5d7b848255ce24f230c29766d8b9d7c26418b6eaaa3598534 +size 2056 diff --git a/Content/Game/Images/Tools/Stone/Stone_Axe.uasset b/Content/Game/Images/Tools/Stone/Stone_Axe.uasset new file mode 100644 index 0000000..80e222a --- /dev/null +++ b/Content/Game/Images/Tools/Stone/Stone_Axe.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:aafd7ef5bd872f9af43e2cbdd9ca73aedf7662b464494a3a565da4c884e9002d +size 494679 diff --git a/Content/Game/Images/Tools/Stone/pickaxe_stone.uasset b/Content/Game/Images/Tools/Stone/pickaxe_stone.uasset new file mode 100644 index 0000000..5b560db --- /dev/null +++ b/Content/Game/Images/Tools/Stone/pickaxe_stone.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:19fc3dedcbbc154b6eacd534ecd1f32646ebaccdd6382570bcfd812f863d0e6b +size 493724 diff --git a/Content/Game/Images/Tools/Wood/Wood_Axe.uasset b/Content/Game/Images/Tools/Wood/Wood_Axe.uasset new file mode 100644 index 0000000..1550137 --- /dev/null +++ b/Content/Game/Images/Tools/Wood/Wood_Axe.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:dcdd859078a1be2bfabf82eafc5f5cdf2347fdb86dbce1b8aaa6c5906adc8e71 +size 472445 diff --git a/Content/Game/Images/Tools/Wood/Wood_Pickaxe.uasset b/Content/Game/Images/Tools/Wood/Wood_Pickaxe.uasset new file mode 100644 index 0000000..3f66363 --- /dev/null +++ b/Content/Game/Images/Tools/Wood/Wood_Pickaxe.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:bd7d5d72cd43a60d5cf519180f74a3684546640562e03eae152a306d16454938 +size 1616360 diff --git a/Content/Game/Input/IMC_Default.uasset b/Content/Game/Input/IMC_Default.uasset index ec45988..cd5905e 100644 --- a/Content/Game/Input/IMC_Default.uasset +++ b/Content/Game/Input/IMC_Default.uasset @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:4d158ac2946f150894b103097fb2fd1339ab523db90977508297111fb9af7f17 -size 16782 +oid sha256:5059aebc29d2c39f95ba557afe88e0d8cc89277aa7d0734089f3565c778ce422 +size 16786 diff --git a/Content/Game/Maps/Dev/Dev_Scene.umap b/Content/Game/Maps/Dev/Dev_Scene.umap new file mode 100644 index 0000000..de65605 --- /dev/null +++ b/Content/Game/Maps/Dev/Dev_Scene.umap @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:362408b386cdda4b30f658daab5869daa200448646170389bb3f76f95ec9c095 +size 123356 diff --git a/Content/Game/Maps/GameScene.umap b/Content/Game/Maps/GameScene.umap index 8068f0b..59fb5e9 100644 --- a/Content/Game/Maps/GameScene.umap +++ b/Content/Game/Maps/GameScene.umap @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:4e2392240e9c076c2f516161a3c34144324864eac4a4e921d6b7de9ac9cea6ab -size 15123894 +oid sha256:687eaec399e60f6b8fd826dc876aaddb63491707c8de89a60f310e0b17d5eb04 +size 15131566 diff --git a/Content/Game/PickupItem/BP_Pickup_Test.uasset b/Content/Game/PickupItem/BP_Pickup_Test.uasset index 5d19cc7..1afe8c5 100644 --- a/Content/Game/PickupItem/BP_Pickup_Test.uasset +++ b/Content/Game/PickupItem/BP_Pickup_Test.uasset @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:eb2a7de5638c22a8e9e7c6a84400c1485e1a4767dac769af36007a96bf9d0c07 -size 42283 +oid sha256:cf2d8fa1d4423cc4057a0be118ccee2945a0e497fce0de7a1df6ef46ad1fcd51 +size 42251 diff --git a/Content/Game/UI/Craft/WBP_Crafting.uasset b/Content/Game/UI/Craft/WBP_Crafting.uasset index b201653..8446872 100644 --- a/Content/Game/UI/Craft/WBP_Crafting.uasset +++ b/Content/Game/UI/Craft/WBP_Crafting.uasset @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:e3ab3174817e9a537cb3433b0ec30c7c8c1c2b9e667a35cc519bcbf14bb35154 -size 42217 +oid sha256:c2ec47a264370ead3531ac56830c782149d44f8a9e14334a02f1bb35a05451cf +size 42152 diff --git a/Content/Game/UI/Craft/WBP_InventoryScreen.uasset b/Content/Game/UI/Craft/WBP_InventoryScreen.uasset index c9cb675..6cdaee4 100644 --- a/Content/Game/UI/Craft/WBP_InventoryScreen.uasset +++ b/Content/Game/UI/Craft/WBP_InventoryScreen.uasset @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:db88f76eea0d0f13387b4b5eb6de667c14e77447b592e7ca81ef401caaaced16 -size 38068 +oid sha256:e8744937c034303d548c928c32c4cd0b389a30c1fda002c168d453b503cf644e +size 38414 diff --git a/Content/Game/UI/Setting/Input/WBP_SettingsControls.uasset b/Content/Game/UI/Setting/Input/WBP_SettingsControls.uasset index e9ee451..24768a2 100644 --- a/Content/Game/UI/Setting/Input/WBP_SettingsControls.uasset +++ b/Content/Game/UI/Setting/Input/WBP_SettingsControls.uasset @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:99d3c615f49298471c27e18f09f322edb503aca44b5d833340b215384c3cee02 -size 40703 +oid sha256:a145378a7de38166f693253dcc22b771991f82ecf136098c2bd196116f2d23cc +size 39916 diff --git a/Content/UI/Icons/T_Icon_Food_06.uasset b/Content/UI/Icons/T_Icon_Food_06.uasset new file mode 100644 index 0000000..2128e11 --- /dev/null +++ b/Content/UI/Icons/T_Icon_Food_06.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:cf4c9abd8fad816593e6bddf44df5081f2975c42427738ab3b7f20154d61e5f5 +size 57482 diff --git a/Content/UI/Icons/T_Icon_Food_07.uasset b/Content/UI/Icons/T_Icon_Food_07.uasset new file mode 100644 index 0000000..aa9f203 --- /dev/null +++ b/Content/UI/Icons/T_Icon_Food_07.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:c0ed1940f1d8ca7eaa859b87ba6468c9b41f865a636e6be43f55e61b37861994 +size 53447 diff --git a/Content/Vefects/Stylized_Fire/Demo/Scene/Materials/MI_Apple_01.uasset b/Content/Vefects/Stylized_Fire/Demo/Scene/Materials/MI_Apple_01.uasset new file mode 100644 index 0000000..a076db3 --- /dev/null +++ b/Content/Vefects/Stylized_Fire/Demo/Scene/Materials/MI_Apple_01.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:35d84c9cd3de22c74a15205973fdc02b31190417feb62d887876b3c94ab87bde +size 108350 diff --git a/Content/Vefects/Stylized_Fire/Demo/Scene/Materials/MI_Apple_02.uasset b/Content/Vefects/Stylized_Fire/Demo/Scene/Materials/MI_Apple_02.uasset new file mode 100644 index 0000000..abee809 --- /dev/null +++ b/Content/Vefects/Stylized_Fire/Demo/Scene/Materials/MI_Apple_02.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:1888faefe7bdfc9b3014fe2e8680e0aa02e99ac58e78f92b65e847d627cb361c +size 117690 diff --git a/Content/Vefects/Stylized_Fire/Demo/Scene/Materials/MI_Vefects_Grid_01.uasset b/Content/Vefects/Stylized_Fire/Demo/Scene/Materials/MI_Vefects_Grid_01.uasset new file mode 100644 index 0000000..24f185b --- /dev/null +++ b/Content/Vefects/Stylized_Fire/Demo/Scene/Materials/MI_Vefects_Grid_01.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:8584c572e47757c80cba920bc76382e144134142143528e3f4378ec9d2614731 +size 98552 diff --git a/Content/Vefects/Stylized_Fire/Demo/Scene/Materials/MI_Vefects_Grid_02.uasset b/Content/Vefects/Stylized_Fire/Demo/Scene/Materials/MI_Vefects_Grid_02.uasset new file mode 100644 index 0000000..a4e560c --- /dev/null +++ b/Content/Vefects/Stylized_Fire/Demo/Scene/Materials/MI_Vefects_Grid_02.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:6a40fed62e32f4908cd465626542b21be4369f3aa3a7e2cedf62dc204e7af770 +size 97491 diff --git a/Content/Vefects/Stylized_Fire/Demo/Scene/Materials/M_Apple_01.uasset b/Content/Vefects/Stylized_Fire/Demo/Scene/Materials/M_Apple_01.uasset new file mode 100644 index 0000000..e914a7c --- /dev/null +++ b/Content/Vefects/Stylized_Fire/Demo/Scene/Materials/M_Apple_01.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:31357cf37a83c29a70003b650585a56b286e4f665c70affe79d481f61c7757c6 +size 118322 diff --git a/Content/Vefects/Stylized_Fire/Demo/Scene/Materials/M_Vefects_Grid.uasset b/Content/Vefects/Stylized_Fire/Demo/Scene/Materials/M_Vefects_Grid.uasset new file mode 100644 index 0000000..1c545d7 --- /dev/null +++ b/Content/Vefects/Stylized_Fire/Demo/Scene/Materials/M_Vefects_Grid.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:1c79ff54982151b1cbb3f6cc2204d249f54810e921a6899c384088246093f8d1 +size 121602 diff --git a/Content/Vefects/Stylized_Fire/Demo/Scene/Meshes/SM_VFX_Apple_01.uasset b/Content/Vefects/Stylized_Fire/Demo/Scene/Meshes/SM_VFX_Apple_01.uasset new file mode 100644 index 0000000..b113e37 --- /dev/null +++ b/Content/Vefects/Stylized_Fire/Demo/Scene/Meshes/SM_VFX_Apple_01.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:0aa05c8c42256bc752f20f1655f0a52f0ba100ac4b358059ff5bb711137c1235 +size 96363 diff --git a/Content/Vefects/Stylized_Fire/Demo/Scene/Meshes/SM_VFX_Apple_01_HD.uasset b/Content/Vefects/Stylized_Fire/Demo/Scene/Meshes/SM_VFX_Apple_01_HD.uasset new file mode 100644 index 0000000..4dd00ac --- /dev/null +++ b/Content/Vefects/Stylized_Fire/Demo/Scene/Meshes/SM_VFX_Apple_01_HD.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:8ac3ca4cd7a7b5512b9858054301b5b7b8d92c6fcff70aa6cfd4a534c25b0958 +size 241730 diff --git a/Content/Vefects/Stylized_Fire/Demo/Scene/Meshes/SM_VFX_Sphere_128_Scaled.uasset b/Content/Vefects/Stylized_Fire/Demo/Scene/Meshes/SM_VFX_Sphere_128_Scaled.uasset new file mode 100644 index 0000000..8aacac5 --- /dev/null +++ b/Content/Vefects/Stylized_Fire/Demo/Scene/Meshes/SM_VFX_Sphere_128_Scaled.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:29e67c6e6c7ecb9372cd42edec8267ceb044091374a0860f8e6e4f8ac3ef4f7c +size 601174 diff --git a/Content/Vefects/Stylized_Fire/Demo/Scene/Textures/Apple/T_VFX_Apple_01_Low_BC.uasset b/Content/Vefects/Stylized_Fire/Demo/Scene/Textures/Apple/T_VFX_Apple_01_Low_BC.uasset new file mode 100644 index 0000000..720d4a8 --- /dev/null +++ b/Content/Vefects/Stylized_Fire/Demo/Scene/Textures/Apple/T_VFX_Apple_01_Low_BC.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:040d23a8717ef09dce1fcf6060edd4276a0e83f2ca34aa15d8ef81e321c9ba7e +size 177462 diff --git a/Content/Vefects/Stylized_Fire/Demo/Scene/Textures/Apple/T_VFX_Apple_01_Low_GS.uasset b/Content/Vefects/Stylized_Fire/Demo/Scene/Textures/Apple/T_VFX_Apple_01_Low_GS.uasset new file mode 100644 index 0000000..204d43b --- /dev/null +++ b/Content/Vefects/Stylized_Fire/Demo/Scene/Textures/Apple/T_VFX_Apple_01_Low_GS.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:99ca21bf175622b517228e6bddb29fce328f2bb7cf5941d141d64b11fc70a01b +size 117300 diff --git a/Content/Vefects/Stylized_Fire/Demo/Scene/Textures/Apple/T_VFX_Apple_01_Low_N.uasset b/Content/Vefects/Stylized_Fire/Demo/Scene/Textures/Apple/T_VFX_Apple_01_Low_N.uasset new file mode 100644 index 0000000..07483e9 --- /dev/null +++ b/Content/Vefects/Stylized_Fire/Demo/Scene/Textures/Apple/T_VFX_Apple_01_Low_N.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:37edd1a878af7aa9bce8b7cf87a726fb4c16bfb6027e07c864690ab152f38df9 +size 252311 diff --git a/Content/Vefects/Stylized_Fire/Demo/Scene/Textures/Grid/T_VFX_Grid_01_Masks.uasset b/Content/Vefects/Stylized_Fire/Demo/Scene/Textures/Grid/T_VFX_Grid_01_Masks.uasset new file mode 100644 index 0000000..b5cbb59 --- /dev/null +++ b/Content/Vefects/Stylized_Fire/Demo/Scene/Textures/Grid/T_VFX_Grid_01_Masks.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:dcd70e95396b92c0feff02805b21a78b897be206f6b4481bdfd15b15af0941c9 +size 1756600 diff --git a/Content/Vefects/Stylized_Fire/Demo/Scene/Textures/Grid/T_VFX_Grid_01_Normal.uasset b/Content/Vefects/Stylized_Fire/Demo/Scene/Textures/Grid/T_VFX_Grid_01_Normal.uasset new file mode 100644 index 0000000..62dbdd7 --- /dev/null +++ b/Content/Vefects/Stylized_Fire/Demo/Scene/Textures/Grid/T_VFX_Grid_01_Normal.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:1faf600ae754423eb7c1d34cf38343d7a270048325b7b715e1ae57607a121a97 +size 3814223 diff --git a/Content/Vefects/Stylized_Fire/Demo/Scene/Textures/Grid/T_VFX_Grid_01_Texture.uasset b/Content/Vefects/Stylized_Fire/Demo/Scene/Textures/Grid/T_VFX_Grid_01_Texture.uasset new file mode 100644 index 0000000..71e7765 --- /dev/null +++ b/Content/Vefects/Stylized_Fire/Demo/Scene/Textures/Grid/T_VFX_Grid_01_Texture.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:13b30d8f864b5082aadbef208b5a36d170e0cab325cfdfa5cfe98fd65383188b +size 6273463 diff --git a/Content/Vefects/Stylized_Fire/Demo/Scene/Textures/Sky/T_Lush_HDRI_05_Blur_Opti.uasset b/Content/Vefects/Stylized_Fire/Demo/Scene/Textures/Sky/T_Lush_HDRI_05_Blur_Opti.uasset new file mode 100644 index 0000000..34d4d9b --- /dev/null +++ b/Content/Vefects/Stylized_Fire/Demo/Scene/Textures/Sky/T_Lush_HDRI_05_Blur_Opti.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:f319404e95b0834c4c2846e87d29550da15b3c9df686bc04b7dae4d89a649825 +size 566065 diff --git a/Content/Vefects/Stylized_Fire/Demo/Scene/Textures/Sky/T_VFX_Lush_HDRI_05.uasset b/Content/Vefects/Stylized_Fire/Demo/Scene/Textures/Sky/T_VFX_Lush_HDRI_05.uasset new file mode 100644 index 0000000..78298c9 --- /dev/null +++ b/Content/Vefects/Stylized_Fire/Demo/Scene/Textures/Sky/T_VFX_Lush_HDRI_05.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:c20e938c8dd704b243f261325b1c1a6190cf86d55d03dcd73559b36636d196df +size 836783 diff --git a/Content/Vefects/Stylized_Fire/Demo/Sequence/LS_Cam_Anim_01.uasset b/Content/Vefects/Stylized_Fire/Demo/Sequence/LS_Cam_Anim_01.uasset new file mode 100644 index 0000000..2784b33 --- /dev/null +++ b/Content/Vefects/Stylized_Fire/Demo/Sequence/LS_Cam_Anim_01.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:e727ea66fb9f2409d564dea612e79567298f936f8b8351c5e3602116450394ed +size 19388 diff --git a/Content/Vefects/Stylized_Fire/Demo/Stylized_Female_Character_Vexa/Animations/AirDash_Vexa.uasset b/Content/Vefects/Stylized_Fire/Demo/Stylized_Female_Character_Vexa/Animations/AirDash_Vexa.uasset new file mode 100644 index 0000000..6f2ac1b --- /dev/null +++ b/Content/Vefects/Stylized_Fire/Demo/Stylized_Female_Character_Vexa/Animations/AirDash_Vexa.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:802531b7cee886d9ea3ed4385e9908841bee440ff032e9777a020204c7b3e65e +size 116536 diff --git a/Content/Vefects/Stylized_Fire/Demo/Stylized_Female_Character_Vexa/Animations/AirStomp_Vexa.uasset b/Content/Vefects/Stylized_Fire/Demo/Stylized_Female_Character_Vexa/Animations/AirStomp_Vexa.uasset new file mode 100644 index 0000000..dc4c1a1 --- /dev/null +++ b/Content/Vefects/Stylized_Fire/Demo/Stylized_Female_Character_Vexa/Animations/AirStomp_Vexa.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:8acdde60721693744ea8c16f286a5dc9aff32abdf1ea663e60bef504f2371752 +size 179559 diff --git a/Content/Vefects/Stylized_Fire/Demo/Stylized_Female_Character_Vexa/Animations/Appearance_Vexa.uasset b/Content/Vefects/Stylized_Fire/Demo/Stylized_Female_Character_Vexa/Animations/Appearance_Vexa.uasset new file mode 100644 index 0000000..470a6aa --- /dev/null +++ b/Content/Vefects/Stylized_Fire/Demo/Stylized_Female_Character_Vexa/Animations/Appearance_Vexa.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:a49078e94a146d1f35f5b930353b49be8e6035d8ced049bab6a8d594650f8a68 +size 174340 diff --git a/Content/Vefects/Stylized_Fire/Demo/Stylized_Female_Character_Vexa/Animations/Dash_Vexa.uasset b/Content/Vefects/Stylized_Fire/Demo/Stylized_Female_Character_Vexa/Animations/Dash_Vexa.uasset new file mode 100644 index 0000000..6669b47 --- /dev/null +++ b/Content/Vefects/Stylized_Fire/Demo/Stylized_Female_Character_Vexa/Animations/Dash_Vexa.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:f81f257ae74a8a6d93f8cc2d31ae25a9a20ff246d4458d2c30130b965654cf85 +size 116073 diff --git a/Content/Vefects/Stylized_Fire/Demo/Stylized_Female_Character_Vexa/Animations/Death_Vexa.uasset b/Content/Vefects/Stylized_Fire/Demo/Stylized_Female_Character_Vexa/Animations/Death_Vexa.uasset new file mode 100644 index 0000000..0bd22f9 --- /dev/null +++ b/Content/Vefects/Stylized_Fire/Demo/Stylized_Female_Character_Vexa/Animations/Death_Vexa.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:acf2b1d919ef3db8da377f4f58d0e492bfa30c70db705b8232370005650c40d8 +size 139483 diff --git a/Content/Vefects/Stylized_Fire/Demo/Stylized_Female_Character_Vexa/Animations/GunShot01_Vexa.uasset b/Content/Vefects/Stylized_Fire/Demo/Stylized_Female_Character_Vexa/Animations/GunShot01_Vexa.uasset new file mode 100644 index 0000000..f856daa --- /dev/null +++ b/Content/Vefects/Stylized_Fire/Demo/Stylized_Female_Character_Vexa/Animations/GunShot01_Vexa.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:5d138f8b68aaa5239cbd61033b35211a1b5cc300eee4f9ad66f7e98639603eed +size 123959 diff --git a/Content/Vefects/Stylized_Fire/Demo/Stylized_Female_Character_Vexa/Animations/GunShot02_Vexa.uasset b/Content/Vefects/Stylized_Fire/Demo/Stylized_Female_Character_Vexa/Animations/GunShot02_Vexa.uasset new file mode 100644 index 0000000..5280115 --- /dev/null +++ b/Content/Vefects/Stylized_Fire/Demo/Stylized_Female_Character_Vexa/Animations/GunShot02_Vexa.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:3ea33679ecc15f8cea747a8817b2222da54a2d94b0846fac40816ac6fdab6226 +size 116562 diff --git a/Content/Vefects/Stylized_Fire/Demo/Stylized_Female_Character_Vexa/Animations/GunShot03_Vexa.uasset b/Content/Vefects/Stylized_Fire/Demo/Stylized_Female_Character_Vexa/Animations/GunShot03_Vexa.uasset new file mode 100644 index 0000000..b3124b1 --- /dev/null +++ b/Content/Vefects/Stylized_Fire/Demo/Stylized_Female_Character_Vexa/Animations/GunShot03_Vexa.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:cfef4f968702cf57906292ae137897c449a169896c7acecee7951c754a7e5b9c +size 120721 diff --git a/Content/Vefects/Stylized_Fire/Demo/Stylized_Female_Character_Vexa/Animations/GunShotComplete_Vexa.uasset b/Content/Vefects/Stylized_Fire/Demo/Stylized_Female_Character_Vexa/Animations/GunShotComplete_Vexa.uasset new file mode 100644 index 0000000..2b63b40 --- /dev/null +++ b/Content/Vefects/Stylized_Fire/Demo/Stylized_Female_Character_Vexa/Animations/GunShotComplete_Vexa.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:3e9b4265f2a9a407cf923656071e821cb47ebdcf4573b1f96b3c7e870419cb7f +size 146046 diff --git a/Content/Vefects/Stylized_Fire/Demo/Stylized_Female_Character_Vexa/Animations/HandsSpell_Vexa.uasset b/Content/Vefects/Stylized_Fire/Demo/Stylized_Female_Character_Vexa/Animations/HandsSpell_Vexa.uasset new file mode 100644 index 0000000..b7ae7f1 --- /dev/null +++ b/Content/Vefects/Stylized_Fire/Demo/Stylized_Female_Character_Vexa/Animations/HandsSpell_Vexa.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:0126984e6e963b353e794a0b500e7d5c233487ad52387bf94acd26a40b4eed7d +size 185099 diff --git a/Content/Vefects/Stylized_Fire/Demo/Stylized_Female_Character_Vexa/Animations/Healing_Vexa.uasset b/Content/Vefects/Stylized_Fire/Demo/Stylized_Female_Character_Vexa/Animations/Healing_Vexa.uasset new file mode 100644 index 0000000..f299232 --- /dev/null +++ b/Content/Vefects/Stylized_Fire/Demo/Stylized_Female_Character_Vexa/Animations/Healing_Vexa.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:eda6c1f85a47f329798c01d1d5ede01deb6f0f11cd037b6696decf5732f43117 +size 176973 diff --git a/Content/Vefects/Stylized_Fire/Demo/Stylized_Female_Character_Vexa/Animations/IdleChill_Vexa.uasset b/Content/Vefects/Stylized_Fire/Demo/Stylized_Female_Character_Vexa/Animations/IdleChill_Vexa.uasset new file mode 100644 index 0000000..9b788a0 --- /dev/null +++ b/Content/Vefects/Stylized_Fire/Demo/Stylized_Female_Character_Vexa/Animations/IdleChill_Vexa.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:9bbbb5a14a7d3c7ce00562f7fa0b5a6d6fe35a92b1a6ea883655548d7f8c4a8f +size 178840 diff --git a/Content/Vefects/Stylized_Fire/Demo/Stylized_Female_Character_Vexa/Animations/Idle_Vexa.uasset b/Content/Vefects/Stylized_Fire/Demo/Stylized_Female_Character_Vexa/Animations/Idle_Vexa.uasset new file mode 100644 index 0000000..d192893 --- /dev/null +++ b/Content/Vefects/Stylized_Fire/Demo/Stylized_Female_Character_Vexa/Animations/Idle_Vexa.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:e15b2b589531d87338f84bc332e8e233fb07f45b5b9e53314998c58e4df5beb6 +size 190598 diff --git a/Content/Vefects/Stylized_Fire/Demo/Stylized_Female_Character_Vexa/Animations/Jump01_Vexa.uasset b/Content/Vefects/Stylized_Fire/Demo/Stylized_Female_Character_Vexa/Animations/Jump01_Vexa.uasset new file mode 100644 index 0000000..9423581 --- /dev/null +++ b/Content/Vefects/Stylized_Fire/Demo/Stylized_Female_Character_Vexa/Animations/Jump01_Vexa.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:59c5e8bf75a4448034947485c6a6dc322544e7b437fcea96e2702826ca54bd17 +size 124881 diff --git a/Content/Vefects/Stylized_Fire/Demo/Stylized_Female_Character_Vexa/Animations/Jump02_Vexa.uasset b/Content/Vefects/Stylized_Fire/Demo/Stylized_Female_Character_Vexa/Animations/Jump02_Vexa.uasset new file mode 100644 index 0000000..46fa92b --- /dev/null +++ b/Content/Vefects/Stylized_Fire/Demo/Stylized_Female_Character_Vexa/Animations/Jump02_Vexa.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:5e6ca76e03dd0832380fe50649a43a6c22503c87f7d3c3eddf60b7ea320eb7f9 +size 125345 diff --git a/Content/Vefects/Stylized_Fire/Demo/Stylized_Female_Character_Vexa/Animations/Jump03_Vexa.uasset b/Content/Vefects/Stylized_Fire/Demo/Stylized_Female_Character_Vexa/Animations/Jump03_Vexa.uasset new file mode 100644 index 0000000..5f0256d --- /dev/null +++ b/Content/Vefects/Stylized_Fire/Demo/Stylized_Female_Character_Vexa/Animations/Jump03_Vexa.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:574405b1826cb44866b4090f38ffc1e95d848a5042a8ad950d73b55d32b7a9d7 +size 130325 diff --git a/Content/Vefects/Stylized_Fire/Demo/Stylized_Female_Character_Vexa/Animations/JumpComplete_Vexa.uasset b/Content/Vefects/Stylized_Fire/Demo/Stylized_Female_Character_Vexa/Animations/JumpComplete_Vexa.uasset new file mode 100644 index 0000000..6d30c60 --- /dev/null +++ b/Content/Vefects/Stylized_Fire/Demo/Stylized_Female_Character_Vexa/Animations/JumpComplete_Vexa.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:39531338d6badfb59d336d6a5b742fdcc049a32b3f6292db532afddead65d76c +size 167360 diff --git a/Content/Vefects/Stylized_Fire/Demo/Stylized_Female_Character_Vexa/Animations/MagicWand_Vexa.uasset b/Content/Vefects/Stylized_Fire/Demo/Stylized_Female_Character_Vexa/Animations/MagicWand_Vexa.uasset new file mode 100644 index 0000000..b85a327 --- /dev/null +++ b/Content/Vefects/Stylized_Fire/Demo/Stylized_Female_Character_Vexa/Animations/MagicWand_Vexa.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:a629ad4f842074b033d1fb06018c8949f37d9116c536958db4a73c9d97c55473 +size 229240 diff --git a/Content/Vefects/Stylized_Fire/Demo/Stylized_Female_Character_Vexa/Animations/RecivingHeavyDamage_Vexa.uasset b/Content/Vefects/Stylized_Fire/Demo/Stylized_Female_Character_Vexa/Animations/RecivingHeavyDamage_Vexa.uasset new file mode 100644 index 0000000..16a7f1c --- /dev/null +++ b/Content/Vefects/Stylized_Fire/Demo/Stylized_Female_Character_Vexa/Animations/RecivingHeavyDamage_Vexa.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:7c4d7151cd46496e4963745ef5febaeb1c2af6db6d374bdc2994aaed1de340e8 +size 137527 diff --git a/Content/Vefects/Stylized_Fire/Demo/Stylized_Female_Character_Vexa/Animations/RecivingLightDamage_Vexa.uasset b/Content/Vefects/Stylized_Fire/Demo/Stylized_Female_Character_Vexa/Animations/RecivingLightDamage_Vexa.uasset new file mode 100644 index 0000000..4e70270 --- /dev/null +++ b/Content/Vefects/Stylized_Fire/Demo/Stylized_Female_Character_Vexa/Animations/RecivingLightDamage_Vexa.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:82842a85bd1943755699708cd53f96e180f2954d08b1192bcb79a2c56edf967d +size 113869 diff --git a/Content/Vefects/Stylized_Fire/Demo/Stylized_Female_Character_Vexa/Animations/SnappySpell_Vexa.uasset b/Content/Vefects/Stylized_Fire/Demo/Stylized_Female_Character_Vexa/Animations/SnappySpell_Vexa.uasset new file mode 100644 index 0000000..e8ee772 --- /dev/null +++ b/Content/Vefects/Stylized_Fire/Demo/Stylized_Female_Character_Vexa/Animations/SnappySpell_Vexa.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:223026f66a7162ba40a6b6ca3fd52f597c9946fb9930447673adf254b9941543 +size 120739 diff --git a/Content/Vefects/Stylized_Fire/Demo/Stylized_Female_Character_Vexa/Animations/Stomp_Vexa.uasset b/Content/Vefects/Stylized_Fire/Demo/Stylized_Female_Character_Vexa/Animations/Stomp_Vexa.uasset new file mode 100644 index 0000000..c9d6e15 --- /dev/null +++ b/Content/Vefects/Stylized_Fire/Demo/Stylized_Female_Character_Vexa/Animations/Stomp_Vexa.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:c0f351454c568663496d3e1d60853b7bb75989f6477ce7674480e7dace59cff3 +size 158611 diff --git a/Content/Vefects/Stylized_Fire/Demo/Stylized_Female_Character_Vexa/Animations/SummonCreature_Vexa.uasset b/Content/Vefects/Stylized_Fire/Demo/Stylized_Female_Character_Vexa/Animations/SummonCreature_Vexa.uasset new file mode 100644 index 0000000..bf643e6 --- /dev/null +++ b/Content/Vefects/Stylized_Fire/Demo/Stylized_Female_Character_Vexa/Animations/SummonCreature_Vexa.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:238da57f3ff97500a49a273068a3e8ef92f8db424f1f78cb3ab42750cab9c0e4 +size 187519 diff --git a/Content/Vefects/Stylized_Fire/Demo/Stylized_Female_Character_Vexa/Animations/SwordAttack_Vexa.uasset b/Content/Vefects/Stylized_Fire/Demo/Stylized_Female_Character_Vexa/Animations/SwordAttack_Vexa.uasset new file mode 100644 index 0000000..5aad913 --- /dev/null +++ b/Content/Vefects/Stylized_Fire/Demo/Stylized_Female_Character_Vexa/Animations/SwordAttack_Vexa.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:1fb9818d3625cc681ebbf7e9c965d12a2e7ba46b952386fd626054ce487e3449 +size 156977 diff --git a/Content/Vefects/Stylized_Fire/Demo/Stylized_Female_Character_Vexa/Animations/SwordSlash_Vexa.uasset b/Content/Vefects/Stylized_Fire/Demo/Stylized_Female_Character_Vexa/Animations/SwordSlash_Vexa.uasset new file mode 100644 index 0000000..346232c --- /dev/null +++ b/Content/Vefects/Stylized_Fire/Demo/Stylized_Female_Character_Vexa/Animations/SwordSlash_Vexa.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:f21d3cc82b3533d2774457c9f420a1563eef90dc4caf43e96a3dd7d15cf139e2 +size 119217 diff --git a/Content/Vefects/Stylized_Fire/Demo/Stylized_Female_Character_Vexa/Materials/Dark/MI_Vexa_Body_Dark.uasset b/Content/Vefects/Stylized_Fire/Demo/Stylized_Female_Character_Vexa/Materials/Dark/MI_Vexa_Body_Dark.uasset new file mode 100644 index 0000000..b15c7c1 --- /dev/null +++ b/Content/Vefects/Stylized_Fire/Demo/Stylized_Female_Character_Vexa/Materials/Dark/MI_Vexa_Body_Dark.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:d99514b95583dff64a43781aceb61f726b04fc54f457fb93fe773c31f49e6ebe +size 110460 diff --git a/Content/Vefects/Stylized_Fire/Demo/Stylized_Female_Character_Vexa/Materials/Dark/MI_Vexa_Hair_Dark.uasset b/Content/Vefects/Stylized_Fire/Demo/Stylized_Female_Character_Vexa/Materials/Dark/MI_Vexa_Hair_Dark.uasset new file mode 100644 index 0000000..53f6846 --- /dev/null +++ b/Content/Vefects/Stylized_Fire/Demo/Stylized_Female_Character_Vexa/Materials/Dark/MI_Vexa_Hair_Dark.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:91d7efd2ec0988475b4ef5f41a594e5c37142304bf0f1b31b0b041c8ff754eb9 +size 104175 diff --git a/Content/Vefects/Stylized_Fire/Demo/Stylized_Female_Character_Vexa/Materials/Dark/MI_Vexa_Jacket_Dark.uasset b/Content/Vefects/Stylized_Fire/Demo/Stylized_Female_Character_Vexa/Materials/Dark/MI_Vexa_Jacket_Dark.uasset new file mode 100644 index 0000000..40623b4 --- /dev/null +++ b/Content/Vefects/Stylized_Fire/Demo/Stylized_Female_Character_Vexa/Materials/Dark/MI_Vexa_Jacket_Dark.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:9aa9dd2be85645c1a59d346b40e9bc9494520318369846ab972b761ee5842cbb +size 114135 diff --git a/Content/Vefects/Stylized_Fire/Demo/Stylized_Female_Character_Vexa/Materials/Flat/MI_Vexa_Body_Flat.uasset b/Content/Vefects/Stylized_Fire/Demo/Stylized_Female_Character_Vexa/Materials/Flat/MI_Vexa_Body_Flat.uasset new file mode 100644 index 0000000..dcb2e0e --- /dev/null +++ b/Content/Vefects/Stylized_Fire/Demo/Stylized_Female_Character_Vexa/Materials/Flat/MI_Vexa_Body_Flat.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:72841af7c1cd45560b66e019601133f953da8b147b05f4091b9bc08279be5ec6 +size 97851 diff --git a/Content/Vefects/Stylized_Fire/Demo/Stylized_Female_Character_Vexa/Materials/Flat/MI_Vexa_Hair_Flat.uasset b/Content/Vefects/Stylized_Fire/Demo/Stylized_Female_Character_Vexa/Materials/Flat/MI_Vexa_Hair_Flat.uasset new file mode 100644 index 0000000..25bf5ad --- /dev/null +++ b/Content/Vefects/Stylized_Fire/Demo/Stylized_Female_Character_Vexa/Materials/Flat/MI_Vexa_Hair_Flat.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:1037a4c4eb5b3cf4f16a330bc892e78e3840aefbaca8b8c5960cbf631c36b72f +size 91151 diff --git a/Content/Vefects/Stylized_Fire/Demo/Stylized_Female_Character_Vexa/Materials/Flat/MI_Vexa_Jacket_Flat.uasset b/Content/Vefects/Stylized_Fire/Demo/Stylized_Female_Character_Vexa/Materials/Flat/MI_Vexa_Jacket_Flat.uasset new file mode 100644 index 0000000..9a73211 --- /dev/null +++ b/Content/Vefects/Stylized_Fire/Demo/Stylized_Female_Character_Vexa/Materials/Flat/MI_Vexa_Jacket_Flat.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:3301e144280cd84998abe3f112055ecf9fc46e024e2ce31b53b1ac64404685ea +size 106861 diff --git a/Content/Vefects/Stylized_Fire/Demo/Stylized_Female_Character_Vexa/Materials/Flat/M_Vexa_Flat.uasset b/Content/Vefects/Stylized_Fire/Demo/Stylized_Female_Character_Vexa/Materials/Flat/M_Vexa_Flat.uasset new file mode 100644 index 0000000..9090b21 --- /dev/null +++ b/Content/Vefects/Stylized_Fire/Demo/Stylized_Female_Character_Vexa/Materials/Flat/M_Vexa_Flat.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:6c8eac90861562a33819c9b1bdac1e1fc51c655e7035fabebfc9f40a9fd648e5 +size 88947 diff --git a/Content/Vefects/Stylized_Fire/Demo/Stylized_Female_Character_Vexa/Materials/Logo/MI_Logo_01.uasset b/Content/Vefects/Stylized_Fire/Demo/Stylized_Female_Character_Vexa/Materials/Logo/MI_Logo_01.uasset new file mode 100644 index 0000000..eb2f13b --- /dev/null +++ b/Content/Vefects/Stylized_Fire/Demo/Stylized_Female_Character_Vexa/Materials/Logo/MI_Logo_01.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:3cd14ee5452dc076bcbdbe8a731383b9e5dbb8d80313bdabb7d87385fb0909e1 +size 87261 diff --git a/Content/Vefects/Stylized_Fire/Demo/Stylized_Female_Character_Vexa/Materials/Logo/MI_Logo_01_Normal.uasset b/Content/Vefects/Stylized_Fire/Demo/Stylized_Female_Character_Vexa/Materials/Logo/MI_Logo_01_Normal.uasset new file mode 100644 index 0000000..7ee3455 --- /dev/null +++ b/Content/Vefects/Stylized_Fire/Demo/Stylized_Female_Character_Vexa/Materials/Logo/MI_Logo_01_Normal.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:b6b82c5e175e318bc6e9d22c77c7e171c40365b4eba5ddeda05135faa8630c40 +size 87814 diff --git a/Content/Vefects/Stylized_Fire/Demo/Stylized_Female_Character_Vexa/Materials/Logo/M_Logo.uasset b/Content/Vefects/Stylized_Fire/Demo/Stylized_Female_Character_Vexa/Materials/Logo/M_Logo.uasset new file mode 100644 index 0000000..d42cdb8 --- /dev/null +++ b/Content/Vefects/Stylized_Fire/Demo/Stylized_Female_Character_Vexa/Materials/Logo/M_Logo.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:e521c627a6dd4e4ced46ead925d62a4a4f37063ea26f6e49858b54b9a6cb45ee +size 92745 diff --git a/Content/Vefects/Stylized_Fire/Demo/Stylized_Female_Character_Vexa/Materials/Logo/M_Logo_Normal.uasset b/Content/Vefects/Stylized_Fire/Demo/Stylized_Female_Character_Vexa/Materials/Logo/M_Logo_Normal.uasset new file mode 100644 index 0000000..9f9cf94 --- /dev/null +++ b/Content/Vefects/Stylized_Fire/Demo/Stylized_Female_Character_Vexa/Materials/Logo/M_Logo_Normal.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:2a1d08b6dcf41b7c6d1119d182216692f65eba49e1a80998c3b9e1489d275a63 +size 95916 diff --git a/Content/Vefects/Stylized_Fire/Demo/Stylized_Female_Character_Vexa/Materials/Master/M_Vexa.uasset b/Content/Vefects/Stylized_Fire/Demo/Stylized_Female_Character_Vexa/Materials/Master/M_Vexa.uasset new file mode 100644 index 0000000..bd66ce7 --- /dev/null +++ b/Content/Vefects/Stylized_Fire/Demo/Stylized_Female_Character_Vexa/Materials/Master/M_Vexa.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:7f7788d31859bc95a7f5377c7a17af1ee968eff6c640cab0cb82c88003574167 +size 118012 diff --git a/Content/Vefects/Stylized_Fire/Demo/Stylized_Female_Character_Vexa/Meshes/SM_Vefects_Vexa.uasset b/Content/Vefects/Stylized_Fire/Demo/Stylized_Female_Character_Vexa/Meshes/SM_Vefects_Vexa.uasset new file mode 100644 index 0000000..a187eb5 --- /dev/null +++ b/Content/Vefects/Stylized_Fire/Demo/Stylized_Female_Character_Vexa/Meshes/SM_Vefects_Vexa.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:508973908d5f46aef0177ae87c44c3e9a58e1aaee81faee50254e1f5d46685d1 +size 2955782 diff --git a/Content/Vefects/Stylized_Fire/Demo/Stylized_Female_Character_Vexa/SK/SK_Vefects_Vexa.uasset b/Content/Vefects/Stylized_Fire/Demo/Stylized_Female_Character_Vexa/SK/SK_Vefects_Vexa.uasset new file mode 100644 index 0000000..48faa28 --- /dev/null +++ b/Content/Vefects/Stylized_Fire/Demo/Stylized_Female_Character_Vexa/SK/SK_Vefects_Vexa.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:c518aefe7fedd282a6f65110558be0b5a3ff7cd56717ec1cb8d478dbbb72aafb +size 10061153 diff --git a/Content/Vefects/Stylized_Fire/Demo/Stylized_Female_Character_Vexa/SK/Vefects_Vexa_PhysicsAsset.uasset b/Content/Vefects/Stylized_Fire/Demo/Stylized_Female_Character_Vexa/SK/Vefects_Vexa_PhysicsAsset.uasset new file mode 100644 index 0000000..7ff63c8 --- /dev/null +++ b/Content/Vefects/Stylized_Fire/Demo/Stylized_Female_Character_Vexa/SK/Vefects_Vexa_PhysicsAsset.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:c4140ef62d39662d58eb062d20a28f9fd68317f3a13f848392eaade94208cf36 +size 118035 diff --git a/Content/Vefects/Stylized_Fire/Demo/Stylized_Female_Character_Vexa/SK/Vefects_Vexa_Skeleton.uasset b/Content/Vefects/Stylized_Fire/Demo/Stylized_Female_Character_Vexa/SK/Vefects_Vexa_Skeleton.uasset new file mode 100644 index 0000000..90fa396 --- /dev/null +++ b/Content/Vefects/Stylized_Fire/Demo/Stylized_Female_Character_Vexa/SK/Vefects_Vexa_Skeleton.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:15bb69e983b259b1d9263019635d14fc8b5944b88e18fab7922748850efa569e +size 15053 diff --git a/Content/Vefects/Stylized_Fire/Demo/Stylized_Female_Character_Vexa/Textures/Body/T_Vexa_Body_Base_Color_Dark.uasset b/Content/Vefects/Stylized_Fire/Demo/Stylized_Female_Character_Vexa/Textures/Body/T_Vexa_Body_Base_Color_Dark.uasset new file mode 100644 index 0000000..f511ecd --- /dev/null +++ b/Content/Vefects/Stylized_Fire/Demo/Stylized_Female_Character_Vexa/Textures/Body/T_Vexa_Body_Base_Color_Dark.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:800fdb754cc655516bd30105c8f9d21a6d68992c1cd410711c73690cba29c4af +size 2718522 diff --git a/Content/Vefects/Stylized_Fire/Demo/Stylized_Female_Character_Vexa/Textures/Body/T_Vexa_Body_MR_01.uasset b/Content/Vefects/Stylized_Fire/Demo/Stylized_Female_Character_Vexa/Textures/Body/T_Vexa_Body_MR_01.uasset new file mode 100644 index 0000000..285eacc --- /dev/null +++ b/Content/Vefects/Stylized_Fire/Demo/Stylized_Female_Character_Vexa/Textures/Body/T_Vexa_Body_MR_01.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:d8ecdc6880fda03cb8d2713de207c8ca487bfc7ec7fe9276127811e24cf37650 +size 37018 diff --git a/Content/Vefects/Stylized_Fire/Demo/Stylized_Female_Character_Vexa/Textures/Body/T_Vexa_Body_Normal.uasset b/Content/Vefects/Stylized_Fire/Demo/Stylized_Female_Character_Vexa/Textures/Body/T_Vexa_Body_Normal.uasset new file mode 100644 index 0000000..a071ebf --- /dev/null +++ b/Content/Vefects/Stylized_Fire/Demo/Stylized_Female_Character_Vexa/Textures/Body/T_Vexa_Body_Normal.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:48af12e3b0c815ca46c9bf427f2fca78472c6812c653b9a0aa20b3a6519142e2 +size 16971983 diff --git a/Content/Vefects/Stylized_Fire/Demo/Stylized_Female_Character_Vexa/Textures/Hair/T_Vexa_Hair_Base_Color_Dark.uasset b/Content/Vefects/Stylized_Fire/Demo/Stylized_Female_Character_Vexa/Textures/Hair/T_Vexa_Hair_Base_Color_Dark.uasset new file mode 100644 index 0000000..05ce654 --- /dev/null +++ b/Content/Vefects/Stylized_Fire/Demo/Stylized_Female_Character_Vexa/Textures/Hair/T_Vexa_Hair_Base_Color_Dark.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:465fb0b57fc5259913da6cb956158cb09a6e32615ec67a2a8ea2cf820cc733ac +size 1813388 diff --git a/Content/Vefects/Stylized_Fire/Demo/Stylized_Female_Character_Vexa/Textures/Hair/T_Vexa_Hair_Base_Color_Grayscale.uasset b/Content/Vefects/Stylized_Fire/Demo/Stylized_Female_Character_Vexa/Textures/Hair/T_Vexa_Hair_Base_Color_Grayscale.uasset new file mode 100644 index 0000000..f49ec78 --- /dev/null +++ b/Content/Vefects/Stylized_Fire/Demo/Stylized_Female_Character_Vexa/Textures/Hair/T_Vexa_Hair_Base_Color_Grayscale.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:eb0e14ad301138ac2c57bc008d6777cf7e6d2fbc88a4b2d55cd70dab70e9c2e0 +size 1159394 diff --git a/Content/Vefects/Stylized_Fire/Demo/Stylized_Female_Character_Vexa/Textures/Hair/T_Vexa_Hair_MR_01.uasset b/Content/Vefects/Stylized_Fire/Demo/Stylized_Female_Character_Vexa/Textures/Hair/T_Vexa_Hair_MR_01.uasset new file mode 100644 index 0000000..80f6659 --- /dev/null +++ b/Content/Vefects/Stylized_Fire/Demo/Stylized_Female_Character_Vexa/Textures/Hair/T_Vexa_Hair_MR_01.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:da24d94821e2d76241c27f18381468799782ec14d95beca54d798436de87fb2e +size 24351 diff --git a/Content/Vefects/Stylized_Fire/Demo/Stylized_Female_Character_Vexa/Textures/Hair/T_Vexa_Hair_Normal.uasset b/Content/Vefects/Stylized_Fire/Demo/Stylized_Female_Character_Vexa/Textures/Hair/T_Vexa_Hair_Normal.uasset new file mode 100644 index 0000000..0f6b358 --- /dev/null +++ b/Content/Vefects/Stylized_Fire/Demo/Stylized_Female_Character_Vexa/Textures/Hair/T_Vexa_Hair_Normal.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:9356566c87efc220fc7aa843187e798ad83fed55c7252d0be58b701c2b2611ed +size 15996620 diff --git a/Content/Vefects/Stylized_Fire/Demo/Stylized_Female_Character_Vexa/Textures/Jacket/T_Vexa_Jacket_Base_Color_Dark.uasset b/Content/Vefects/Stylized_Fire/Demo/Stylized_Female_Character_Vexa/Textures/Jacket/T_Vexa_Jacket_Base_Color_Dark.uasset new file mode 100644 index 0000000..31eafea --- /dev/null +++ b/Content/Vefects/Stylized_Fire/Demo/Stylized_Female_Character_Vexa/Textures/Jacket/T_Vexa_Jacket_Base_Color_Dark.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:47d9bf91b7c36c7a28d26d023934e0e1201d1669a99ea1fbd7c6c994b6c6149a +size 2555747 diff --git a/Content/Vefects/Stylized_Fire/Demo/Stylized_Female_Character_Vexa/Textures/Jacket/T_Vexa_Jacket_Base_Color_Grayscale.uasset b/Content/Vefects/Stylized_Fire/Demo/Stylized_Female_Character_Vexa/Textures/Jacket/T_Vexa_Jacket_Base_Color_Grayscale.uasset new file mode 100644 index 0000000..3f887b9 --- /dev/null +++ b/Content/Vefects/Stylized_Fire/Demo/Stylized_Female_Character_Vexa/Textures/Jacket/T_Vexa_Jacket_Base_Color_Grayscale.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:231183ce9cf71df07b7a48285fe2e6521187106f35def8d78f62907c4882d82e +size 1446060 diff --git a/Content/Vefects/Stylized_Fire/Demo/Stylized_Female_Character_Vexa/Textures/Jacket/T_Vexa_Jacket_MR_01.uasset b/Content/Vefects/Stylized_Fire/Demo/Stylized_Female_Character_Vexa/Textures/Jacket/T_Vexa_Jacket_MR_01.uasset new file mode 100644 index 0000000..e6afc3d --- /dev/null +++ b/Content/Vefects/Stylized_Fire/Demo/Stylized_Female_Character_Vexa/Textures/Jacket/T_Vexa_Jacket_MR_01.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:7a47c0c73b92bf361a69ae9c08bf1303cb8dda0d16457b1c81abf90fd58b977d +size 47002 diff --git a/Content/Vefects/Stylized_Fire/Demo/Stylized_Female_Character_Vexa/Textures/Jacket/T_Vexa_Jacket_Normal.uasset b/Content/Vefects/Stylized_Fire/Demo/Stylized_Female_Character_Vexa/Textures/Jacket/T_Vexa_Jacket_Normal.uasset new file mode 100644 index 0000000..deeda67 --- /dev/null +++ b/Content/Vefects/Stylized_Fire/Demo/Stylized_Female_Character_Vexa/Textures/Jacket/T_Vexa_Jacket_Normal.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:596f3f871ed01b430316cf7f28aed8c5a193f42e3ed3af6af9f43f2fd867546d +size 17040019 diff --git a/Content/Vefects/Stylized_Fire/Demo/Stylized_Female_Character_Vexa/Textures/Logo/T_Vefects_Vexa_Custom_Logo_01_Mask.uasset b/Content/Vefects/Stylized_Fire/Demo/Stylized_Female_Character_Vexa/Textures/Logo/T_Vefects_Vexa_Custom_Logo_01_Mask.uasset new file mode 100644 index 0000000..a827c59 --- /dev/null +++ b/Content/Vefects/Stylized_Fire/Demo/Stylized_Female_Character_Vexa/Textures/Logo/T_Vefects_Vexa_Custom_Logo_01_Mask.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:4f920fd27b39dadf6878409336f067257c0c83f4bffbb3370daf4ea9244c7eba +size 101842 diff --git a/Content/Vefects/Stylized_Fire/Demo/Stylized_Female_Character_Vexa/Textures/Logo/T_Vefects_Vexa_Custom_Logo_01_Normal.uasset b/Content/Vefects/Stylized_Fire/Demo/Stylized_Female_Character_Vexa/Textures/Logo/T_Vefects_Vexa_Custom_Logo_01_Normal.uasset new file mode 100644 index 0000000..fbcf25c --- /dev/null +++ b/Content/Vefects/Stylized_Fire/Demo/Stylized_Female_Character_Vexa/Textures/Logo/T_Vefects_Vexa_Custom_Logo_01_Normal.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:b9c02548fa8c61051d912c103796dd8846f461ee57ac5aa9b53c6ae2c59eb33e +size 1078303 diff --git a/Content/Vefects/Stylized_Fire/Demo/_Extra/Demo/Extra/Materials/MI_Extra_Frame_01.uasset b/Content/Vefects/Stylized_Fire/Demo/_Extra/Demo/Extra/Materials/MI_Extra_Frame_01.uasset new file mode 100644 index 0000000..490c0a1 --- /dev/null +++ b/Content/Vefects/Stylized_Fire/Demo/_Extra/Demo/Extra/Materials/MI_Extra_Frame_01.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:970b70c7719d84da601d8fd3f9348bd130dc2a935599c551cb6ebec1584d4659 +size 81050 diff --git a/Content/Vefects/Stylized_Fire/Demo/_Extra/Demo/Extra/Materials/MI_Extra_Learn_VFX.uasset b/Content/Vefects/Stylized_Fire/Demo/_Extra/Demo/Extra/Materials/MI_Extra_Learn_VFX.uasset new file mode 100644 index 0000000..a542844 --- /dev/null +++ b/Content/Vefects/Stylized_Fire/Demo/_Extra/Demo/Extra/Materials/MI_Extra_Learn_VFX.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:4b98fb6fc4290a29dcd43c43d9d3535381443edd5d29967211d4e1627ebb9ca7 +size 126163 diff --git a/Content/Vefects/Stylized_Fire/Demo/_Extra/Demo/Extra/Materials/MI_Extra_Vefects_Book_01.uasset b/Content/Vefects/Stylized_Fire/Demo/_Extra/Demo/Extra/Materials/MI_Extra_Vefects_Book_01.uasset new file mode 100644 index 0000000..059278c --- /dev/null +++ b/Content/Vefects/Stylized_Fire/Demo/_Extra/Demo/Extra/Materials/MI_Extra_Vefects_Book_01.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:9529b37e5bf9bd15b666dcbb63351ce52d012461987d1bbd06ce73a506c50fc8 +size 131065 diff --git a/Content/Vefects/Stylized_Fire/Demo/_Extra/Demo/Extra/Materials/MI_Extra_Vefects_Bundle_01.uasset b/Content/Vefects/Stylized_Fire/Demo/_Extra/Demo/Extra/Materials/MI_Extra_Vefects_Bundle_01.uasset new file mode 100644 index 0000000..dec8d67 --- /dev/null +++ b/Content/Vefects/Stylized_Fire/Demo/_Extra/Demo/Extra/Materials/MI_Extra_Vefects_Bundle_01.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:d41c4b10a56dc1255a354c5f70ecb4479e8c7b9d447234106f1fa18d5c0fa25d +size 139783 diff --git a/Content/Vefects/Stylized_Fire/Demo/_Extra/Demo/Extra/Materials/MI_Extra_Vefects_Bundle_02.uasset b/Content/Vefects/Stylized_Fire/Demo/_Extra/Demo/Extra/Materials/MI_Extra_Vefects_Bundle_02.uasset new file mode 100644 index 0000000..8b6dfe6 --- /dev/null +++ b/Content/Vefects/Stylized_Fire/Demo/_Extra/Demo/Extra/Materials/MI_Extra_Vefects_Bundle_02.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:0220c8c607512ea3cb6768ee87b56eb9ea79463b7022f54d4ed4ea83ed527391 +size 135014 diff --git a/Content/Vefects/Stylized_Fire/Demo/_Extra/Demo/Extra/Materials/MI_Extra_Vefects_Bundle_03.uasset b/Content/Vefects/Stylized_Fire/Demo/_Extra/Demo/Extra/Materials/MI_Extra_Vefects_Bundle_03.uasset new file mode 100644 index 0000000..671e498 --- /dev/null +++ b/Content/Vefects/Stylized_Fire/Demo/_Extra/Demo/Extra/Materials/MI_Extra_Vefects_Bundle_03.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:82ea172d975402461febbc19ecca33c20ca45118523971d42e33317120e9765f +size 114127 diff --git a/Content/Vefects/Stylized_Fire/Demo/_Extra/Demo/Extra/Materials/MI_Extra_Vefects_Bundle_04.uasset b/Content/Vefects/Stylized_Fire/Demo/_Extra/Demo/Extra/Materials/MI_Extra_Vefects_Bundle_04.uasset new file mode 100644 index 0000000..01a66b6 --- /dev/null +++ b/Content/Vefects/Stylized_Fire/Demo/_Extra/Demo/Extra/Materials/MI_Extra_Vefects_Bundle_04.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:f62fd125d8db458e85ed2846168453f4e40ba1c5707dc2b6301dbdfb4b9ff85a +size 134533 diff --git a/Content/Vefects/Stylized_Fire/Demo/_Extra/Demo/Extra/Materials/MI_Extra_Vefects_Bundle_05.uasset b/Content/Vefects/Stylized_Fire/Demo/_Extra/Demo/Extra/Materials/MI_Extra_Vefects_Bundle_05.uasset new file mode 100644 index 0000000..29201a0 --- /dev/null +++ b/Content/Vefects/Stylized_Fire/Demo/_Extra/Demo/Extra/Materials/MI_Extra_Vefects_Bundle_05.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:0904b6c6365553457a8664edd35c8c8ab919dca39527314fc46ece4690650066 +size 132703 diff --git a/Content/Vefects/Stylized_Fire/Demo/_Extra/Demo/Extra/Materials/MI_Extra_Vefects_Bundle_06.uasset b/Content/Vefects/Stylized_Fire/Demo/_Extra/Demo/Extra/Materials/MI_Extra_Vefects_Bundle_06.uasset new file mode 100644 index 0000000..bd20790 --- /dev/null +++ b/Content/Vefects/Stylized_Fire/Demo/_Extra/Demo/Extra/Materials/MI_Extra_Vefects_Bundle_06.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:08bfb49f9eac72dd2fdc542248d4b27293dc466d6399713330e5a8fae6db5d37 +size 112960 diff --git a/Content/Vefects/Stylized_Fire/Demo/_Extra/Demo/Extra/Materials/MI_Extra_Vefects_Bundle_07.uasset b/Content/Vefects/Stylized_Fire/Demo/_Extra/Demo/Extra/Materials/MI_Extra_Vefects_Bundle_07.uasset new file mode 100644 index 0000000..d3aacda --- /dev/null +++ b/Content/Vefects/Stylized_Fire/Demo/_Extra/Demo/Extra/Materials/MI_Extra_Vefects_Bundle_07.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:59df7739e3c67f786a44330cb2162457b4e0c5cda2af15d58d07698e7b0d9100 +size 132225 diff --git a/Content/Vefects/Stylized_Fire/Demo/_Extra/Demo/Extra/Materials/MI_Extra_Vefects_Bundle_08.uasset b/Content/Vefects/Stylized_Fire/Demo/_Extra/Demo/Extra/Materials/MI_Extra_Vefects_Bundle_08.uasset new file mode 100644 index 0000000..7ed7bf6 --- /dev/null +++ b/Content/Vefects/Stylized_Fire/Demo/_Extra/Demo/Extra/Materials/MI_Extra_Vefects_Bundle_08.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:c164894d5c06af3a772f4e02590b4dbdc75da6dfbe5618ac25a2464b054964ac +size 147088 diff --git a/Content/Vefects/Stylized_Fire/Demo/_Extra/Demo/Extra/Materials/MI_Extra_Vefects_Bundle_09.uasset b/Content/Vefects/Stylized_Fire/Demo/_Extra/Demo/Extra/Materials/MI_Extra_Vefects_Bundle_09.uasset new file mode 100644 index 0000000..7ac3e9d --- /dev/null +++ b/Content/Vefects/Stylized_Fire/Demo/_Extra/Demo/Extra/Materials/MI_Extra_Vefects_Bundle_09.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:80eae86de08ef818b7ccfefed25283325afb5433d5f41c7964ae5d7ae9b10e65 +size 118032 diff --git a/Content/Vefects/Stylized_Fire/Demo/_Extra/Demo/Extra/Materials/MI_Extra_Vefects_Bundle_10.uasset b/Content/Vefects/Stylized_Fire/Demo/_Extra/Demo/Extra/Materials/MI_Extra_Vefects_Bundle_10.uasset new file mode 100644 index 0000000..a5bd416 --- /dev/null +++ b/Content/Vefects/Stylized_Fire/Demo/_Extra/Demo/Extra/Materials/MI_Extra_Vefects_Bundle_10.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:00d3de7d454570af33b3e500a4f00bbd9f60be340ac7d6729a9a6b7335241b9c +size 128316 diff --git a/Content/Vefects/Stylized_Fire/Demo/_Extra/Demo/Extra/Materials/MI_Extra_Vefects_Bundle_11.uasset b/Content/Vefects/Stylized_Fire/Demo/_Extra/Demo/Extra/Materials/MI_Extra_Vefects_Bundle_11.uasset new file mode 100644 index 0000000..0966c16 --- /dev/null +++ b/Content/Vefects/Stylized_Fire/Demo/_Extra/Demo/Extra/Materials/MI_Extra_Vefects_Bundle_11.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:2aacf48e93fa7b7cadb5c43a888317c34b9aa8d05ac4cdcd994f9dc2d7df3ae1 +size 120213 diff --git a/Content/Vefects/Stylized_Fire/Demo/_Extra/Demo/Extra/Materials/MI_Extra_Vefects_Bundle_12.uasset b/Content/Vefects/Stylized_Fire/Demo/_Extra/Demo/Extra/Materials/MI_Extra_Vefects_Bundle_12.uasset new file mode 100644 index 0000000..1942113 --- /dev/null +++ b/Content/Vefects/Stylized_Fire/Demo/_Extra/Demo/Extra/Materials/MI_Extra_Vefects_Bundle_12.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:3a8c3b6d41f62433d4f6cb00835fb74a3432801ab256b5c5e9a64ad8cf14bc72 +size 127125 diff --git a/Content/Vefects/Stylized_Fire/Demo/_Extra/Demo/Extra/Materials/MI_Extra_Vefects_Bundle_13.uasset b/Content/Vefects/Stylized_Fire/Demo/_Extra/Demo/Extra/Materials/MI_Extra_Vefects_Bundle_13.uasset new file mode 100644 index 0000000..74caf03 --- /dev/null +++ b/Content/Vefects/Stylized_Fire/Demo/_Extra/Demo/Extra/Materials/MI_Extra_Vefects_Bundle_13.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:e384165b6e27d10a0ff54059ff5c84967a9d540c457258ec7b68f3ea0aac515f +size 138146 diff --git a/Content/Vefects/Stylized_Fire/Demo/_Extra/Demo/Extra/Materials/MI_Extra_Vefects_Bundle_14.uasset b/Content/Vefects/Stylized_Fire/Demo/_Extra/Demo/Extra/Materials/MI_Extra_Vefects_Bundle_14.uasset new file mode 100644 index 0000000..8eadccd --- /dev/null +++ b/Content/Vefects/Stylized_Fire/Demo/_Extra/Demo/Extra/Materials/MI_Extra_Vefects_Bundle_14.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:502293c43c653d6dfa60af80c9e9fc6dbd1b2546e26598c58f18ce83b00a8b35 +size 131627 diff --git a/Content/Vefects/Stylized_Fire/Demo/_Extra/Demo/Extra/Materials/MI_Extra_Vefects_Bundle_15.uasset b/Content/Vefects/Stylized_Fire/Demo/_Extra/Demo/Extra/Materials/MI_Extra_Vefects_Bundle_15.uasset new file mode 100644 index 0000000..08ac0dc --- /dev/null +++ b/Content/Vefects/Stylized_Fire/Demo/_Extra/Demo/Extra/Materials/MI_Extra_Vefects_Bundle_15.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:98154a27026cb7ff740953fe236c6019b293129b23b29ec928d5f9640e28c458 +size 131500 diff --git a/Content/Vefects/Stylized_Fire/Demo/_Extra/Demo/Extra/Materials/MI_Extra_Vefects_Bundle_Master_01.uasset b/Content/Vefects/Stylized_Fire/Demo/_Extra/Demo/Extra/Materials/MI_Extra_Vefects_Bundle_Master_01.uasset new file mode 100644 index 0000000..3462326 --- /dev/null +++ b/Content/Vefects/Stylized_Fire/Demo/_Extra/Demo/Extra/Materials/MI_Extra_Vefects_Bundle_Master_01.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:a83f3a531445b1601fbae6263fd6a8a974d311341d414b549c746fcc9062f2a7 +size 131224 diff --git a/Content/Vefects/Stylized_Fire/Demo/_Extra/Demo/Extra/Materials/MI_Opaque_02.uasset b/Content/Vefects/Stylized_Fire/Demo/_Extra/Demo/Extra/Materials/MI_Opaque_02.uasset new file mode 100644 index 0000000..45947ab --- /dev/null +++ b/Content/Vefects/Stylized_Fire/Demo/_Extra/Demo/Extra/Materials/MI_Opaque_02.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:5dc24c586f22754d0159f0ea430180271bc9c414f50834441658d57cd5a28166 +size 108862 diff --git a/Content/Vefects/Stylized_Fire/Demo/_Extra/Demo/Extra/Materials/MI_Opaque_Dark_01.uasset b/Content/Vefects/Stylized_Fire/Demo/_Extra/Demo/Extra/Materials/MI_Opaque_Dark_01.uasset new file mode 100644 index 0000000..eccf2d4 --- /dev/null +++ b/Content/Vefects/Stylized_Fire/Demo/_Extra/Demo/Extra/Materials/MI_Opaque_Dark_01.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:5eff9703018d35b72fe1295c85fe6fd96d59084d35df4864437173eaff0f42ca +size 90429 diff --git a/Content/Vefects/Stylized_Fire/Demo/_Extra/Demo/Extra/Materials/MI_Opaque_Fresnel_01.uasset b/Content/Vefects/Stylized_Fire/Demo/_Extra/Demo/Extra/Materials/MI_Opaque_Fresnel_01.uasset new file mode 100644 index 0000000..003612f --- /dev/null +++ b/Content/Vefects/Stylized_Fire/Demo/_Extra/Demo/Extra/Materials/MI_Opaque_Fresnel_01.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:d2161a6fb095ea8c2dab5d8944eb965ecbbabdb7762aac57aa22bd4b9a115ba9 +size 132715 diff --git a/Content/Vefects/Stylized_Fire/Demo/_Extra/Demo/Extra/Materials/MI_Opaque_Fresnel_02.uasset b/Content/Vefects/Stylized_Fire/Demo/_Extra/Demo/Extra/Materials/MI_Opaque_Fresnel_02.uasset new file mode 100644 index 0000000..9f7c511 --- /dev/null +++ b/Content/Vefects/Stylized_Fire/Demo/_Extra/Demo/Extra/Materials/MI_Opaque_Fresnel_02.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:c9b9829918740e6a50f5a3ec723b8d13557655f8a5106ddcb5f8e1c52ee35793 +size 125744 diff --git a/Content/Vefects/Stylized_Fire/Demo/_Extra/Demo/Extra/Materials/MI_Opaque_Fresnel_03.uasset b/Content/Vefects/Stylized_Fire/Demo/_Extra/Demo/Extra/Materials/MI_Opaque_Fresnel_03.uasset new file mode 100644 index 0000000..635e866 --- /dev/null +++ b/Content/Vefects/Stylized_Fire/Demo/_Extra/Demo/Extra/Materials/MI_Opaque_Fresnel_03.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:b6f664911966ff99291217bc84cc80590724b1f9435da061ab7a1f40ce436bce +size 128630 diff --git a/Content/Vefects/Stylized_Fire/Demo/_Extra/Demo/Extra/Materials/MI_Opaque_Fresnel_04.uasset b/Content/Vefects/Stylized_Fire/Demo/_Extra/Demo/Extra/Materials/MI_Opaque_Fresnel_04.uasset new file mode 100644 index 0000000..8bfbdb0 --- /dev/null +++ b/Content/Vefects/Stylized_Fire/Demo/_Extra/Demo/Extra/Materials/MI_Opaque_Fresnel_04.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:c7db77bc07b2eb9a0a09992648036ed10c316537cbe51a872fd67f9bf71723fd +size 128173 diff --git a/Content/Vefects/Stylized_Fire/Demo/_Extra/Demo/Extra/Materials/MI_Opaque_Fresnel_05.uasset b/Content/Vefects/Stylized_Fire/Demo/_Extra/Demo/Extra/Materials/MI_Opaque_Fresnel_05.uasset new file mode 100644 index 0000000..6673bd2 --- /dev/null +++ b/Content/Vefects/Stylized_Fire/Demo/_Extra/Demo/Extra/Materials/MI_Opaque_Fresnel_05.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:ea815496fd91c613739f188337f256f51032fd7736ac85ccb41c38153dbf9dbd +size 127644 diff --git a/Content/Vefects/Stylized_Fire/Demo/_Extra/Demo/Extra/Materials/MI_Opaque_Fresnel_06.uasset b/Content/Vefects/Stylized_Fire/Demo/_Extra/Demo/Extra/Materials/MI_Opaque_Fresnel_06.uasset new file mode 100644 index 0000000..fbb119b --- /dev/null +++ b/Content/Vefects/Stylized_Fire/Demo/_Extra/Demo/Extra/Materials/MI_Opaque_Fresnel_06.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:2a2dc74164d1530bef5c31a6214cc96e91467b3594aeddfd90a806af5a61c681 +size 124979 diff --git a/Content/Vefects/Stylized_Fire/Demo/_Extra/Demo/Extra/Materials/MI_Opaque_Fresnel_07.uasset b/Content/Vefects/Stylized_Fire/Demo/_Extra/Demo/Extra/Materials/MI_Opaque_Fresnel_07.uasset new file mode 100644 index 0000000..caaef33 --- /dev/null +++ b/Content/Vefects/Stylized_Fire/Demo/_Extra/Demo/Extra/Materials/MI_Opaque_Fresnel_07.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:90175337e55711296353666210474ea87012ccda8c7738a416bc86387831acd9 +size 130503 diff --git a/Content/Vefects/Stylized_Fire/Demo/_Extra/Demo/Extra/Materials/MI_Opaque_Fresnel_08.uasset b/Content/Vefects/Stylized_Fire/Demo/_Extra/Demo/Extra/Materials/MI_Opaque_Fresnel_08.uasset new file mode 100644 index 0000000..6c8c18b --- /dev/null +++ b/Content/Vefects/Stylized_Fire/Demo/_Extra/Demo/Extra/Materials/MI_Opaque_Fresnel_08.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:cc73313162b71cd2bd105abaf2ee30e288d03d51441523268292eaa861cbbe82 +size 138356 diff --git a/Content/Vefects/Stylized_Fire/Demo/_Extra/Demo/Extra/Materials/MI_Opaque_Fresnel_09.uasset b/Content/Vefects/Stylized_Fire/Demo/_Extra/Demo/Extra/Materials/MI_Opaque_Fresnel_09.uasset new file mode 100644 index 0000000..17da7ca --- /dev/null +++ b/Content/Vefects/Stylized_Fire/Demo/_Extra/Demo/Extra/Materials/MI_Opaque_Fresnel_09.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:142a2a871ddedcf6135337a326cc56f2143cc9ba8542c868e565b9321514b0dc +size 127202 diff --git a/Content/Vefects/Stylized_Fire/Demo/_Extra/Demo/Extra/Materials/MI_Text_01.uasset b/Content/Vefects/Stylized_Fire/Demo/_Extra/Demo/Extra/Materials/MI_Text_01.uasset new file mode 100644 index 0000000..7a7d56c --- /dev/null +++ b/Content/Vefects/Stylized_Fire/Demo/_Extra/Demo/Extra/Materials/MI_Text_01.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:172c03afcf6905dcfac39315ce8148d04bb188d7396226304b0e5575e7d31cd3 +size 97287 diff --git a/Content/Vefects/Stylized_Fire/Demo/_Extra/Demo/Extra/Materials/M_Extra_Billboard.uasset b/Content/Vefects/Stylized_Fire/Demo/_Extra/Demo/Extra/Materials/M_Extra_Billboard.uasset new file mode 100644 index 0000000..a760c85 --- /dev/null +++ b/Content/Vefects/Stylized_Fire/Demo/_Extra/Demo/Extra/Materials/M_Extra_Billboard.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:4a8593b96f93d42a02933e8d79915804ce2649f7c52efebe3a59e8aeb57a07e5 +size 138080 diff --git a/Content/Vefects/Stylized_Fire/Demo/_Extra/Demo/Extra/Materials/M_Extra_Frame.uasset b/Content/Vefects/Stylized_Fire/Demo/_Extra/Demo/Extra/Materials/M_Extra_Frame.uasset new file mode 100644 index 0000000..7bf5552 --- /dev/null +++ b/Content/Vefects/Stylized_Fire/Demo/_Extra/Demo/Extra/Materials/M_Extra_Frame.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:598c604e8dde73cbd63c9a7ec81e1028f479941169dd74950e89a47e0ac1bda9 +size 86792 diff --git a/Content/Vefects/Stylized_Fire/Demo/_Extra/Demo/Extra/Materials/M_Opaque.uasset b/Content/Vefects/Stylized_Fire/Demo/_Extra/Demo/Extra/Materials/M_Opaque.uasset new file mode 100644 index 0000000..09af541 --- /dev/null +++ b/Content/Vefects/Stylized_Fire/Demo/_Extra/Demo/Extra/Materials/M_Opaque.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:fc8aa2d1dfa6a58f22e5f49bbf37fc3ed8da7a4a98e67426d4464f4d27a24886 +size 90761 diff --git a/Content/Vefects/Stylized_Fire/Demo/_Extra/Demo/Extra/Materials/M_Opaque_Fresnel.uasset b/Content/Vefects/Stylized_Fire/Demo/_Extra/Demo/Extra/Materials/M_Opaque_Fresnel.uasset new file mode 100644 index 0000000..3f964d2 --- /dev/null +++ b/Content/Vefects/Stylized_Fire/Demo/_Extra/Demo/Extra/Materials/M_Opaque_Fresnel.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:763c50bc26aac2cde4d7af3ec28381d49d70ab8e4ef95a23530d857ab30c3fc6 +size 161038 diff --git a/Content/Vefects/Stylized_Fire/Demo/_Extra/Demo/Extra/Materials/M_Text_01.uasset b/Content/Vefects/Stylized_Fire/Demo/_Extra/Demo/Extra/Materials/M_Text_01.uasset new file mode 100644 index 0000000..f38a89a --- /dev/null +++ b/Content/Vefects/Stylized_Fire/Demo/_Extra/Demo/Extra/Materials/M_Text_01.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:245069a51a4c166076bcbd9a47b6c95a77e0c47ef03d848f2a2e263d15742d08 +size 104474 diff --git a/Content/Vefects/Stylized_Fire/Demo/_Extra/Demo/Extra/SM/SM_Extra_Billboard_01.uasset b/Content/Vefects/Stylized_Fire/Demo/_Extra/Demo/Extra/SM/SM_Extra_Billboard_01.uasset new file mode 100644 index 0000000..76df1da --- /dev/null +++ b/Content/Vefects/Stylized_Fire/Demo/_Extra/Demo/Extra/SM/SM_Extra_Billboard_01.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:60b26bc6a2a01c34c3210d21ce48017da2a4d949513efa6911e5909bfd7e36e6 +size 114672 diff --git a/Content/Vefects/Stylized_Fire/Demo/_Extra/Demo/Extra/SM/SM_Extra_Billboard_Base_01.uasset b/Content/Vefects/Stylized_Fire/Demo/_Extra/Demo/Extra/SM/SM_Extra_Billboard_Base_01.uasset new file mode 100644 index 0000000..4702610 --- /dev/null +++ b/Content/Vefects/Stylized_Fire/Demo/_Extra/Demo/Extra/SM/SM_Extra_Billboard_Base_01.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:b556572a71148d4332d4ea8e0dc9b89c285c3aea71b8b18234c3c9b31e60053c +size 87488 diff --git a/Content/Vefects/Stylized_Fire/Demo/_Extra/Demo/Extra/Textures/T_Learn_VFX.uasset b/Content/Vefects/Stylized_Fire/Demo/_Extra/Demo/Extra/Textures/T_Learn_VFX.uasset new file mode 100644 index 0000000..8253f3c --- /dev/null +++ b/Content/Vefects/Stylized_Fire/Demo/_Extra/Demo/Extra/Textures/T_Learn_VFX.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:15961974f063a76bc5f0eba512cfec07a34202242f5657dda909cb7d6f074ceb +size 1602162 diff --git a/Content/Vefects/Stylized_Fire/Demo/_Extra/Demo/Extra/Textures/T_Vefects_Anime_Stylized_VFX.uasset b/Content/Vefects/Stylized_Fire/Demo/_Extra/Demo/Extra/Textures/T_Vefects_Anime_Stylized_VFX.uasset new file mode 100644 index 0000000..a643a4c --- /dev/null +++ b/Content/Vefects/Stylized_Fire/Demo/_Extra/Demo/Extra/Textures/T_Vefects_Anime_Stylized_VFX.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:5d5db09942fb6eb2ecbd2ec14b3cfc5850aeb66984388cac8bb9c0030e1cffde +size 594692 diff --git a/Content/Vefects/Stylized_Fire/Demo/_Extra/Demo/Extra/Textures/T_Vefects_Anime_VFX.uasset b/Content/Vefects/Stylized_Fire/Demo/_Extra/Demo/Extra/Textures/T_Vefects_Anime_VFX.uasset new file mode 100644 index 0000000..cab86ad --- /dev/null +++ b/Content/Vefects/Stylized_Fire/Demo/_Extra/Demo/Extra/Textures/T_Vefects_Anime_VFX.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:e1eb7199816a9ba0b34f174b1f575ba032dea3ce3ae104b0bf59ba5a73ce72be +size 526358 diff --git a/Content/Vefects/Stylized_Fire/Demo/_Extra/Demo/Extra/Textures/T_Vefects_Blood_VFX.uasset b/Content/Vefects/Stylized_Fire/Demo/_Extra/Demo/Extra/Textures/T_Vefects_Blood_VFX.uasset new file mode 100644 index 0000000..c2cedba --- /dev/null +++ b/Content/Vefects/Stylized_Fire/Demo/_Extra/Demo/Extra/Textures/T_Vefects_Blood_VFX.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:77ef20692b3e9ce4b9f8e80b3d47d7bfe1688814b577599291ec8a3792cefd8e +size 841558 diff --git a/Content/Vefects/Stylized_Fire/Demo/_Extra/Demo/Extra/Textures/T_Vefects_Explosions_VFX.uasset b/Content/Vefects/Stylized_Fire/Demo/_Extra/Demo/Extra/Textures/T_Vefects_Explosions_VFX.uasset new file mode 100644 index 0000000..f1b9343 --- /dev/null +++ b/Content/Vefects/Stylized_Fire/Demo/_Extra/Demo/Extra/Textures/T_Vefects_Explosions_VFX.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:3c836c544a16416aa89dba1fb624abd6ffeeccf749b1570c190bc9a836e1c620 +size 834861 diff --git a/Content/Vefects/Stylized_Fire/Demo/_Extra/Demo/Extra/Textures/T_Vefects_Flipbook_VFX.uasset b/Content/Vefects/Stylized_Fire/Demo/_Extra/Demo/Extra/Textures/T_Vefects_Flipbook_VFX.uasset new file mode 100644 index 0000000..fdc5a0f --- /dev/null +++ b/Content/Vefects/Stylized_Fire/Demo/_Extra/Demo/Extra/Textures/T_Vefects_Flipbook_VFX.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:f74a1d17ec64870f1fb642b02146f840734e76917cc46786a356b545eeeed386 +size 645966 diff --git a/Content/Vefects/Stylized_Fire/Demo/_Extra/Demo/Extra/Textures/T_Vefects_Item_Pickup_VFX.uasset b/Content/Vefects/Stylized_Fire/Demo/_Extra/Demo/Extra/Textures/T_Vefects_Item_Pickup_VFX.uasset new file mode 100644 index 0000000..8e1a814 --- /dev/null +++ b/Content/Vefects/Stylized_Fire/Demo/_Extra/Demo/Extra/Textures/T_Vefects_Item_Pickup_VFX.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:f877f169642aa5d62384bbd8d9d2a4fc7e2363d3d97706e2ada36b0f36357ba3 +size 575460 diff --git a/Content/Vefects/Stylized_Fire/Demo/_Extra/Demo/Extra/Textures/T_Vefects_Loot_VFX.uasset b/Content/Vefects/Stylized_Fire/Demo/_Extra/Demo/Extra/Textures/T_Vefects_Loot_VFX.uasset new file mode 100644 index 0000000..0bb5bdf --- /dev/null +++ b/Content/Vefects/Stylized_Fire/Demo/_Extra/Demo/Extra/Textures/T_Vefects_Loot_VFX.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:214d28c6bee3c23f147892f97625808f9407fcbe8bca7bec96f5033ada55ae00 +size 760965 diff --git a/Content/Vefects/Stylized_Fire/Demo/_Extra/Demo/Extra/Textures/T_Vefects_Realistic_Water_VFX.uasset b/Content/Vefects/Stylized_Fire/Demo/_Extra/Demo/Extra/Textures/T_Vefects_Realistic_Water_VFX.uasset new file mode 100644 index 0000000..9612c42 --- /dev/null +++ b/Content/Vefects/Stylized_Fire/Demo/_Extra/Demo/Extra/Textures/T_Vefects_Realistic_Water_VFX.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:fd2b67f1cd156ba7a7bbfb323ca484b92a3dbbe677dd52b861e9c6dbf4239b70 +size 827499 diff --git a/Content/Vefects/Stylized_Fire/Demo/_Extra/Demo/Extra/Textures/T_Vefects_Sand_VFX.uasset b/Content/Vefects/Stylized_Fire/Demo/_Extra/Demo/Extra/Textures/T_Vefects_Sand_VFX.uasset new file mode 100644 index 0000000..41ba866 --- /dev/null +++ b/Content/Vefects/Stylized_Fire/Demo/_Extra/Demo/Extra/Textures/T_Vefects_Sand_VFX.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:65d5e1648d9a129981348fde1a7727d5281889231a0ab9f266885bba23cb8da0 +size 976768 diff --git a/Content/Vefects/Stylized_Fire/Demo/_Extra/Demo/Extra/Textures/T_Vefects_Shots_VFX.uasset b/Content/Vefects/Stylized_Fire/Demo/_Extra/Demo/Extra/Textures/T_Vefects_Shots_VFX.uasset new file mode 100644 index 0000000..77e140d --- /dev/null +++ b/Content/Vefects/Stylized_Fire/Demo/_Extra/Demo/Extra/Textures/T_Vefects_Shots_VFX.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:53c76694d0e1669207062506ff573d9a86ecb9a2bdd205f0cf5547d7d02a97ac +size 508274 diff --git a/Content/Vefects/Stylized_Fire/Demo/_Extra/Demo/Extra/Textures/T_Vefects_Slime_VFX.uasset b/Content/Vefects/Stylized_Fire/Demo/_Extra/Demo/Extra/Textures/T_Vefects_Slime_VFX.uasset new file mode 100644 index 0000000..b04e8a5 --- /dev/null +++ b/Content/Vefects/Stylized_Fire/Demo/_Extra/Demo/Extra/Textures/T_Vefects_Slime_VFX.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:6967bec663ff0c8cf5c0949a97e4953ee6d2ae36cb0dd8a4c4acaee6b582aaeb +size 990943 diff --git a/Content/Vefects/Stylized_Fire/Demo/_Extra/Demo/Extra/Textures/T_Vefects_Smoke_Bombs_VFX.uasset b/Content/Vefects/Stylized_Fire/Demo/_Extra/Demo/Extra/Textures/T_Vefects_Smoke_Bombs_VFX.uasset new file mode 100644 index 0000000..bce6184 --- /dev/null +++ b/Content/Vefects/Stylized_Fire/Demo/_Extra/Demo/Extra/Textures/T_Vefects_Smoke_Bombs_VFX.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:510d3f3176a81800c40577279d528bbbf902d25edcabdc30bd9b7860ad574520 +size 511376 diff --git a/Content/Vefects/Stylized_Fire/Demo/_Extra/Demo/Extra/Textures/T_Vefects_Space_VFX.uasset b/Content/Vefects/Stylized_Fire/Demo/_Extra/Demo/Extra/Textures/T_Vefects_Space_VFX.uasset new file mode 100644 index 0000000..48ffdd8 --- /dev/null +++ b/Content/Vefects/Stylized_Fire/Demo/_Extra/Demo/Extra/Textures/T_Vefects_Space_VFX.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:da1c5eab64f5be76620ff338737d4fffa580a44d5abc43af6ee656936780b26d +size 1020430 diff --git a/Content/Vefects/Stylized_Fire/Demo/_Extra/Demo/Extra/Textures/T_Vefects_VFX.uasset b/Content/Vefects/Stylized_Fire/Demo/_Extra/Demo/Extra/Textures/T_Vefects_VFX.uasset new file mode 100644 index 0000000..67ceebd --- /dev/null +++ b/Content/Vefects/Stylized_Fire/Demo/_Extra/Demo/Extra/Textures/T_Vefects_VFX.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:ad4a5ebc45ae45807bba4472e09dc626b8724dddcb494e1a08223505a7b5d9b1 +size 2566547 diff --git a/Content/Vefects/Stylized_Fire/Demo/_Extra/Demo/Extra/Textures/T_Vefects_VFX_Book.uasset b/Content/Vefects/Stylized_Fire/Demo/_Extra/Demo/Extra/Textures/T_Vefects_VFX_Book.uasset new file mode 100644 index 0000000..23eb14c --- /dev/null +++ b/Content/Vefects/Stylized_Fire/Demo/_Extra/Demo/Extra/Textures/T_Vefects_VFX_Book.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:57a427b36a1e91ddc2a32eebe6cb2c85f54374c8c93235938c4142b4fcf25245 +size 1158435 diff --git a/Content/Vefects/Stylized_Fire/Demo/_Extra/Demo/Extra/Textures/T_Vefects_VFX_Mega_Bundle.uasset b/Content/Vefects/Stylized_Fire/Demo/_Extra/Demo/Extra/Textures/T_Vefects_VFX_Mega_Bundle.uasset new file mode 100644 index 0000000..23e7dd7 --- /dev/null +++ b/Content/Vefects/Stylized_Fire/Demo/_Extra/Demo/Extra/Textures/T_Vefects_VFX_Mega_Bundle.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:ccea4f154765858101a5c132986227c8e6fcf860751e0368f2c883a044e46bba +size 977303 diff --git a/Content/Vefects/Stylized_Fire/Demo/_Extra/Demo/Extra/Textures/T_Vefects_Vignette_VFX.uasset b/Content/Vefects/Stylized_Fire/Demo/_Extra/Demo/Extra/Textures/T_Vefects_Vignette_VFX.uasset new file mode 100644 index 0000000..ab8ad92 --- /dev/null +++ b/Content/Vefects/Stylized_Fire/Demo/_Extra/Demo/Extra/Textures/T_Vefects_Vignette_VFX.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:ca76f7413fa684494532f58254ecd0d1e88085d72a056f7a3a0504ae3f418c5a +size 666145 diff --git a/Content/Vefects/Stylized_Fire/Demo/_Extra/Maps/Extra.umap b/Content/Vefects/Stylized_Fire/Demo/_Extra/Maps/Extra.umap new file mode 100644 index 0000000..1225c43 --- /dev/null +++ b/Content/Vefects/Stylized_Fire/Demo/_Extra/Maps/Extra.umap @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:a61f30cb732f087b7f8cce20de4b019defba64a517cba4bcfe364c5a019c4b13 +size 130938 diff --git a/Content/Vefects/Stylized_Fire/Demo/_Extra/Maps/LearnVFX.umap b/Content/Vefects/Stylized_Fire/Demo/_Extra/Maps/LearnVFX.umap new file mode 100644 index 0000000..3f42237 --- /dev/null +++ b/Content/Vefects/Stylized_Fire/Demo/_Extra/Maps/LearnVFX.umap @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:d7508b4de73618d7f16e2deefe930207feb018001376546a4cc86d134ece5421 +size 49993 diff --git a/Content/Vefects/Stylized_Fire/Maps/Stylized_Fire_Overview.umap b/Content/Vefects/Stylized_Fire/Maps/Stylized_Fire_Overview.umap new file mode 100644 index 0000000..aeb1b88 --- /dev/null +++ b/Content/Vefects/Stylized_Fire/Maps/Stylized_Fire_Overview.umap @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:e9aea26455ddc3b735549cdf69f27c0b769781466937be03033b490133272852 +size 388971 diff --git a/Content/Vefects/Stylized_Fire/Maps/Stylized_Fire_Overview_BuiltData.uasset b/Content/Vefects/Stylized_Fire/Maps/Stylized_Fire_Overview_BuiltData.uasset new file mode 100644 index 0000000..3112483 --- /dev/null +++ b/Content/Vefects/Stylized_Fire/Maps/Stylized_Fire_Overview_BuiltData.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:1f228693c94e9e15ec855fec527d642614b143e9ac3c75088cfc070ab0717520 +size 1131324 diff --git a/Content/Vefects/Stylized_Fire/Maps/Stylized_Fire_Overview_Stack.umap b/Content/Vefects/Stylized_Fire/Maps/Stylized_Fire_Overview_Stack.umap new file mode 100644 index 0000000..842df32 --- /dev/null +++ b/Content/Vefects/Stylized_Fire/Maps/Stylized_Fire_Overview_Stack.umap @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:5a7bcdea4485178720c9c8f48a7e802f71d8fd4ca07a12835850ae5c2d7bc983 +size 245706 diff --git a/Content/Vefects/Stylized_Fire/Maps/Stylized_Fire_Overview_Stack_BuiltData.uasset b/Content/Vefects/Stylized_Fire/Maps/Stylized_Fire_Overview_Stack_BuiltData.uasset new file mode 100644 index 0000000..b7d4d75 --- /dev/null +++ b/Content/Vefects/Stylized_Fire/Maps/Stylized_Fire_Overview_Stack_BuiltData.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:7da54804df4075ed67a2c82148b482d2de7bd003711e7b171559b492e4ac474e +size 1137780 diff --git a/Content/Vefects/Stylized_Fire/Maps/Stylized_Fire_Overview_Stack_Radial.umap b/Content/Vefects/Stylized_Fire/Maps/Stylized_Fire_Overview_Stack_Radial.umap new file mode 100644 index 0000000..9df8c7f --- /dev/null +++ b/Content/Vefects/Stylized_Fire/Maps/Stylized_Fire_Overview_Stack_Radial.umap @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:c140e7e670694ce5e7db419a12aa45eef6c030907ef4bc0483afa604554e0c05 +size 234113 diff --git a/Content/Vefects/Stylized_Fire/Maps/Stylized_Fire_Tests.umap b/Content/Vefects/Stylized_Fire/Maps/Stylized_Fire_Tests.umap new file mode 100644 index 0000000..604693b --- /dev/null +++ b/Content/Vefects/Stylized_Fire/Maps/Stylized_Fire_Tests.umap @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:80c4cd9a7044a2cfb64b8bf59e40aa1b3d280149bec14f29bcc869f8937c7327 +size 97430 diff --git a/Content/Vefects/Stylized_Fire/VFX/Dark/Particles/NS_Stylized_Fire_01_Dark.uasset b/Content/Vefects/Stylized_Fire/VFX/Dark/Particles/NS_Stylized_Fire_01_Dark.uasset new file mode 100644 index 0000000..ff9da13 --- /dev/null +++ b/Content/Vefects/Stylized_Fire/VFX/Dark/Particles/NS_Stylized_Fire_01_Dark.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:e2cde9f7c7b81895886e154a3669a5e7b47b36402394007fed58d03c3fb3d3df +size 1404054 diff --git a/Content/Vefects/Stylized_Fire/VFX/Dark/Particles/NS_Stylized_Fire_02_Dark.uasset b/Content/Vefects/Stylized_Fire/VFX/Dark/Particles/NS_Stylized_Fire_02_Dark.uasset new file mode 100644 index 0000000..5b0d1b3 --- /dev/null +++ b/Content/Vefects/Stylized_Fire/VFX/Dark/Particles/NS_Stylized_Fire_02_Dark.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:e533e94d8df511f86e945b18e2520207fc1374c2a7b1ab8f8765584c768c379c +size 1404722 diff --git a/Content/Vefects/Stylized_Fire/VFX/Dark/Particles/NS_Stylized_Fire_Radial_01_Dark.uasset b/Content/Vefects/Stylized_Fire/VFX/Dark/Particles/NS_Stylized_Fire_Radial_01_Dark.uasset new file mode 100644 index 0000000..9c104c6 --- /dev/null +++ b/Content/Vefects/Stylized_Fire/VFX/Dark/Particles/NS_Stylized_Fire_Radial_01_Dark.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:841721ca5f2c2758ebddde3fa3e42f6b018d27dd8232d3aceb558cee6732c589 +size 1374492 diff --git a/Content/Vefects/Stylized_Fire/VFX/Dark/Particles/NS_Stylized_Fire_Radial_02_Dark.uasset b/Content/Vefects/Stylized_Fire/VFX/Dark/Particles/NS_Stylized_Fire_Radial_02_Dark.uasset new file mode 100644 index 0000000..3f9e123 --- /dev/null +++ b/Content/Vefects/Stylized_Fire/VFX/Dark/Particles/NS_Stylized_Fire_Radial_02_Dark.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:61a2b905bc8fbe86ab7bd9094ed23fd54369e069a6353c10c54af28c3ba8aa15 +size 1373712 diff --git a/Content/Vefects/Stylized_Fire/VFX/Electric/Materials/MI_VFX_Stylized_Fire_01_Electric.uasset b/Content/Vefects/Stylized_Fire/VFX/Electric/Materials/MI_VFX_Stylized_Fire_01_Electric.uasset new file mode 100644 index 0000000..bb0915b --- /dev/null +++ b/Content/Vefects/Stylized_Fire/VFX/Electric/Materials/MI_VFX_Stylized_Fire_01_Electric.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:c0db32261eb8cd663fed383a9e6f30793702cd939cc433ccfcb8460f5d2877f7 +size 86957 diff --git a/Content/Vefects/Stylized_Fire/VFX/Electric/Materials/MI_VFX_Stylized_Fire_02_Electric.uasset b/Content/Vefects/Stylized_Fire/VFX/Electric/Materials/MI_VFX_Stylized_Fire_02_Electric.uasset new file mode 100644 index 0000000..51a5d9d --- /dev/null +++ b/Content/Vefects/Stylized_Fire/VFX/Electric/Materials/MI_VFX_Stylized_Fire_02_Electric.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:a01b930e8198ef6326aad9fd9195f0e9093a212a14b9c090302cefc36631ff61 +size 81392 diff --git a/Content/Vefects/Stylized_Fire/VFX/Electric/Materials/MI_VFX_Stylized_Fire_Radial_01_Electric.uasset b/Content/Vefects/Stylized_Fire/VFX/Electric/Materials/MI_VFX_Stylized_Fire_Radial_01_Electric.uasset new file mode 100644 index 0000000..dfd0cbe --- /dev/null +++ b/Content/Vefects/Stylized_Fire/VFX/Electric/Materials/MI_VFX_Stylized_Fire_Radial_01_Electric.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:6e51bf61cc9c33fe919389dc0db6c82797e5bc5cb19aa447a20e7b23e1ef209b +size 87445 diff --git a/Content/Vefects/Stylized_Fire/VFX/Electric/Materials/MI_VFX_Stylized_Fire_Radial_02_Electric.uasset b/Content/Vefects/Stylized_Fire/VFX/Electric/Materials/MI_VFX_Stylized_Fire_Radial_02_Electric.uasset new file mode 100644 index 0000000..214d3e5 --- /dev/null +++ b/Content/Vefects/Stylized_Fire/VFX/Electric/Materials/MI_VFX_Stylized_Fire_Radial_02_Electric.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:635e86482c449eee93de0ba5519b7820905b5852915c1073cc3c447891b51c70 +size 89033 diff --git a/Content/Vefects/Stylized_Fire/VFX/Electric/Particles/NS_Stylized_Fire_01_Electric.uasset b/Content/Vefects/Stylized_Fire/VFX/Electric/Particles/NS_Stylized_Fire_01_Electric.uasset new file mode 100644 index 0000000..1a387b0 --- /dev/null +++ b/Content/Vefects/Stylized_Fire/VFX/Electric/Particles/NS_Stylized_Fire_01_Electric.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:db669716a89be3b201505ef98a7496d1adb0bb2e6741e13aa6a44ea5be2a7704 +size 1405000 diff --git a/Content/Vefects/Stylized_Fire/VFX/Electric/Particles/NS_Stylized_Fire_02_Electric.uasset b/Content/Vefects/Stylized_Fire/VFX/Electric/Particles/NS_Stylized_Fire_02_Electric.uasset new file mode 100644 index 0000000..3387b07 --- /dev/null +++ b/Content/Vefects/Stylized_Fire/VFX/Electric/Particles/NS_Stylized_Fire_02_Electric.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:3ff7664fc23d87c932e8fd0de9779be3619313bf99e73e035492707c353ce3a7 +size 1405668 diff --git a/Content/Vefects/Stylized_Fire/VFX/Electric/Particles/NS_Stylized_Fire_Radial_01_Electric.uasset b/Content/Vefects/Stylized_Fire/VFX/Electric/Particles/NS_Stylized_Fire_Radial_01_Electric.uasset new file mode 100644 index 0000000..5ebfbcc --- /dev/null +++ b/Content/Vefects/Stylized_Fire/VFX/Electric/Particles/NS_Stylized_Fire_Radial_01_Electric.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:2a96f29253dfb0ba8664844e1be677aa926b9b6cd5a48c0b1be534c5c442d785 +size 1374658 diff --git a/Content/Vefects/Stylized_Fire/VFX/Electric/Particles/NS_Stylized_Fire_Radial_02_Electric.uasset b/Content/Vefects/Stylized_Fire/VFX/Electric/Particles/NS_Stylized_Fire_Radial_02_Electric.uasset new file mode 100644 index 0000000..31b8154 --- /dev/null +++ b/Content/Vefects/Stylized_Fire/VFX/Electric/Particles/NS_Stylized_Fire_Radial_02_Electric.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:23d9427f2542b6fc48341c869c6ffcc415e8623ecccd77d0b87cf420db96a974 +size 1374658 diff --git a/Content/Vefects/Stylized_Fire/VFX/Ethereal/Materials/MI_VFX_Stylized_Fire_01_Ethereal.uasset b/Content/Vefects/Stylized_Fire/VFX/Ethereal/Materials/MI_VFX_Stylized_Fire_01_Ethereal.uasset new file mode 100644 index 0000000..0882471 --- /dev/null +++ b/Content/Vefects/Stylized_Fire/VFX/Ethereal/Materials/MI_VFX_Stylized_Fire_01_Ethereal.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:678f83fa7d8b8193609934a7e8c5051b022bfa6e68502b8df128cf2f4fbf642e +size 87718 diff --git a/Content/Vefects/Stylized_Fire/VFX/Ethereal/Materials/MI_VFX_Stylized_Fire_02_Ethereal.uasset b/Content/Vefects/Stylized_Fire/VFX/Ethereal/Materials/MI_VFX_Stylized_Fire_02_Ethereal.uasset new file mode 100644 index 0000000..ad62770 --- /dev/null +++ b/Content/Vefects/Stylized_Fire/VFX/Ethereal/Materials/MI_VFX_Stylized_Fire_02_Ethereal.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:b320efccb1e1a147cd712b5837b259af0936937f9d10dc574c4e488874820f51 +size 84757 diff --git a/Content/Vefects/Stylized_Fire/VFX/Ethereal/Materials/MI_VFX_Stylized_Fire_Radial_01_Ethereal.uasset b/Content/Vefects/Stylized_Fire/VFX/Ethereal/Materials/MI_VFX_Stylized_Fire_Radial_01_Ethereal.uasset new file mode 100644 index 0000000..6019a87 --- /dev/null +++ b/Content/Vefects/Stylized_Fire/VFX/Ethereal/Materials/MI_VFX_Stylized_Fire_Radial_01_Ethereal.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:e95e0d35c8ebe592bf77d67d979164c1799e122ad6a885d676f0b58415040642 +size 91522 diff --git a/Content/Vefects/Stylized_Fire/VFX/Ethereal/Materials/MI_VFX_Stylized_Fire_Radial_02_Ethereal.uasset b/Content/Vefects/Stylized_Fire/VFX/Ethereal/Materials/MI_VFX_Stylized_Fire_Radial_02_Ethereal.uasset new file mode 100644 index 0000000..458406b --- /dev/null +++ b/Content/Vefects/Stylized_Fire/VFX/Ethereal/Materials/MI_VFX_Stylized_Fire_Radial_02_Ethereal.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:ef670278bab46ff7bb6e8f087ba6d915fc0134ea65dd03184df4771cbac5dc60 +size 92008 diff --git a/Content/Vefects/Stylized_Fire/VFX/Ethereal/Particles/NS_Stylized_Fire_01_Ethereal.uasset b/Content/Vefects/Stylized_Fire/VFX/Ethereal/Particles/NS_Stylized_Fire_01_Ethereal.uasset new file mode 100644 index 0000000..65349aa --- /dev/null +++ b/Content/Vefects/Stylized_Fire/VFX/Ethereal/Particles/NS_Stylized_Fire_01_Ethereal.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:5ab48f5dce1e17d8bdecbb2e9fbe1c22d2699e811456dc0d42ea307f6a88cbb5 +size 1405000 diff --git a/Content/Vefects/Stylized_Fire/VFX/Ethereal/Particles/NS_Stylized_Fire_02_Ethereal.uasset b/Content/Vefects/Stylized_Fire/VFX/Ethereal/Particles/NS_Stylized_Fire_02_Ethereal.uasset new file mode 100644 index 0000000..d11e22a --- /dev/null +++ b/Content/Vefects/Stylized_Fire/VFX/Ethereal/Particles/NS_Stylized_Fire_02_Ethereal.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:9d05671fd0f62d7751883abd00d6772cf742308dc6b5e968d24d994227665bb1 +size 1405668 diff --git a/Content/Vefects/Stylized_Fire/VFX/Ethereal/Particles/NS_Stylized_Fire_Radial_01_Ethereal.uasset b/Content/Vefects/Stylized_Fire/VFX/Ethereal/Particles/NS_Stylized_Fire_Radial_01_Ethereal.uasset new file mode 100644 index 0000000..1e443ec --- /dev/null +++ b/Content/Vefects/Stylized_Fire/VFX/Ethereal/Particles/NS_Stylized_Fire_Radial_01_Ethereal.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:62510169acc9d47367356bc05374348bfc8fd80a1d02ce3324f6747188e4b8b5 +size 1374658 diff --git a/Content/Vefects/Stylized_Fire/VFX/Ethereal/Particles/NS_Stylized_Fire_Radial_02_Ethereal.uasset b/Content/Vefects/Stylized_Fire/VFX/Ethereal/Particles/NS_Stylized_Fire_Radial_02_Ethereal.uasset new file mode 100644 index 0000000..e4bfc73 --- /dev/null +++ b/Content/Vefects/Stylized_Fire/VFX/Ethereal/Particles/NS_Stylized_Fire_Radial_02_Ethereal.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:b613e7fd2f7614ce0c9e9fc12ef5ea20d69d92f5c658a4dfff0864c26fa78c87 +size 1374658 diff --git a/Content/Vefects/Stylized_Fire/VFX/Flames/Materials/MI_VFX_Stylized_Fire_01.uasset b/Content/Vefects/Stylized_Fire/VFX/Flames/Materials/MI_VFX_Stylized_Fire_01.uasset new file mode 100644 index 0000000..61364ed --- /dev/null +++ b/Content/Vefects/Stylized_Fire/VFX/Flames/Materials/MI_VFX_Stylized_Fire_01.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:9bb6d3633a71ff2f1b828c3230ca57d0cce60d84409c06d1c1a2513c8a9579d1 +size 85983 diff --git a/Content/Vefects/Stylized_Fire/VFX/Flames/Materials/MI_VFX_Stylized_Fire_01_DF.uasset b/Content/Vefects/Stylized_Fire/VFX/Flames/Materials/MI_VFX_Stylized_Fire_01_DF.uasset new file mode 100644 index 0000000..d983ef0 --- /dev/null +++ b/Content/Vefects/Stylized_Fire/VFX/Flames/Materials/MI_VFX_Stylized_Fire_01_DF.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:6ae4daadcb1529d7735089307e69f16eecdbf13f055f2efd950f4fd478393bd1 +size 90553 diff --git a/Content/Vefects/Stylized_Fire/VFX/Flames/Materials/MI_VFX_Stylized_Fire_02.uasset b/Content/Vefects/Stylized_Fire/VFX/Flames/Materials/MI_VFX_Stylized_Fire_02.uasset new file mode 100644 index 0000000..f3578f0 --- /dev/null +++ b/Content/Vefects/Stylized_Fire/VFX/Flames/Materials/MI_VFX_Stylized_Fire_02.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:4792ded2cd8b78dc5d44cea543141d770603bd86811c7fac86b77b31a06c4046 +size 84139 diff --git a/Content/Vefects/Stylized_Fire/VFX/Flames/Materials/MI_VFX_Stylized_Fire_Radial_01.uasset b/Content/Vefects/Stylized_Fire/VFX/Flames/Materials/MI_VFX_Stylized_Fire_Radial_01.uasset new file mode 100644 index 0000000..e0affce --- /dev/null +++ b/Content/Vefects/Stylized_Fire/VFX/Flames/Materials/MI_VFX_Stylized_Fire_Radial_01.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:d9cf9e4fc40b468e21680b2a6bf448395fc1833f2a52408a905aced77d875e8c +size 91893 diff --git a/Content/Vefects/Stylized_Fire/VFX/Flames/Materials/MI_VFX_Stylized_Fire_Radial_02.uasset b/Content/Vefects/Stylized_Fire/VFX/Flames/Materials/MI_VFX_Stylized_Fire_Radial_02.uasset new file mode 100644 index 0000000..22a339e --- /dev/null +++ b/Content/Vefects/Stylized_Fire/VFX/Flames/Materials/MI_VFX_Stylized_Fire_Radial_02.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:e6e758ea13af8c3c5d6a95f2be42124f1dc2efe5431e8e72326de58e1e962446 +size 90661 diff --git a/Content/Vefects/Stylized_Fire/VFX/Flames/Particles/NS_Stylized_Fire_01.uasset b/Content/Vefects/Stylized_Fire/VFX/Flames/Particles/NS_Stylized_Fire_01.uasset new file mode 100644 index 0000000..3debc7d --- /dev/null +++ b/Content/Vefects/Stylized_Fire/VFX/Flames/Particles/NS_Stylized_Fire_01.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:7f1f9ba697311cae1e6bf91c1e8499e32dcc8292f3e13eb9d83a5f8b629722d2 +size 1423207 diff --git a/Content/Vefects/Stylized_Fire/VFX/Flames/Particles/NS_Stylized_Fire_01_Infinite.uasset b/Content/Vefects/Stylized_Fire/VFX/Flames/Particles/NS_Stylized_Fire_01_Infinite.uasset new file mode 100644 index 0000000..d67172e --- /dev/null +++ b/Content/Vefects/Stylized_Fire/VFX/Flames/Particles/NS_Stylized_Fire_01_Infinite.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:5063c1ec1829feb3b9a503f3bcbb1e15f50adcd4d2c9ef77794856446428df17 +size 1408878 diff --git a/Content/Vefects/Stylized_Fire/VFX/Flames/Particles/NS_Stylized_Fire_01_Once.uasset b/Content/Vefects/Stylized_Fire/VFX/Flames/Particles/NS_Stylized_Fire_01_Once.uasset new file mode 100644 index 0000000..3475d72 --- /dev/null +++ b/Content/Vefects/Stylized_Fire/VFX/Flames/Particles/NS_Stylized_Fire_01_Once.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:adc7cdd0f58a9fcf85e4ca963aeb2c64993e7474c034f769f6ca7500b6be9bcc +size 1404317 diff --git a/Content/Vefects/Stylized_Fire/VFX/Flames/Particles/NS_Stylized_Fire_02.uasset b/Content/Vefects/Stylized_Fire/VFX/Flames/Particles/NS_Stylized_Fire_02.uasset new file mode 100644 index 0000000..d32b407 --- /dev/null +++ b/Content/Vefects/Stylized_Fire/VFX/Flames/Particles/NS_Stylized_Fire_02.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:6a735559946968b6ca65d564f4c95580751455b0221ba0f354882dfd73be8847 +size 1405836 diff --git a/Content/Vefects/Stylized_Fire/VFX/Flames/Particles/NS_Stylized_Fire_02_Infinite.uasset b/Content/Vefects/Stylized_Fire/VFX/Flames/Particles/NS_Stylized_Fire_02_Infinite.uasset new file mode 100644 index 0000000..3619a2f --- /dev/null +++ b/Content/Vefects/Stylized_Fire/VFX/Flames/Particles/NS_Stylized_Fire_02_Infinite.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:9d84c31e734629e496ee1f63058e38cc51eb19e50a19d585e463d74772229aeb +size 1409978 diff --git a/Content/Vefects/Stylized_Fire/VFX/Flames/Particles/NS_Stylized_Fire_02_Once.uasset b/Content/Vefects/Stylized_Fire/VFX/Flames/Particles/NS_Stylized_Fire_02_Once.uasset new file mode 100644 index 0000000..497a33d --- /dev/null +++ b/Content/Vefects/Stylized_Fire/VFX/Flames/Particles/NS_Stylized_Fire_02_Once.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:97e189bae5d955debbb52b9c80b0a598f01322bdd6a5f1039ffff2aa4463b0c4 +size 1405092 diff --git a/Content/Vefects/Stylized_Fire/VFX/Flames/Particles/NS_Stylized_Fire_Large_01.uasset b/Content/Vefects/Stylized_Fire/VFX/Flames/Particles/NS_Stylized_Fire_Large_01.uasset new file mode 100644 index 0000000..b39d7d5 --- /dev/null +++ b/Content/Vefects/Stylized_Fire/VFX/Flames/Particles/NS_Stylized_Fire_Large_01.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:e0993be52f7cad1b831951567064293ebacfa5179f7436f55e4c67ea87ad24d4 +size 1405533 diff --git a/Content/Vefects/Stylized_Fire/VFX/Flames/Particles/NS_Stylized_Fire_Radial_01.uasset b/Content/Vefects/Stylized_Fire/VFX/Flames/Particles/NS_Stylized_Fire_Radial_01.uasset new file mode 100644 index 0000000..ab27c52 --- /dev/null +++ b/Content/Vefects/Stylized_Fire/VFX/Flames/Particles/NS_Stylized_Fire_Radial_01.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:4b2d4146938a6897b0c3f83df0fbc973317f0a94734b9b2f01e003c1b29e8bcf +size 1373080 diff --git a/Content/Vefects/Stylized_Fire/VFX/Flames/Particles/NS_Stylized_Fire_Radial_02.uasset b/Content/Vefects/Stylized_Fire/VFX/Flames/Particles/NS_Stylized_Fire_Radial_02.uasset new file mode 100644 index 0000000..691e073 --- /dev/null +++ b/Content/Vefects/Stylized_Fire/VFX/Flames/Particles/NS_Stylized_Fire_Radial_02.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:90ff2a33a360b0bbc27794661f1b9bc1163dffe2e550e8709e0368ad80491669 +size 1373080 diff --git a/Content/Vefects/Stylized_Fire/VFX/Mystic/Materials/MI_VFX_Stylized_Fire_01_Mystic.uasset b/Content/Vefects/Stylized_Fire/VFX/Mystic/Materials/MI_VFX_Stylized_Fire_01_Mystic.uasset new file mode 100644 index 0000000..2b4f893 --- /dev/null +++ b/Content/Vefects/Stylized_Fire/VFX/Mystic/Materials/MI_VFX_Stylized_Fire_01_Mystic.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:03dd972fdf025ec8e86cf12ffa94a131cdc90866a9e39288ba4e2ba3b4013077 +size 87671 diff --git a/Content/Vefects/Stylized_Fire/VFX/Mystic/Materials/MI_VFX_Stylized_Fire_02_Mystic.uasset b/Content/Vefects/Stylized_Fire/VFX/Mystic/Materials/MI_VFX_Stylized_Fire_02_Mystic.uasset new file mode 100644 index 0000000..04f4043 --- /dev/null +++ b/Content/Vefects/Stylized_Fire/VFX/Mystic/Materials/MI_VFX_Stylized_Fire_02_Mystic.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:4858fe3797ea47347e07402c980544d6519b1c2f97eac4f4c8c110a7dfd5f683 +size 85510 diff --git a/Content/Vefects/Stylized_Fire/VFX/Mystic/Materials/MI_VFX_Stylized_Fire_Radial_01_Mystic.uasset b/Content/Vefects/Stylized_Fire/VFX/Mystic/Materials/MI_VFX_Stylized_Fire_Radial_01_Mystic.uasset new file mode 100644 index 0000000..327a1ea --- /dev/null +++ b/Content/Vefects/Stylized_Fire/VFX/Mystic/Materials/MI_VFX_Stylized_Fire_Radial_01_Mystic.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:1ede86975d3997050dae7a9076753e1bad1e5ae42c4c61cdb65d0e416ba80600 +size 93692 diff --git a/Content/Vefects/Stylized_Fire/VFX/Mystic/Materials/MI_VFX_Stylized_Fire_Radial_02_Mystic.uasset b/Content/Vefects/Stylized_Fire/VFX/Mystic/Materials/MI_VFX_Stylized_Fire_Radial_02_Mystic.uasset new file mode 100644 index 0000000..32aa5b4 --- /dev/null +++ b/Content/Vefects/Stylized_Fire/VFX/Mystic/Materials/MI_VFX_Stylized_Fire_Radial_02_Mystic.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:18467124487df7602e021e902b6cca657b9d48523ccaa2b5ebe44b3cf7229808 +size 89039 diff --git a/Content/Vefects/Stylized_Fire/VFX/Mystic/Particles/NS_Stylized_Fire_01_Mystic.uasset b/Content/Vefects/Stylized_Fire/VFX/Mystic/Particles/NS_Stylized_Fire_01_Mystic.uasset new file mode 100644 index 0000000..0711f21 --- /dev/null +++ b/Content/Vefects/Stylized_Fire/VFX/Mystic/Particles/NS_Stylized_Fire_01_Mystic.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:7d041dc4e015f61e6826f7dcb63faf22660115138dc7c841327c400b42b1c230 +size 1404528 diff --git a/Content/Vefects/Stylized_Fire/VFX/Mystic/Particles/NS_Stylized_Fire_02_Mystic.uasset b/Content/Vefects/Stylized_Fire/VFX/Mystic/Particles/NS_Stylized_Fire_02_Mystic.uasset new file mode 100644 index 0000000..b1d8fbd --- /dev/null +++ b/Content/Vefects/Stylized_Fire/VFX/Mystic/Particles/NS_Stylized_Fire_02_Mystic.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:793ae9df15d04b383cd3810fe368b29ae65f9b9f7d57b2598d8994e4a414ad6e +size 1405196 diff --git a/Content/Vefects/Stylized_Fire/VFX/Mystic/Particles/NS_Stylized_Fire_Radial_01_Mystic.uasset b/Content/Vefects/Stylized_Fire/VFX/Mystic/Particles/NS_Stylized_Fire_Radial_01_Mystic.uasset new file mode 100644 index 0000000..02445cb --- /dev/null +++ b/Content/Vefects/Stylized_Fire/VFX/Mystic/Particles/NS_Stylized_Fire_Radial_01_Mystic.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:44864cbe124034377269de55e9efd3711cff476028e2d50479376ac695f5e207 +size 1374186 diff --git a/Content/Vefects/Stylized_Fire/VFX/Mystic/Particles/NS_Stylized_Fire_Radial_02_Mystic.uasset b/Content/Vefects/Stylized_Fire/VFX/Mystic/Particles/NS_Stylized_Fire_Radial_02_Mystic.uasset new file mode 100644 index 0000000..9c0632f --- /dev/null +++ b/Content/Vefects/Stylized_Fire/VFX/Mystic/Particles/NS_Stylized_Fire_Radial_02_Mystic.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:caa66eb33f7133dd0908fa2cf50abaf15c5ed111d7dda875f1aa729d3f881511 +size 1374186 diff --git a/Content/Vefects/Stylized_Fire/VFX/Poison/Materials/MI_VFX_Stylized_Fire_01_Poison.uasset b/Content/Vefects/Stylized_Fire/VFX/Poison/Materials/MI_VFX_Stylized_Fire_01_Poison.uasset new file mode 100644 index 0000000..325859d --- /dev/null +++ b/Content/Vefects/Stylized_Fire/VFX/Poison/Materials/MI_VFX_Stylized_Fire_01_Poison.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:46c81c1951ccbc91fe19f790de1c98aa616a64efda27f87628288991805066d5 +size 86450 diff --git a/Content/Vefects/Stylized_Fire/VFX/Poison/Materials/MI_VFX_Stylized_Fire_02_Poison.uasset b/Content/Vefects/Stylized_Fire/VFX/Poison/Materials/MI_VFX_Stylized_Fire_02_Poison.uasset new file mode 100644 index 0000000..4d0a730 --- /dev/null +++ b/Content/Vefects/Stylized_Fire/VFX/Poison/Materials/MI_VFX_Stylized_Fire_02_Poison.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:5cc122bf4ee6b792d752a29ceab7c05be8d4ad7be5c519340acbc785d85b65f2 +size 85356 diff --git a/Content/Vefects/Stylized_Fire/VFX/Poison/Materials/MI_VFX_Stylized_Fire_Radial_01_Poison.uasset b/Content/Vefects/Stylized_Fire/VFX/Poison/Materials/MI_VFX_Stylized_Fire_Radial_01_Poison.uasset new file mode 100644 index 0000000..38c4b4b --- /dev/null +++ b/Content/Vefects/Stylized_Fire/VFX/Poison/Materials/MI_VFX_Stylized_Fire_Radial_01_Poison.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:96cde3989886f1b3447ec7a4d557b287963e1368057d3c8f62bb1c944577165e +size 90172 diff --git a/Content/Vefects/Stylized_Fire/VFX/Poison/Materials/MI_VFX_Stylized_Fire_Radial_02_Poison.uasset b/Content/Vefects/Stylized_Fire/VFX/Poison/Materials/MI_VFX_Stylized_Fire_Radial_02_Poison.uasset new file mode 100644 index 0000000..cfc0ea1 --- /dev/null +++ b/Content/Vefects/Stylized_Fire/VFX/Poison/Materials/MI_VFX_Stylized_Fire_Radial_02_Poison.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:0890f1a734ae5021c66fb218735d542f92dfb39f3e7ff54541caa39dacbde4af +size 93966 diff --git a/Content/Vefects/Stylized_Fire/VFX/Poison/Particles/NS_Stylized_Fire_01_Poison.uasset b/Content/Vefects/Stylized_Fire/VFX/Poison/Particles/NS_Stylized_Fire_01_Poison.uasset new file mode 100644 index 0000000..a7adcd6 --- /dev/null +++ b/Content/Vefects/Stylized_Fire/VFX/Poison/Particles/NS_Stylized_Fire_01_Poison.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:c310a39a3c227d8a48ab443f5a90de42cde50d1b2d5184ddc76f2157fa55957d +size 1404528 diff --git a/Content/Vefects/Stylized_Fire/VFX/Poison/Particles/NS_Stylized_Fire_02_Poison.uasset b/Content/Vefects/Stylized_Fire/VFX/Poison/Particles/NS_Stylized_Fire_02_Poison.uasset new file mode 100644 index 0000000..b7118f8 --- /dev/null +++ b/Content/Vefects/Stylized_Fire/VFX/Poison/Particles/NS_Stylized_Fire_02_Poison.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:c55cc9145e2fdc99eb5cd11e60f57876e3a8b6ce5c91c6741b4ac12248c3b148 +size 1405196 diff --git a/Content/Vefects/Stylized_Fire/VFX/Poison/Particles/NS_Stylized_Fire_Radial_01_Poison.uasset b/Content/Vefects/Stylized_Fire/VFX/Poison/Particles/NS_Stylized_Fire_Radial_01_Poison.uasset new file mode 100644 index 0000000..dc67032 --- /dev/null +++ b/Content/Vefects/Stylized_Fire/VFX/Poison/Particles/NS_Stylized_Fire_Radial_01_Poison.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:d44be1694cafb2fb27c109ca4ee50a8ea75027128b1952a35757de323f52a730 +size 1374186 diff --git a/Content/Vefects/Stylized_Fire/VFX/Poison/Particles/NS_Stylized_Fire_Radial_02_Poison.uasset b/Content/Vefects/Stylized_Fire/VFX/Poison/Particles/NS_Stylized_Fire_Radial_02_Poison.uasset new file mode 100644 index 0000000..8c9c068 --- /dev/null +++ b/Content/Vefects/Stylized_Fire/VFX/Poison/Particles/NS_Stylized_Fire_Radial_02_Poison.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:b31ab27704033c6423ca59ee2092848a92784203d67923195fb3bf386e78ffed +size 1374186 diff --git a/Content/Vefects/Stylized_Fire/VFX/Pure/Particles/NS_Stylized_Fire_01_Pure.uasset b/Content/Vefects/Stylized_Fire/VFX/Pure/Particles/NS_Stylized_Fire_01_Pure.uasset new file mode 100644 index 0000000..5807697 --- /dev/null +++ b/Content/Vefects/Stylized_Fire/VFX/Pure/Particles/NS_Stylized_Fire_01_Pure.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:51e5c3495fb585e76e861a3036346775530f359d9647ef54c78ec3f56976f9dc +size 1404054 diff --git a/Content/Vefects/Stylized_Fire/VFX/Pure/Particles/NS_Stylized_Fire_02_Pure.uasset b/Content/Vefects/Stylized_Fire/VFX/Pure/Particles/NS_Stylized_Fire_02_Pure.uasset new file mode 100644 index 0000000..b43eb25 --- /dev/null +++ b/Content/Vefects/Stylized_Fire/VFX/Pure/Particles/NS_Stylized_Fire_02_Pure.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:ea93bf522ecfe29d0b41c5e19303cdc44d1e264e9d5741f929404ff206ff30fa +size 1404722 diff --git a/Content/Vefects/Stylized_Fire/VFX/Pure/Particles/NS_Stylized_Fire_Radial_01_Pure.uasset b/Content/Vefects/Stylized_Fire/VFX/Pure/Particles/NS_Stylized_Fire_Radial_01_Pure.uasset new file mode 100644 index 0000000..2f463c0 --- /dev/null +++ b/Content/Vefects/Stylized_Fire/VFX/Pure/Particles/NS_Stylized_Fire_Radial_01_Pure.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:de101b1a7c4f6e009c0c6df7ae2a0782492e38bf97d4afd302c7702f03435d3c +size 1371222 diff --git a/Content/Vefects/Stylized_Fire/VFX/Pure/Particles/NS_Stylized_Fire_Radial_02_Pure.uasset b/Content/Vefects/Stylized_Fire/VFX/Pure/Particles/NS_Stylized_Fire_Radial_02_Pure.uasset new file mode 100644 index 0000000..fb96b84 --- /dev/null +++ b/Content/Vefects/Stylized_Fire/VFX/Pure/Particles/NS_Stylized_Fire_Radial_02_Pure.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:896b04a5502e3ace030ab48439531ba5396edbd2f2e85a71a521e0519407b34c +size 1373718 diff --git a/Content/Vefects/Stylized_Fire/VFX/Rainbow/Materials/MI_VFX_Stylized_Fire_01_Rainbow.uasset b/Content/Vefects/Stylized_Fire/VFX/Rainbow/Materials/MI_VFX_Stylized_Fire_01_Rainbow.uasset new file mode 100644 index 0000000..1be6e43 --- /dev/null +++ b/Content/Vefects/Stylized_Fire/VFX/Rainbow/Materials/MI_VFX_Stylized_Fire_01_Rainbow.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:cfbea55631445ff0dd633173118a6ae81bf3df961b3434a711fc117a83171538 +size 86145 diff --git a/Content/Vefects/Stylized_Fire/VFX/Rainbow/Materials/MI_VFX_Stylized_Fire_02_Rainbow.uasset b/Content/Vefects/Stylized_Fire/VFX/Rainbow/Materials/MI_VFX_Stylized_Fire_02_Rainbow.uasset new file mode 100644 index 0000000..76cc75b --- /dev/null +++ b/Content/Vefects/Stylized_Fire/VFX/Rainbow/Materials/MI_VFX_Stylized_Fire_02_Rainbow.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:da13f6b8a2b74e31998224483efd6279ff0ffa2d0c6e27977ad2c13c91aa6897 +size 83636 diff --git a/Content/Vefects/Stylized_Fire/VFX/Rainbow/Materials/MI_VFX_Stylized_Fire_Radial_01_Rainbow.uasset b/Content/Vefects/Stylized_Fire/VFX/Rainbow/Materials/MI_VFX_Stylized_Fire_Radial_01_Rainbow.uasset new file mode 100644 index 0000000..bd7b281 --- /dev/null +++ b/Content/Vefects/Stylized_Fire/VFX/Rainbow/Materials/MI_VFX_Stylized_Fire_Radial_01_Rainbow.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:74a85be8edbe8707bd963a05dda198454b7e3fc8572ef4856c5ab422dfe52410 +size 91236 diff --git a/Content/Vefects/Stylized_Fire/VFX/Rainbow/Materials/MI_VFX_Stylized_Fire_Radial_02_Rainbow.uasset b/Content/Vefects/Stylized_Fire/VFX/Rainbow/Materials/MI_VFX_Stylized_Fire_Radial_02_Rainbow.uasset new file mode 100644 index 0000000..16201d6 --- /dev/null +++ b/Content/Vefects/Stylized_Fire/VFX/Rainbow/Materials/MI_VFX_Stylized_Fire_Radial_02_Rainbow.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:a65446cfb406d32039e8baabb80e54a102a1cad6319295aeed6972f5dbde0061 +size 90048 diff --git a/Content/Vefects/Stylized_Fire/VFX/Rainbow/Particles/NS_Stylized_Fire_01_Rainbow.uasset b/Content/Vefects/Stylized_Fire/VFX/Rainbow/Particles/NS_Stylized_Fire_01_Rainbow.uasset new file mode 100644 index 0000000..3046aa1 --- /dev/null +++ b/Content/Vefects/Stylized_Fire/VFX/Rainbow/Particles/NS_Stylized_Fire_01_Rainbow.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:d27a4384e76fcd254758fcb29fa35dbc60ca0ecd06a4ad5154e266af3393d5c6 +size 1402274 diff --git a/Content/Vefects/Stylized_Fire/VFX/Rainbow/Particles/NS_Stylized_Fire_02_Rainbow.uasset b/Content/Vefects/Stylized_Fire/VFX/Rainbow/Particles/NS_Stylized_Fire_02_Rainbow.uasset new file mode 100644 index 0000000..3527a8f --- /dev/null +++ b/Content/Vefects/Stylized_Fire/VFX/Rainbow/Particles/NS_Stylized_Fire_02_Rainbow.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:2377360fc21e1c4c42e738a9bf3d8efb58cfa27e7334c6a3c55e731cbfcd1cd3 +size 1402942 diff --git a/Content/Vefects/Stylized_Fire/VFX/Rainbow/Particles/NS_Stylized_Fire_Radial_01_Rainbow.uasset b/Content/Vefects/Stylized_Fire/VFX/Rainbow/Particles/NS_Stylized_Fire_Radial_01_Rainbow.uasset new file mode 100644 index 0000000..673e47b --- /dev/null +++ b/Content/Vefects/Stylized_Fire/VFX/Rainbow/Particles/NS_Stylized_Fire_Radial_01_Rainbow.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:642321206c7be2da702dd06d3bef3e6fa7f9571f3d3c73ef4d9a0d1472959b71 +size 1374422 diff --git a/Content/Vefects/Stylized_Fire/VFX/Rainbow/Particles/NS_Stylized_Fire_Radial_02_Rainbow.uasset b/Content/Vefects/Stylized_Fire/VFX/Rainbow/Particles/NS_Stylized_Fire_Radial_02_Rainbow.uasset new file mode 100644 index 0000000..4fd6e7c --- /dev/null +++ b/Content/Vefects/Stylized_Fire/VFX/Rainbow/Particles/NS_Stylized_Fire_Radial_02_Rainbow.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:0901d7f49244ec5db5c24db1d6df2e536df4c172ecf4665d4f0c2aa81cff51b8 +size 1374422 diff --git a/Content/Vefects/Stylized_Fire/VFX/Shared/Materials/MI_VFX_Render_Particles_On_Top_Always_01.uasset b/Content/Vefects/Stylized_Fire/VFX/Shared/Materials/MI_VFX_Render_Particles_On_Top_Always_01.uasset new file mode 100644 index 0000000..5b26b3b --- /dev/null +++ b/Content/Vefects/Stylized_Fire/VFX/Shared/Materials/MI_VFX_Render_Particles_On_Top_Always_01.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:016e6b0cf12d67b046f7acf0b89ca9d55e93fcda797483576bf8742edb3305b8 +size 73999 diff --git a/Content/Vefects/Stylized_Fire/VFX/Shared/Materials/MI_VFX_Render_Particles_On_Top_Always_02.uasset b/Content/Vefects/Stylized_Fire/VFX/Shared/Materials/MI_VFX_Render_Particles_On_Top_Always_02.uasset new file mode 100644 index 0000000..90c1d03 --- /dev/null +++ b/Content/Vefects/Stylized_Fire/VFX/Shared/Materials/MI_VFX_Render_Particles_On_Top_Always_02.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:18a8120ce8a96bb0b66f6f6ffda8f929f94d1d56264f077c3498f76c4e83767f +size 74228 diff --git a/Content/Vefects/Stylized_Fire/VFX/Shared/Materials/MI_VFX_Render_Particles_On_Top_Always_02_Wrong.uasset b/Content/Vefects/Stylized_Fire/VFX/Shared/Materials/MI_VFX_Render_Particles_On_Top_Always_02_Wrong.uasset new file mode 100644 index 0000000..293571b --- /dev/null +++ b/Content/Vefects/Stylized_Fire/VFX/Shared/Materials/MI_VFX_Render_Particles_On_Top_Always_02_Wrong.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:d8b626300a8e00438037354e4123236d604507326c29b82d8aa21c3b439a7a36 +size 74276 diff --git a/Content/Vefects/Stylized_Fire/VFX/Shared/Materials/MI_VFX_Render_Particles_On_Top_Always_Wrong_01.uasset b/Content/Vefects/Stylized_Fire/VFX/Shared/Materials/MI_VFX_Render_Particles_On_Top_Always_Wrong_01.uasset new file mode 100644 index 0000000..fec3ef6 --- /dev/null +++ b/Content/Vefects/Stylized_Fire/VFX/Shared/Materials/MI_VFX_Render_Particles_On_Top_Always_Wrong_01.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:93ef8dfd29cd3af1902205086fbd7f9403b3b221436f456fad1220e05cdd1564 +size 74485 diff --git a/Content/Vefects/Stylized_Fire/VFX/Shared/Materials/MI_VFX_Stylized_Fire_01_GS.uasset b/Content/Vefects/Stylized_Fire/VFX/Shared/Materials/MI_VFX_Stylized_Fire_01_GS.uasset new file mode 100644 index 0000000..c1af5fc --- /dev/null +++ b/Content/Vefects/Stylized_Fire/VFX/Shared/Materials/MI_VFX_Stylized_Fire_01_GS.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:77a1c53e842df26a74ada21b4379b435c940ec1360b8abb8097a43b01de602bd +size 84947 diff --git a/Content/Vefects/Stylized_Fire/VFX/Shared/Materials/MI_VFX_Stylized_Fire_02_GS.uasset b/Content/Vefects/Stylized_Fire/VFX/Shared/Materials/MI_VFX_Stylized_Fire_02_GS.uasset new file mode 100644 index 0000000..4ab0e62 --- /dev/null +++ b/Content/Vefects/Stylized_Fire/VFX/Shared/Materials/MI_VFX_Stylized_Fire_02_GS.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:2f9d7d3beace5e68c4c56b201cbaf33d30432cd29fd137720e6d4a1b69505df9 +size 83211 diff --git a/Content/Vefects/Stylized_Fire/VFX/Shared/Materials/MI_VFX_Stylized_Fire_Radial_01_GS.uasset b/Content/Vefects/Stylized_Fire/VFX/Shared/Materials/MI_VFX_Stylized_Fire_Radial_01_GS.uasset new file mode 100644 index 0000000..0466801 --- /dev/null +++ b/Content/Vefects/Stylized_Fire/VFX/Shared/Materials/MI_VFX_Stylized_Fire_Radial_01_GS.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:6a21c1a7b7a476c3fefa69b9bc358b229bc5ba5443f5d5c5fdaeb17182b2ee91 +size 86942 diff --git a/Content/Vefects/Stylized_Fire/VFX/Shared/Materials/MI_VFX_Stylized_Fire_Radial_02_GS.uasset b/Content/Vefects/Stylized_Fire/VFX/Shared/Materials/MI_VFX_Stylized_Fire_Radial_02_GS.uasset new file mode 100644 index 0000000..00fea96 --- /dev/null +++ b/Content/Vefects/Stylized_Fire/VFX/Shared/Materials/MI_VFX_Stylized_Fire_Radial_02_GS.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:c4204c1fcd080261a4a72223bf378405505ca0be7e42fd2a153b18bf88ac399d +size 89622 diff --git a/Content/Vefects/Stylized_Fire/VFX/Shared/Materials/MI_VFX_Stylized_Fire_Radial_02_GS_02.uasset b/Content/Vefects/Stylized_Fire/VFX/Shared/Materials/MI_VFX_Stylized_Fire_Radial_02_GS_02.uasset new file mode 100644 index 0000000..05c607a --- /dev/null +++ b/Content/Vefects/Stylized_Fire/VFX/Shared/Materials/MI_VFX_Stylized_Fire_Radial_02_GS_02.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:b9694caa8d3a7c2593eedcede5c549b50426787e4a300f6b62d41fa1443b6ba3 +size 87311 diff --git a/Content/Vefects/Stylized_Fire/VFX/Shared/Materials/M_VFX_Render_Particles_On_Top_Always.uasset b/Content/Vefects/Stylized_Fire/VFX/Shared/Materials/M_VFX_Render_Particles_On_Top_Always.uasset new file mode 100644 index 0000000..2100358 --- /dev/null +++ b/Content/Vefects/Stylized_Fire/VFX/Shared/Materials/M_VFX_Render_Particles_On_Top_Always.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:1461d37e795f78ccdaf392b1f84116706ab9d8c9a4b0f2727311a40b271cffcb +size 82970 diff --git a/Content/Vefects/Stylized_Fire/VFX/Shared/Materials/M_VFX_Render_Particles_On_Top_Always_Wrong.uasset b/Content/Vefects/Stylized_Fire/VFX/Shared/Materials/M_VFX_Render_Particles_On_Top_Always_Wrong.uasset new file mode 100644 index 0000000..1451783 --- /dev/null +++ b/Content/Vefects/Stylized_Fire/VFX/Shared/Materials/M_VFX_Render_Particles_On_Top_Always_Wrong.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:550e9367fa151f69e4f851f6c017a761f27c8f3e8913e0d5cf9c88acc495cee1 +size 83845 diff --git a/Content/Vefects/Stylized_Fire/VFX/Shared/Materials/M_VFX_Stylized_Fire_01.uasset b/Content/Vefects/Stylized_Fire/VFX/Shared/Materials/M_VFX_Stylized_Fire_01.uasset new file mode 100644 index 0000000..9d60635 --- /dev/null +++ b/Content/Vefects/Stylized_Fire/VFX/Shared/Materials/M_VFX_Stylized_Fire_01.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:96be6c2d2176b8163f89d9a5aaada31dd954806305f17d4c1699fad733f4ee01 +size 184772 diff --git a/Content/Vefects/Stylized_Fire/VFX/Shared/Materials/M_VFX_Stylized_Fire_Radial_01.uasset b/Content/Vefects/Stylized_Fire/VFX/Shared/Materials/M_VFX_Stylized_Fire_Radial_01.uasset new file mode 100644 index 0000000..415128f --- /dev/null +++ b/Content/Vefects/Stylized_Fire/VFX/Shared/Materials/M_VFX_Stylized_Fire_Radial_01.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:80d499e3656d4f7e604c26e95f7064909e3fe9ecd2607c0b92661abd29e9783c +size 205213 diff --git a/Content/Vefects/Stylized_Fire/VFX/Shared/Particles/NE_Stylized_Fire_00.uasset b/Content/Vefects/Stylized_Fire/VFX/Shared/Particles/NE_Stylized_Fire_00.uasset new file mode 100644 index 0000000..cd6d58c --- /dev/null +++ b/Content/Vefects/Stylized_Fire/VFX/Shared/Particles/NE_Stylized_Fire_00.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:9384f5bd43911c60de82055744ff82e8dc0ddae7fa83b172c81787a8fe494eb8 +size 1113712 diff --git a/Content/Vefects/Stylized_Fire/VFX/Shared/Textures/LUTs/T_VFX_LUT_Blood_01.uasset b/Content/Vefects/Stylized_Fire/VFX/Shared/Textures/LUTs/T_VFX_LUT_Blood_01.uasset new file mode 100644 index 0000000..b6797ff --- /dev/null +++ b/Content/Vefects/Stylized_Fire/VFX/Shared/Textures/LUTs/T_VFX_LUT_Blood_01.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:7740941d2d1b9d8102f7709c95a60aab7f6433411d987dcce466a95c968b6e07 +size 5349 diff --git a/Content/Vefects/Stylized_Fire/VFX/Shared/Textures/LUTs/T_VFX_LUT_Blood_01_Mirrored.uasset b/Content/Vefects/Stylized_Fire/VFX/Shared/Textures/LUTs/T_VFX_LUT_Blood_01_Mirrored.uasset new file mode 100644 index 0000000..f409e8d --- /dev/null +++ b/Content/Vefects/Stylized_Fire/VFX/Shared/Textures/LUTs/T_VFX_LUT_Blood_01_Mirrored.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:3c6035410fd8e4fc2ffa6084db5dd73fbe07c8543b35d4040a65224e751f7cd7 +size 5597 diff --git a/Content/Vefects/Stylized_Fire/VFX/Shared/Textures/LUTs/T_VFX_LUT_Blood_02.uasset b/Content/Vefects/Stylized_Fire/VFX/Shared/Textures/LUTs/T_VFX_LUT_Blood_02.uasset new file mode 100644 index 0000000..66bfc62 --- /dev/null +++ b/Content/Vefects/Stylized_Fire/VFX/Shared/Textures/LUTs/T_VFX_LUT_Blood_02.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:4b76c64b0213603165feed86377d3fbd6e8ee9825776eb5383caa73dc7fc058f +size 5796 diff --git a/Content/Vefects/Stylized_Fire/VFX/Shared/Textures/LUTs/T_VFX_LUT_Blood_03.uasset b/Content/Vefects/Stylized_Fire/VFX/Shared/Textures/LUTs/T_VFX_LUT_Blood_03.uasset new file mode 100644 index 0000000..5f275c3 --- /dev/null +++ b/Content/Vefects/Stylized_Fire/VFX/Shared/Textures/LUTs/T_VFX_LUT_Blood_03.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:76cc1ad2e60008533d16c0734c9a2527acfa4fcd780a82190f9e827d4f452b9b +size 5712 diff --git a/Content/Vefects/Stylized_Fire/VFX/Shared/Textures/LUTs/T_VFX_LUT_Blood_03_Mirrored.uasset b/Content/Vefects/Stylized_Fire/VFX/Shared/Textures/LUTs/T_VFX_LUT_Blood_03_Mirrored.uasset new file mode 100644 index 0000000..2d2f125 --- /dev/null +++ b/Content/Vefects/Stylized_Fire/VFX/Shared/Textures/LUTs/T_VFX_LUT_Blood_03_Mirrored.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:c65894475833e9f9451f499267dba3601c5477d4664765abb391da829c1b8218 +size 5984 diff --git a/Content/Vefects/Stylized_Fire/VFX/Shared/Textures/LUTs/T_VFX_LUT_Candy_01.uasset b/Content/Vefects/Stylized_Fire/VFX/Shared/Textures/LUTs/T_VFX_LUT_Candy_01.uasset new file mode 100644 index 0000000..30b0605 --- /dev/null +++ b/Content/Vefects/Stylized_Fire/VFX/Shared/Textures/LUTs/T_VFX_LUT_Candy_01.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:84ba6e7876053a0a7a92d68891748e497ad6919702418260581d83c9e85fc422 +size 5981 diff --git a/Content/Vefects/Stylized_Fire/VFX/Shared/Textures/LUTs/T_VFX_LUT_Candy_01_Mirrored.uasset b/Content/Vefects/Stylized_Fire/VFX/Shared/Textures/LUTs/T_VFX_LUT_Candy_01_Mirrored.uasset new file mode 100644 index 0000000..868fd89 --- /dev/null +++ b/Content/Vefects/Stylized_Fire/VFX/Shared/Textures/LUTs/T_VFX_LUT_Candy_01_Mirrored.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:2f980e2ad5920099910c1ed008531ec9fbb0919c7d697f3182760bcb7ddc9615 +size 6312 diff --git a/Content/Vefects/Stylized_Fire/VFX/Shared/Textures/LUTs/T_VFX_LUT_Electric_01.uasset b/Content/Vefects/Stylized_Fire/VFX/Shared/Textures/LUTs/T_VFX_LUT_Electric_01.uasset new file mode 100644 index 0000000..16af138 --- /dev/null +++ b/Content/Vefects/Stylized_Fire/VFX/Shared/Textures/LUTs/T_VFX_LUT_Electric_01.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:017e83837404c565d29e4af976a7f5a9d8ae535d08051db8b3d262faa162449d +size 6088 diff --git a/Content/Vefects/Stylized_Fire/VFX/Shared/Textures/LUTs/T_VFX_LUT_Fail_01.uasset b/Content/Vefects/Stylized_Fire/VFX/Shared/Textures/LUTs/T_VFX_LUT_Fail_01.uasset new file mode 100644 index 0000000..c6cd531 --- /dev/null +++ b/Content/Vefects/Stylized_Fire/VFX/Shared/Textures/LUTs/T_VFX_LUT_Fail_01.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:c14a64ce20aa289a6b0fd0ed757a53bcaf52ad6412f4f9492e2b8185dd26b61c +size 6971 diff --git a/Content/Vefects/Stylized_Fire/VFX/Shared/Textures/LUTs/T_VFX_LUT_Fail_02.uasset b/Content/Vefects/Stylized_Fire/VFX/Shared/Textures/LUTs/T_VFX_LUT_Fail_02.uasset new file mode 100644 index 0000000..8116afa --- /dev/null +++ b/Content/Vefects/Stylized_Fire/VFX/Shared/Textures/LUTs/T_VFX_LUT_Fail_02.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:0eb4513a33cbb709bb79b795a6212e611993bd8fcb1e611c63ca2f85894fa194 +size 6849 diff --git a/Content/Vefects/Stylized_Fire/VFX/Shared/Textures/LUTs/T_VFX_LUT_Fire_01.uasset b/Content/Vefects/Stylized_Fire/VFX/Shared/Textures/LUTs/T_VFX_LUT_Fire_01.uasset new file mode 100644 index 0000000..c723c5c --- /dev/null +++ b/Content/Vefects/Stylized_Fire/VFX/Shared/Textures/LUTs/T_VFX_LUT_Fire_01.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:b527fc0fa552b190b9bf42e06096c16700ad8e15750df63193605b289c326f52 +size 6076 diff --git a/Content/Vefects/Stylized_Fire/VFX/Shared/Textures/LUTs/T_VFX_LUT_Fire_01_Mirrored.uasset b/Content/Vefects/Stylized_Fire/VFX/Shared/Textures/LUTs/T_VFX_LUT_Fire_01_Mirrored.uasset new file mode 100644 index 0000000..0a0e913 --- /dev/null +++ b/Content/Vefects/Stylized_Fire/VFX/Shared/Textures/LUTs/T_VFX_LUT_Fire_01_Mirrored.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:721caea6ec3e1e730f2766a9c8bb155778fd8795ab8aeafaceb098396e1fdac1 +size 6233 diff --git a/Content/Vefects/Stylized_Fire/VFX/Shared/Textures/LUTs/T_VFX_LUT_Fire_02.uasset b/Content/Vefects/Stylized_Fire/VFX/Shared/Textures/LUTs/T_VFX_LUT_Fire_02.uasset new file mode 100644 index 0000000..a986a20 --- /dev/null +++ b/Content/Vefects/Stylized_Fire/VFX/Shared/Textures/LUTs/T_VFX_LUT_Fire_02.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:7cafbac027b2a81698e4e114427e2106a7dfa508fbf3125bbfbc06bf7f48addc +size 6700 diff --git a/Content/Vefects/Stylized_Fire/VFX/Shared/Textures/LUTs/T_VFX_LUT_Fire_03.uasset b/Content/Vefects/Stylized_Fire/VFX/Shared/Textures/LUTs/T_VFX_LUT_Fire_03.uasset new file mode 100644 index 0000000..bcf8e04 --- /dev/null +++ b/Content/Vefects/Stylized_Fire/VFX/Shared/Textures/LUTs/T_VFX_LUT_Fire_03.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:d9bb2b0e4e33ee05a1c72479ed13b2a9ff59a8a21a766bd43f14d6768d5a0177 +size 6340 diff --git a/Content/Vefects/Stylized_Fire/VFX/Shared/Textures/LUTs/T_VFX_LUT_Flame_Example_01.uasset b/Content/Vefects/Stylized_Fire/VFX/Shared/Textures/LUTs/T_VFX_LUT_Flame_Example_01.uasset new file mode 100644 index 0000000..d0cb9aa --- /dev/null +++ b/Content/Vefects/Stylized_Fire/VFX/Shared/Textures/LUTs/T_VFX_LUT_Flame_Example_01.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:476f97736159ff1aeb16d39655c9b249861d4f6f3f83695b362d50a694a1b963 +size 7041 diff --git a/Content/Vefects/Stylized_Fire/VFX/Shared/Textures/LUTs/T_VFX_LUT_GS_01.uasset b/Content/Vefects/Stylized_Fire/VFX/Shared/Textures/LUTs/T_VFX_LUT_GS_01.uasset new file mode 100644 index 0000000..49eb801 --- /dev/null +++ b/Content/Vefects/Stylized_Fire/VFX/Shared/Textures/LUTs/T_VFX_LUT_GS_01.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:67af83d68e16163f7b587ccf7baa194a65b55fd62b8cf5321039793c946c9896 +size 6130 diff --git a/Content/Vefects/Stylized_Fire/VFX/Shared/Textures/LUTs/T_VFX_LUT_GS_01_Mirrored.uasset b/Content/Vefects/Stylized_Fire/VFX/Shared/Textures/LUTs/T_VFX_LUT_GS_01_Mirrored.uasset new file mode 100644 index 0000000..e4bde95 --- /dev/null +++ b/Content/Vefects/Stylized_Fire/VFX/Shared/Textures/LUTs/T_VFX_LUT_GS_01_Mirrored.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:640a2eac00df6d9549ab2d8f4fa436a384ef860ccc7855b343593a7aeb9d38bf +size 7213 diff --git a/Content/Vefects/Stylized_Fire/VFX/Shared/Textures/LUTs/T_VFX_LUT_GS_02.uasset b/Content/Vefects/Stylized_Fire/VFX/Shared/Textures/LUTs/T_VFX_LUT_GS_02.uasset new file mode 100644 index 0000000..185681a --- /dev/null +++ b/Content/Vefects/Stylized_Fire/VFX/Shared/Textures/LUTs/T_VFX_LUT_GS_02.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:4e90a3e977e6f32e7e950540b0b6c953d7e672e198f6e263915baa45be4b93a7 +size 6240 diff --git a/Content/Vefects/Stylized_Fire/VFX/Shared/Textures/LUTs/T_VFX_LUT_GS_02_Mirrored.uasset b/Content/Vefects/Stylized_Fire/VFX/Shared/Textures/LUTs/T_VFX_LUT_GS_02_Mirrored.uasset new file mode 100644 index 0000000..1cb0aa6 --- /dev/null +++ b/Content/Vefects/Stylized_Fire/VFX/Shared/Textures/LUTs/T_VFX_LUT_GS_02_Mirrored.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:5caf4dcf0da35fd37f7683ee9f7a86a79f432a62a5261af709025ffaa5a324e9 +size 6618 diff --git a/Content/Vefects/Stylized_Fire/VFX/Shared/Textures/LUTs/T_VFX_LUT_Light_01.uasset b/Content/Vefects/Stylized_Fire/VFX/Shared/Textures/LUTs/T_VFX_LUT_Light_01.uasset new file mode 100644 index 0000000..60f46aa --- /dev/null +++ b/Content/Vefects/Stylized_Fire/VFX/Shared/Textures/LUTs/T_VFX_LUT_Light_01.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:954311150879df1b285c516839371ad0f94fcdc150a77f3bfd1955b183dd5890 +size 6959 diff --git a/Content/Vefects/Stylized_Fire/VFX/Shared/Textures/LUTs/T_VFX_LUT_Light_01_Mirrored.uasset b/Content/Vefects/Stylized_Fire/VFX/Shared/Textures/LUTs/T_VFX_LUT_Light_01_Mirrored.uasset new file mode 100644 index 0000000..57f7833 --- /dev/null +++ b/Content/Vefects/Stylized_Fire/VFX/Shared/Textures/LUTs/T_VFX_LUT_Light_01_Mirrored.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:5498508926454fbc24c1fcd11e2c00d710d852941d363b67b9b6f13b2ebf2a57 +size 7077 diff --git a/Content/Vefects/Stylized_Fire/VFX/Shared/Textures/LUTs/T_VFX_LUT_Nature_01.uasset b/Content/Vefects/Stylized_Fire/VFX/Shared/Textures/LUTs/T_VFX_LUT_Nature_01.uasset new file mode 100644 index 0000000..5b80051 --- /dev/null +++ b/Content/Vefects/Stylized_Fire/VFX/Shared/Textures/LUTs/T_VFX_LUT_Nature_01.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:0a68088e21b8a18126fba9a0607448ab642dc66f151af18727f031c53ed832e9 +size 6875 diff --git a/Content/Vefects/Stylized_Fire/VFX/Shared/Textures/LUTs/T_VFX_LUT_Nature_01_Mirrored.uasset b/Content/Vefects/Stylized_Fire/VFX/Shared/Textures/LUTs/T_VFX_LUT_Nature_01_Mirrored.uasset new file mode 100644 index 0000000..fd3f762 --- /dev/null +++ b/Content/Vefects/Stylized_Fire/VFX/Shared/Textures/LUTs/T_VFX_LUT_Nature_01_Mirrored.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:9e77071c23035d830b653b8d620ca4d671bc5b917e48140ac10aa4e816956193 +size 7010 diff --git a/Content/Vefects/Stylized_Fire/VFX/Shared/Textures/LUTs/T_VFX_LUT_Night_01.uasset b/Content/Vefects/Stylized_Fire/VFX/Shared/Textures/LUTs/T_VFX_LUT_Night_01.uasset new file mode 100644 index 0000000..cc98de6 --- /dev/null +++ b/Content/Vefects/Stylized_Fire/VFX/Shared/Textures/LUTs/T_VFX_LUT_Night_01.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:a5a8f6d5310f1fe0556de523d429273f92e401ae344fbf9731462d5aedfa9bac +size 6806 diff --git a/Content/Vefects/Stylized_Fire/VFX/Shared/Textures/LUTs/T_VFX_LUT_Night_01_Inverted.uasset b/Content/Vefects/Stylized_Fire/VFX/Shared/Textures/LUTs/T_VFX_LUT_Night_01_Inverted.uasset new file mode 100644 index 0000000..dbfd25c --- /dev/null +++ b/Content/Vefects/Stylized_Fire/VFX/Shared/Textures/LUTs/T_VFX_LUT_Night_01_Inverted.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:5a7041f9b1ae26bcd7d216d5e0ac4e05fc7344032154990c48d57d6e181112a4 +size 6897 diff --git a/Content/Vefects/Stylized_Fire/VFX/Shared/Textures/LUTs/T_VFX_LUT_Night_01_Mirrored.uasset b/Content/Vefects/Stylized_Fire/VFX/Shared/Textures/LUTs/T_VFX_LUT_Night_01_Mirrored.uasset new file mode 100644 index 0000000..795918e --- /dev/null +++ b/Content/Vefects/Stylized_Fire/VFX/Shared/Textures/LUTs/T_VFX_LUT_Night_01_Mirrored.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:73fa6fe6627ff200ce734bf33ecfe8ffc46e841a29ac611cf8433cb5e907dbfd +size 7067 diff --git a/Content/Vefects/Stylized_Fire/VFX/Shared/Textures/LUTs/T_VFX_LUT_Rainbow_Desaturated_01.uasset b/Content/Vefects/Stylized_Fire/VFX/Shared/Textures/LUTs/T_VFX_LUT_Rainbow_Desaturated_01.uasset new file mode 100644 index 0000000..61b24ea --- /dev/null +++ b/Content/Vefects/Stylized_Fire/VFX/Shared/Textures/LUTs/T_VFX_LUT_Rainbow_Desaturated_01.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:19aaa6153b91a61c265bb272d0fd567e5682fe9e680c18184946eefe9d687d36 +size 6830 diff --git a/Content/Vefects/Stylized_Fire/VFX/Shared/Textures/LUTs/T_VFX_LUT_Rainbow_Desaturated_01_Mirrored.uasset b/Content/Vefects/Stylized_Fire/VFX/Shared/Textures/LUTs/T_VFX_LUT_Rainbow_Desaturated_01_Mirrored.uasset new file mode 100644 index 0000000..d09445f --- /dev/null +++ b/Content/Vefects/Stylized_Fire/VFX/Shared/Textures/LUTs/T_VFX_LUT_Rainbow_Desaturated_01_Mirrored.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:0f03701c173b82b15c66e87ededb942fc0f5ea11225ed239bf911538b169e602 +size 6632 diff --git a/Content/Vefects/Stylized_Fire/VFX/Shared/Textures/LUTs/T_VFX_LUT_Water_01.uasset b/Content/Vefects/Stylized_Fire/VFX/Shared/Textures/LUTs/T_VFX_LUT_Water_01.uasset new file mode 100644 index 0000000..0fc270a --- /dev/null +++ b/Content/Vefects/Stylized_Fire/VFX/Shared/Textures/LUTs/T_VFX_LUT_Water_01.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:e96acc27ec29c5b5bbfb83252ef563d4cb4c3a2f7f8131509a19f75667dc8637 +size 6350 diff --git a/Content/Vefects/Stylized_Fire/VFX/Shared/Textures/LUTs/T_VFX_LUT_Water_01_Mirrored.uasset b/Content/Vefects/Stylized_Fire/VFX/Shared/Textures/LUTs/T_VFX_LUT_Water_01_Mirrored.uasset new file mode 100644 index 0000000..c3a85d0 --- /dev/null +++ b/Content/Vefects/Stylized_Fire/VFX/Shared/Textures/LUTs/T_VFX_LUT_Water_01_Mirrored.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:d2ce01f14a7efe6c50b0552ae62d6b9566344af6c45141339c7660b01d3d9014 +size 6469 diff --git a/Content/Vefects/Stylized_Fire/VFX/Shared/Textures/T_VFX_Lens_Flare_01.uasset b/Content/Vefects/Stylized_Fire/VFX/Shared/Textures/T_VFX_Lens_Flare_01.uasset new file mode 100644 index 0000000..a1ab924 --- /dev/null +++ b/Content/Vefects/Stylized_Fire/VFX/Shared/Textures/T_VFX_Lens_Flare_01.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:850e5624fef7589b3b15ee3c67a7f52aec896b2d3411c829cc1b332c7f10d6ea +size 44847 diff --git a/Content/Vefects/Stylized_Fire/VFX/Shared/Textures/T_VFX_Lens_Flares_Random_01.uasset b/Content/Vefects/Stylized_Fire/VFX/Shared/Textures/T_VFX_Lens_Flares_Random_01.uasset new file mode 100644 index 0000000..014a17b --- /dev/null +++ b/Content/Vefects/Stylized_Fire/VFX/Shared/Textures/T_VFX_Lens_Flares_Random_01.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:c7cd1995f5a446d751528c0bf1e30a5709f694a266243fa1ce293aadbfac3893 +size 948708 diff --git a/Content/Vefects/Stylized_Fire/VFX/Shared/Textures/T_VFX_Perlin_01.uasset b/Content/Vefects/Stylized_Fire/VFX/Shared/Textures/T_VFX_Perlin_01.uasset new file mode 100644 index 0000000..d66de77 --- /dev/null +++ b/Content/Vefects/Stylized_Fire/VFX/Shared/Textures/T_VFX_Perlin_01.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:2145019bcfbccd40e625f95a7dc8b4b23c736c672dcd03d19baf096491235e4b +size 73768 diff --git a/Content/Vefects/Stylized_Fire/VFX/Shared/Textures/T_VFX_Perlin_01_N.uasset b/Content/Vefects/Stylized_Fire/VFX/Shared/Textures/T_VFX_Perlin_01_N.uasset new file mode 100644 index 0000000..dcb21fb --- /dev/null +++ b/Content/Vefects/Stylized_Fire/VFX/Shared/Textures/T_VFX_Perlin_01_N.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:c112452f1c042cc519d468add9681dd4aacff4e8efa1dedc15670ff24b43092b +size 223762 diff --git a/Content/Vefects/Stylized_Fire/VFX/Shared/Textures/T_VFX_Perlin_02.uasset b/Content/Vefects/Stylized_Fire/VFX/Shared/Textures/T_VFX_Perlin_02.uasset new file mode 100644 index 0000000..c4ed4d1 --- /dev/null +++ b/Content/Vefects/Stylized_Fire/VFX/Shared/Textures/T_VFX_Perlin_02.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:23c8d2a93f27b1c3ef9cf96efdb09342b6e608f62bc07ca0194c5bcb563d92c7 +size 89741 diff --git a/Content/Vefects/Stylized_Fire/VFX/Shared/Textures/T_VFX_Perlin_02_N.uasset b/Content/Vefects/Stylized_Fire/VFX/Shared/Textures/T_VFX_Perlin_02_N.uasset new file mode 100644 index 0000000..96365da --- /dev/null +++ b/Content/Vefects/Stylized_Fire/VFX/Shared/Textures/T_VFX_Perlin_02_N.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:60b7e4b9a6900ec2b229b06dc6e9f8e4324a3a4fefe19309c0a4a765ce27c8e0 +size 166352 diff --git a/Content/Vefects/Stylized_Fire/VFX/Shared/Textures/T_VFX_Stylized_Fire_Masks_Packed_01.uasset b/Content/Vefects/Stylized_Fire/VFX/Shared/Textures/T_VFX_Stylized_Fire_Masks_Packed_01.uasset new file mode 100644 index 0000000..80353d8 --- /dev/null +++ b/Content/Vefects/Stylized_Fire/VFX/Shared/Textures/T_VFX_Stylized_Fire_Masks_Packed_01.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:70c62f50d3b757768ac7b38f9ed7f9a857b1924ecc7c41bdca73992ed6512c4b +size 76852 diff --git a/Content/Vefects/Stylized_Fire/VFX/Shared/Textures/T_VFX_Stylized_Fire_Masks_Packed_02.uasset b/Content/Vefects/Stylized_Fire/VFX/Shared/Textures/T_VFX_Stylized_Fire_Masks_Packed_02.uasset new file mode 100644 index 0000000..d2a07bc --- /dev/null +++ b/Content/Vefects/Stylized_Fire/VFX/Shared/Textures/T_VFX_Stylized_Fire_Masks_Packed_02.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:4ff8e237e2df0d3f1d7658f42a496db1c079ebee7d40bebbb3aaa7fe48eaf196 +size 70448 diff --git a/Content/Vefects/Stylized_Fire/VFX/Shared/Textures/T_VFX_Stylized_Fire_Masks_Packed_03.uasset b/Content/Vefects/Stylized_Fire/VFX/Shared/Textures/T_VFX_Stylized_Fire_Masks_Packed_03.uasset new file mode 100644 index 0000000..39b4b0c --- /dev/null +++ b/Content/Vefects/Stylized_Fire/VFX/Shared/Textures/T_VFX_Stylized_Fire_Masks_Packed_03.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:6174020a6da686280922f2146d1d9b08aa7bb58c46a120b9bc17af483a944943 +size 79757 diff --git a/Content/Vefects/Stylized_Fire/VFX/Shared/Textures/T_VFX_Stylized_Fire_Masks_Packed_04.uasset b/Content/Vefects/Stylized_Fire/VFX/Shared/Textures/T_VFX_Stylized_Fire_Masks_Packed_04.uasset new file mode 100644 index 0000000..135d222 --- /dev/null +++ b/Content/Vefects/Stylized_Fire/VFX/Shared/Textures/T_VFX_Stylized_Fire_Masks_Packed_04.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:8510bdf943386613ad964d2dfe00516aa32d6d94373e391e328102291bdfea97 +size 99838 diff --git a/Content/Vefects/Stylized_Fire/VFX/Shared/Textures/T_VFX_Stylized_Fire_Masks_Packed_05.uasset b/Content/Vefects/Stylized_Fire/VFX/Shared/Textures/T_VFX_Stylized_Fire_Masks_Packed_05.uasset new file mode 100644 index 0000000..068982a --- /dev/null +++ b/Content/Vefects/Stylized_Fire/VFX/Shared/Textures/T_VFX_Stylized_Fire_Masks_Packed_05.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:8782e93d9a0aba04c43110c22ebd62e5d8070347acc46ac01cfb6917b211ff91 +size 72259 diff --git a/Content/Vefects/Stylized_Fire/VFX/Shared/Textures/T_VFX_Stylized_Fire_Masks_Packed_06.uasset b/Content/Vefects/Stylized_Fire/VFX/Shared/Textures/T_VFX_Stylized_Fire_Masks_Packed_06.uasset new file mode 100644 index 0000000..ea1bd60 --- /dev/null +++ b/Content/Vefects/Stylized_Fire/VFX/Shared/Textures/T_VFX_Stylized_Fire_Masks_Packed_06.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:569beb1e89ad74907bf692f5de1ac54e9716fa456149fbb6d83cd87e9a69c52a +size 103134 diff --git a/Content/Vefects/Stylized_Fire/VFX/Shared/Textures/T_VFX_Stylized_Fire_Masks_Packed_07.uasset b/Content/Vefects/Stylized_Fire/VFX/Shared/Textures/T_VFX_Stylized_Fire_Masks_Packed_07.uasset new file mode 100644 index 0000000..70a1094 --- /dev/null +++ b/Content/Vefects/Stylized_Fire/VFX/Shared/Textures/T_VFX_Stylized_Fire_Masks_Packed_07.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:f804cb1ef99e6d089979a4d452d9273a0a41269f1d1a54c51c8f119f5a6a0a78 +size 102641 diff --git a/Content/Vefects/Stylized_Fire/VFX/Shared/Textures/T_VFX_Stylized_Fire_Swirls_Packed_01.uasset b/Content/Vefects/Stylized_Fire/VFX/Shared/Textures/T_VFX_Stylized_Fire_Swirls_Packed_01.uasset new file mode 100644 index 0000000..c2929b0 --- /dev/null +++ b/Content/Vefects/Stylized_Fire/VFX/Shared/Textures/T_VFX_Stylized_Fire_Swirls_Packed_01.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:8aa8e130668e040188ab08c2a06b313e0d38b7ed7ddb053ad78b5aa4298b47ed +size 300154 diff --git a/Content/Vefects/Stylized_Fire/VFX/Shared/Textures/T_VFX_Stylized_Fire_Swirls_Packed_01_HD.uasset b/Content/Vefects/Stylized_Fire/VFX/Shared/Textures/T_VFX_Stylized_Fire_Swirls_Packed_01_HD.uasset new file mode 100644 index 0000000..ff8b3f1 --- /dev/null +++ b/Content/Vefects/Stylized_Fire/VFX/Shared/Textures/T_VFX_Stylized_Fire_Swirls_Packed_01_HD.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:93ae3f5f1536815d67f497082b3fb817256fc70a6fc34021f721102ab263d0d4 +size 6382313 diff --git a/Content/Vefects/Stylized_Fire/VFX/Water/Materials/MI_VFX_Stylized_Fire_01_Water.uasset b/Content/Vefects/Stylized_Fire/VFX/Water/Materials/MI_VFX_Stylized_Fire_01_Water.uasset new file mode 100644 index 0000000..17289fb --- /dev/null +++ b/Content/Vefects/Stylized_Fire/VFX/Water/Materials/MI_VFX_Stylized_Fire_01_Water.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:c7bd86c201f9f1154e3153802b2571043e67806e56bee20d496f2e92d906767e +size 88048 diff --git a/Content/Vefects/Stylized_Fire/VFX/Water/Materials/MI_VFX_Stylized_Fire_02_Water.uasset b/Content/Vefects/Stylized_Fire/VFX/Water/Materials/MI_VFX_Stylized_Fire_02_Water.uasset new file mode 100644 index 0000000..c6fe7ef --- /dev/null +++ b/Content/Vefects/Stylized_Fire/VFX/Water/Materials/MI_VFX_Stylized_Fire_02_Water.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:17d4d13cae3e813a451104c7e47340a5caf3eb74b57dafb6b10ce60376fc560a +size 86665 diff --git a/Content/Vefects/Stylized_Fire/VFX/Water/Materials/MI_VFX_Stylized_Fire_Radial_01_Water.uasset b/Content/Vefects/Stylized_Fire/VFX/Water/Materials/MI_VFX_Stylized_Fire_Radial_01_Water.uasset new file mode 100644 index 0000000..ddaac22 --- /dev/null +++ b/Content/Vefects/Stylized_Fire/VFX/Water/Materials/MI_VFX_Stylized_Fire_Radial_01_Water.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:68e6c25176b67550136bcfeed319da37ab9632f9e111bc78ae68077d964107bb +size 89227 diff --git a/Content/Vefects/Stylized_Fire/VFX/Water/Materials/MI_VFX_Stylized_Fire_Radial_02_Water.uasset b/Content/Vefects/Stylized_Fire/VFX/Water/Materials/MI_VFX_Stylized_Fire_Radial_02_Water.uasset new file mode 100644 index 0000000..bc9583b --- /dev/null +++ b/Content/Vefects/Stylized_Fire/VFX/Water/Materials/MI_VFX_Stylized_Fire_Radial_02_Water.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:0d0c2f6d09d2d24206aaa7a33f5e5fc540753a82be8703d402cc3bd1746fa128 +size 88085 diff --git a/Content/Vefects/Stylized_Fire/VFX/Water/Particles/NS_Stylized_Fire_01_Water.uasset b/Content/Vefects/Stylized_Fire/VFX/Water/Particles/NS_Stylized_Fire_01_Water.uasset new file mode 100644 index 0000000..173f2d3 --- /dev/null +++ b/Content/Vefects/Stylized_Fire/VFX/Water/Particles/NS_Stylized_Fire_01_Water.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:c815b696d22be42fab721445bbb127b06887dc957e51cbcc2c2ae1473eea1131 +size 1407765 diff --git a/Content/Vefects/Stylized_Fire/VFX/Water/Particles/NS_Stylized_Fire_02_Water.uasset b/Content/Vefects/Stylized_Fire/VFX/Water/Particles/NS_Stylized_Fire_02_Water.uasset new file mode 100644 index 0000000..c604936 --- /dev/null +++ b/Content/Vefects/Stylized_Fire/VFX/Water/Particles/NS_Stylized_Fire_02_Water.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:8fc06d60d2805879157d34415d8d648678c840b8789d1b8f3ac46c67aa8f925a +size 1406728 diff --git a/Content/Vefects/Stylized_Fire/VFX/Water/Particles/NS_Stylized_Fire_Radial_01_Water.uasset b/Content/Vefects/Stylized_Fire/VFX/Water/Particles/NS_Stylized_Fire_Radial_01_Water.uasset new file mode 100644 index 0000000..5caf1b8 --- /dev/null +++ b/Content/Vefects/Stylized_Fire/VFX/Water/Particles/NS_Stylized_Fire_Radial_01_Water.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:6d94be26463726b4cfa692bc891cf44ec98d1fd548a0b6070404070b0ac027c6 +size 1373950 diff --git a/Content/Vefects/Stylized_Fire/VFX/Water/Particles/NS_Stylized_Fire_Radial_02_Water.uasset b/Content/Vefects/Stylized_Fire/VFX/Water/Particles/NS_Stylized_Fire_Radial_02_Water.uasset new file mode 100644 index 0000000..121ffce --- /dev/null +++ b/Content/Vefects/Stylized_Fire/VFX/Water/Particles/NS_Stylized_Fire_Radial_02_Water.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:6a5288713e634e48cfa8c8e156978b4488c719cb20bf5e08f46eddaa20991be9 +size 1373950 diff --git a/Plugins/IconStudio/IconStudio.uplugin b/Plugins/IconStudio/IconStudio.uplugin new file mode 100644 index 0000000..9f650c7 --- /dev/null +++ b/Plugins/IconStudio/IconStudio.uplugin @@ -0,0 +1,24 @@ +{ + "FileVersion": 3, + "Version": 1, + "VersionName": "1.0", + "FriendlyName": "Icon Studio", + "Description": "Studio de rendu d'icones : previsualise un mesh dans une scene isolee, avec eclairage de studio et fond transparent, puis exporte un PNG et une texture UI prete a l'emploi. Traite une selection entiere de DataAssets et remplit leur champ d'icone. Plugin made by Mathew Simon.", + "Category": "Editor Tools", + "CreatedBy": "Mathew Simon", + "CreatedByURL": "", + "DocsURL": "", + "MarketplaceURL": "", + "SupportURL": "", + "CanContainContent": true, + "IsBetaVersion": false, + "IsExperimentalVersion": false, + "Installed": false, + "Modules": [ + { + "Name": "IconStudio", + "Type": "Editor", + "LoadingPhase": "PostEngineInit" + } + ] +} diff --git a/Plugins/IconStudio/Source/IconStudio/IconStudio.Build.cs b/Plugins/IconStudio/Source/IconStudio/IconStudio.Build.cs new file mode 100644 index 0000000..209f13b --- /dev/null +++ b/Plugins/IconStudio/Source/IconStudio/IconStudio.Build.cs @@ -0,0 +1,41 @@ +using UnrealBuildTool; + +public class IconStudio : ModuleRules +{ + public IconStudio(ReadOnlyTargetRules Target) : base(Target) + { + PCHUsage = PCHUsageMode.UseExplicitOrSharedPCHs; + + PublicDependencyModuleNames.AddRange(new string[] + { + "Core", + "CoreUObject", + "Engine", + // UIconStudioSettings est un UDeveloperSettings : il apparait tout seul + // dans Project Settings, sans une ligne d'enregistrement a ecrire. + "DeveloperSettings", + }); + + PrivateDependencyModuleNames.AddRange(new string[] + { + "UnrealEd", + "EditorSubsystem", + "Slate", + "SlateCore", + // ReadPixels et la creation de render targets passent par le RHI. + "RenderCore", + "RHI", + // FImage / FImageUtils::SaveImageByExtension pour l'ecriture du PNG. + "ImageCore", + "AssetRegistry", + // Lecture de la selection du Content Browser pour le mode batch. + "ContentBrowser", + // La fenetre est ecrite en Slate : les deux panneaux de reglages sont + // des IDetailsView du moteur, et l'onglet se range dans Window > Tools. + "PropertyEditor", + "WorkspaceMenuStructure", + // Le bouton dans la barre d'outils et l'entree du menu Tools. + "ToolMenus", + }); + } +} diff --git a/Plugins/IconStudio/Source/IconStudio/Private/IconStudioModule.cpp b/Plugins/IconStudio/Source/IconStudio/Private/IconStudioModule.cpp new file mode 100644 index 0000000..4822bb1 --- /dev/null +++ b/Plugins/IconStudio/Source/IconStudio/Private/IconStudioModule.cpp @@ -0,0 +1,114 @@ +// Icon Studio - Mathew Simon + +#include "SIconStudioTab.h" + +#include "Framework/Docking/TabManager.h" +#include "Modules/ModuleManager.h" +#include "Styling/AppStyle.h" +#include "ToolMenus.h" +#include "Widgets/Docking/SDockTab.h" +#include "WorkspaceMenuStructure.h" +#include "WorkspaceMenuStructureModule.h" + +#define LOCTEXT_NAMESPACE "IconStudio" + +namespace IconStudioModuleLocal +{ + /** Identifiant de l'onglet. Sert aussi de cle a la disposition sauvegardee. */ + static const FName StudioTabName(TEXT("IconStudio")); + + TSharedRef SpawnStudioTab(const FSpawnTabArgs& Args) + { + return SNew(SDockTab) + .TabRole(ETabRole::NomadTab) + [ + SNew(SIconStudioTab) + ]; + } + + void OpenStudio() + { + // TryInvokeTab remet au premier plan l'onglet deja ouvert au lieu d'en + // creer un second, et le rouvre a l'endroit ou l'utilisateur l'avait + // docke la derniere fois. + FGlobalTabmanager::Get()->TryInvokeTab(StudioTabName); + } +} + +/** + * Le module pose le point d'entree de l'outil : l'onglet lui-meme, un bouton + * dans la barre d'outils et une entree dans le menu Tools. + * + * Le reste s'enregistre tout seul -- le sous-systeme est instancie par le + * moteur, les reglages apparaissent dans Project Settings grace a + * UDeveloperSettings. + */ +class FIconStudioModule : public IModuleInterface +{ +public: + virtual void StartupModule() override + { + using namespace IconStudioModuleLocal; + + FGlobalTabmanager::Get() + ->RegisterNomadTabSpawner(StudioTabName, FOnSpawnTab::CreateStatic(&SpawnStudioTab)) + .SetDisplayName(LOCTEXT("IconStudioLabel", "Icon Studio")) + .SetTooltipText(LOCTEXT("IconStudioTooltip", "Render item icons from a preset: preview, transparent background, batch over DataAssets.")) + .SetIcon(FSlateIcon(FAppStyle::GetAppStyleSetName(), TEXT("ClassIcon.Texture2D"))) + // Le range dans Window > Tools, avec les autres outils de l'editeur. + .SetGroup(WorkspaceMenu::GetMenuStructure().GetToolsCategory()); + + // Le systeme de menus n'est pas forcement pret quand un module de plugin + // demarre : ce rappel est la seule facon fiable d'etendre un menu, qu'on + // soit charge avant ou apres l'editeur de niveau. + UToolMenus::RegisterStartupCallback( + FSimpleMulticastDelegate::FDelegate::CreateRaw(this, &FIconStudioModule::RegisterMenus)); + } + + virtual void ShutdownModule() override + { + UToolMenus::UnRegisterStartupCallback(this); + UToolMenus::UnregisterOwner(this); + + if (FSlateApplication::IsInitialized()) + { + FGlobalTabmanager::Get()->UnregisterNomadTabSpawner(IconStudioModuleLocal::StudioTabName); + } + } + +private: + void RegisterMenus() + { + // Tout ce qui est enregistre sous ce proprietaire part d'un bloc au + // dechargement du module : sans lui, un rechargement a chaud laisserait + // un bouton mort dans la barre d'outils. + FToolMenuOwnerScoped OwnerScoped(this); + + const FSlateIcon Icon(FAppStyle::GetAppStyleSetName(), TEXT("ClassIcon.Texture2D")); + const FText Label = LOCTEXT("IconStudioLabel", "Icon Studio"); + const FText Tooltip = LOCTEXT("IconStudioTooltip", "Render item icons from a preset: preview, transparent background, batch over DataAssets."); + const FUIAction Action(FExecuteAction::CreateStatic(&IconStudioModuleLocal::OpenStudio)); + + if (UToolMenu* ToolsMenu = UToolMenus::Get()->ExtendMenu(TEXT("LevelEditor.MainMenu.Tools"))) + { + FToolMenuSection& Section = ToolsMenu->FindOrAddSection( + TEXT("IconStudio"), LOCTEXT("IconStudioSection", "Icon Studio")); + + Section.AddMenuEntry(TEXT("OpenIconStudio"), Label, Tooltip, Icon, Action); + } + + // Section "User" de la barre d'outils : l'emplacement prevu par le + // moteur pour les outils maison, a droite des boutons natifs. + if (UToolMenu* Toolbar = UToolMenus::Get()->ExtendMenu(TEXT("LevelEditor.LevelEditorToolBar.User"))) + { + FToolMenuSection& Section = Toolbar->FindOrAddSection(TEXT("IconStudio")); + + Section.AddEntry(FToolMenuEntry::InitToolBarButton( + TEXT("OpenIconStudio"), Action, Label, Tooltip, Icon)); + } + } +}; + +#undef LOCTEXT_NAMESPACE + +IMPLEMENT_MODULE(FIconStudioModule, IconStudio); diff --git a/Plugins/IconStudio/Source/IconStudio/Private/IconStudioPreset.cpp b/Plugins/IconStudio/Source/IconStudio/Private/IconStudioPreset.cpp new file mode 100644 index 0000000..f5d3226 --- /dev/null +++ b/Plugins/IconStudio/Source/IconStudio/Private/IconStudioPreset.cpp @@ -0,0 +1,23 @@ +// Icon Studio - Mathew Simon + +#include "IconStudioPreset.h" + +UIconStudioPreset::UIconStudioPreset() +{ + // Eclairage de studio classique en trois points, angles donnes par rapport + // a la camera : principale en haut a gauche, deboucheur doux a droite, + // contre-jour derriere. Ces valeurs marchent telles quelles sur presque tout + // objet ; elles sont la pour avoir quelque chose de correct au premier rendu, + // pas pour rester figees. + KeyLight = FIconStudioLight(-40.f, -35.f, 5.f, /*bShadows=*/true); + FillLight = FIconStudioLight(65.f, -5.f, 1.5f, /*bShadows=*/false); + RimLight = FIconStudioLight(155.f, 25.f, 4.f, /*bShadows=*/false); + RimLight.Color = FLinearColor(0.85f, 0.92f, 1.f); + + // Cubemap du moteur : sans reflet ambiant, tout ce qui est metallique sort + // noir. Reference en soft pour ne pas charger la texture tant qu'aucun rendu + // n'a ete demande. + SkyCubemap = TSoftObjectPtr(FSoftObjectPath(TEXT("/Engine/EngineMaterials/DefaultCubemap.DefaultCubemap"))); + + OutputDirectory.Path = TEXT("/Game/UI/Icons"); +} diff --git a/Plugins/IconStudio/Source/IconStudio/Private/IconStudioRenderer.cpp b/Plugins/IconStudio/Source/IconStudio/Private/IconStudioRenderer.cpp new file mode 100644 index 0000000..09ec511 --- /dev/null +++ b/Plugins/IconStudio/Source/IconStudio/Private/IconStudioRenderer.cpp @@ -0,0 +1,579 @@ +// Icon Studio - Mathew Simon + +#include "IconStudioRenderer.h" + +#include "IconStudioPreset.h" + +#include "Components/DirectionalLightComponent.h" +#include "Components/SceneCaptureComponent2D.h" +#include "Components/SkyLightComponent.h" +#include "Components/StaticMeshComponent.h" +#include "ContentStreaming.h" +#include "Engine/StaticMesh.h" +#include "Engine/Texture2D.h" +#include "Engine/TextureCube.h" +#include "Engine/TextureRenderTarget2D.h" +#include "Engine/World.h" +#include "Materials/MaterialInterface.h" +#include "PreviewScene.h" +#include "RenderingThread.h" +#include "TextureResource.h" + +namespace IconStudioRendererLocal +{ + /** Un pixel de la scene de rendu, avant reduction. */ + struct FSample + { + FLinearColor Color = FLinearColor::Black; + bool bCovered = false; + }; + + /** + * Compose la rotation d'une lumiere dans le repere de la camera. + * + * L'ordre compte : c'est la rotation camera qui porte l'offset, et non + * l'inverse. Ecrit dans l'autre sens, incliner la camera vers le bas ferait + * pivoter les lumieres autour d'un axe qui n'a rien a voir. + */ + FRotator ComposeLightRotation(const FRotator& CameraRotation, const FIconStudioLight& Light) + { + const FQuat Composed = CameraRotation.Quaternion() * FRotator(Light.Pitch, Light.Yaw, 0.f).Quaternion(); + return Composed.Rotator(); + } +} + +FIconStudioRenderer::FIconStudioRenderer() +{ +} + +FIconStudioRenderer::~FIconStudioRenderer() +{ + // La scene detient ses composants : les detruire soi-meme laisserait des + // proxies de rendu enregistres dans un monde qui n'existe plus. + Scene.Reset(); +} + +void FIconStudioRenderer::AddReferencedObjects(FReferenceCollector& Collector) +{ + Collector.AddReferencedObject(MeshComponent); + Collector.AddReferencedObject(CaptureComponent); + Collector.AddReferencedObject(KeyLightComponent); + Collector.AddReferencedObject(FillLightComponent); + Collector.AddReferencedObject(RimLightComponent); + Collector.AddReferencedObject(SkyLightComponent); + Collector.AddReferencedObject(ColorTarget); + Collector.AddReferencedObject(DepthTarget); + Collector.AddReferencedObject(PreviewTexture); + Collector.AddReferencedObject(AppliedSkyCubemap); +} + +void FIconStudioRenderer::EnsureScene() +{ + if (Scene.IsValid()) + { + return; + } + + // Pas d'eclairage par defaut : le studio pose lui-meme ses trois lumieres, + // et une directionnelle surnumeraire fausserait tous les presets. Pas de + // scene physique non plus, rien ne tombe ici. + FPreviewScene::ConstructionValues CVS; + CVS.SetCreateDefaultLighting(false) + .SetCreatePhysicsScene(false) + .ShouldSimulatePhysics(false) + .SetTransactional(false) + .AllowAudioPlayback(false) + .SetForceMipsResident(true); + + Scene = MakeUnique(CVS); + + MeshComponent = NewObject(GetTransientPackage(), NAME_None, RF_Transient); + MeshComponent->SetMobility(EComponentMobility::Movable); + Scene->AddComponent(MeshComponent, FTransform::Identity); + + auto MakeLight = [this](TObjectPtr& Out) + { + Out = NewObject(GetTransientPackage(), NAME_None, RF_Transient); + Out->SetMobility(EComponentMobility::Movable); + // Une directionnelle en mouvement declenche des cascades d'ombres + // dimensionnees pour un niveau entier ; ici l'objet tient dans quelques + // dizaines de centimetres, d'ou une seule cascade tres courte. + Out->DynamicShadowDistanceMovableLight = 2000.f; + Out->DynamicShadowCascades = 1; + Scene->AddComponent(Out, FTransform::Identity); + }; + + MakeLight(KeyLightComponent); + MakeLight(FillLightComponent); + MakeLight(RimLightComponent); + + SkyLightComponent = NewObject(GetTransientPackage(), NAME_None, RF_Transient); + SkyLightComponent->SetMobility(EComponentMobility::Movable); + SkyLightComponent->SourceType = SLS_SpecifiedCubemap; + SkyLightComponent->bLowerHemisphereIsBlack = false; + SkyLightComponent->CastShadows = false; + SkyLightComponent->bRealTimeCapture = false; + Scene->AddComponent(SkyLightComponent, FTransform::Identity); + + CaptureComponent = NewObject(GetTransientPackage(), NAME_None, RF_Transient); + CaptureComponent->SetMobility(EComponentMobility::Movable); + // La capture est declenchee a la main : sans monde tique, "chaque image" ne + // veut rien dire, et on ne veut surtout pas d'un rendu par frame d'editeur. + CaptureComponent->bCaptureEveryFrame = false; + CaptureComponent->bCaptureOnMovement = false; + CaptureComponent->bAlwaysPersistRenderingState = false; + CaptureComponent->PrimitiveRenderMode = ESceneCapturePrimitiveRenderMode::PRM_RenderScenePrimitives; + CaptureComponent->CompositeMode = SCCM_Overwrite; + Scene->AddComponent(CaptureComponent, FTransform::Identity); +} + +void FIconStudioRenderer::ApplyLighting(const UIconStudioPreset* Preset, const FRotator& CameraRotation) +{ + using namespace IconStudioRendererLocal; + + auto Setup = [&CameraRotation](UDirectionalLightComponent* Component, const FIconStudioLight& Light) + { + Component->SetVisibility(Light.bEnabled); + if (!Light.bEnabled) + { + return; + } + + Component->SetWorldRotation(ComposeLightRotation(CameraRotation, Light)); + Component->SetIntensity(Light.Intensity); + Component->SetLightColor(Light.Color); + Component->SetCastShadows(Light.bCastShadows); + }; + + Setup(KeyLightComponent, Preset->KeyLight); + Setup(FillLightComponent, Preset->FillLight); + Setup(RimLightComponent, Preset->RimLight); + + // Recapturer le ciel est l'operation la plus chere de toute la mise en place : + // on ne la refait que si la cubemap ou son intensite ont reellement change. + UTextureCube* const Cubemap = Preset->SkyCubemap.LoadSynchronous(); + const bool bSkyDirty = (Cubemap != AppliedSkyCubemap) || !FMath::IsNearlyEqual(AppliedSkyIntensity, Preset->SkyIntensity); + + SkyLightComponent->SetVisibility(Cubemap != nullptr && Preset->SkyIntensity > 0.f); + SkyLightComponent->SetLightColor(Preset->SkyColor); + + if (bSkyDirty) + { + SkyLightComponent->Cubemap = Cubemap; + SkyLightComponent->SetIntensity(Preset->SkyIntensity); + SkyLightComponent->RecaptureSky(); + Scene->UpdateCaptureContents(); + + AppliedSkyCubemap = Cubemap; + AppliedSkyIntensity = Preset->SkyIntensity; + } +} + +void FIconStudioRenderer::ApplyCamera(const UIconStudioPreset* Preset, const FRotator& CameraRotation, const FBoxSphereBounds& Bounds) +{ + const FRotationMatrix CameraBasis(CameraRotation); + const FVector Forward = CameraBasis.GetUnitAxis(EAxis::X); + const FVector Right = CameraBasis.GetUnitAxis(EAxis::Y); + const FVector Up = CameraBasis.GetUnitAxis(EAxis::Z); + + // Etendue reelle de la boite englobante une fois projetee sur les axes de la + // camera. Se contenter du rayon de la sphere englobante, comme on le voit + // souvent, cadre bien trop large des qu'un objet est allonge : une planche + // occuperait le tiers de son icone. + const FVector Extent = Bounds.BoxExtent; + auto ProjectExtent = [&Extent](const FVector& Axis) + { + return FMath::Abs(Axis.X * Extent.X) + FMath::Abs(Axis.Y * Extent.Y) + FMath::Abs(Axis.Z * Extent.Z); + }; + + const float HalfWidth = ProjectExtent(Right); + const float HalfHeight = ProjectExtent(Up); + const float HalfDepth = ProjectExtent(Forward); + + const float Padding = 1.f + FMath::Max(0.f, Preset->FramingPadding); + const float FrameHalfSize = Preset->bUseFixedScale + ? FMath::Max(1.f, Preset->FixedFrameWidth) * 0.5f + : FMath::Max(HalfWidth, HalfHeight) * Padding; + + // Recul : de quoi degager la profondeur de l'objet, plus une marge pour que + // le plan proche ne vienne jamais trancher dedans. + const float Distance = Preset->bOrthographic + ? HalfDepth + FrameHalfSize * 2.f + 100.f + : FrameHalfSize / FMath::Tan(FMath::DegreesToRadians(Preset->FieldOfView * 0.5f)) + HalfDepth; + + const FVector Offset = Right * (Preset->FramingOffset.X * FrameHalfSize * 2.f) + + Up * (Preset->FramingOffset.Y * FrameHalfSize * 2.f); + + CaptureComponent->SetWorldLocationAndRotation(Bounds.Origin - Forward * Distance - Offset, CameraRotation); + CaptureComponent->ProjectionType = Preset->bOrthographic ? ECameraProjectionMode::Orthographic : ECameraProjectionMode::Perspective; + CaptureComponent->OrthoWidth = FrameHalfSize * 2.f; + CaptureComponent->FOVAngle = Preset->FieldOfView; + CaptureComponent->bOverride_CustomNearClippingPlane = true; + CaptureComponent->CustomNearClippingPlane = 1.f; + + // Seuil de vide : tout ce qui est au-dela ne peut plus etre l'objet. Genereux + // a dessein, la valeur du fond etant de plusieurs ordres de grandeur au-dessus. + DepthThreshold = Distance + HalfDepth * 2.f + FrameHalfSize * 4.f + 1000.f; +} + +void FIconStudioRenderer::ApplyPostProcess(const UIconStudioPreset* Preset) +{ + FPostProcessSettings& PP = CaptureComponent->PostProcessSettings; + PP = FPostProcessSettings(); + CaptureComponent->PostProcessBlendWeight = 1.f; + + // Exposition figee. L'exposition automatique est le piege numero un de ce + // genre d'outil : elle compense la luminosite moyenne de l'image, donc un + // objet sombre serait eclairci et un objet clair assombri, et deux icones + // cote a cote n'auraient plus la meme lumiere alors que le preset, lui, + // n'a pas bouge. + PP.bOverride_AutoExposureMethod = true; + PP.AutoExposureMethod = AEM_Manual; + PP.bOverride_AutoExposureBias = true; + PP.AutoExposureBias = Preset->ExposureBias; + PP.bOverride_AutoExposureMinBrightness = true; + PP.AutoExposureMinBrightness = 1.f; + PP.bOverride_AutoExposureMaxBrightness = true; + PP.AutoExposureMaxBrightness = 1.f; + + PP.bOverride_BloomIntensity = true; + PP.BloomIntensity = Preset->BloomIntensity; + + // Tout ce qui simule un objectif photo n'a rien a faire sur une icone : le + // vignettage assombrit les coins, l'aberration colore les bords, le flou de + // mouvement bave sur un objet qui ne bouge pas. + PP.bOverride_VignetteIntensity = true; + PP.VignetteIntensity = 0.f; + PP.bOverride_SceneFringeIntensity = true; + PP.SceneFringeIntensity = 0.f; + PP.bOverride_MotionBlurAmount = true; + PP.MotionBlurAmount = 0.f; + PP.bOverride_DepthOfFieldFocalDistance = true; + PP.DepthOfFieldFocalDistance = 0.f; + PP.bOverride_AmbientOcclusionIntensity = true; + PP.AmbientOcclusionIntensity = Preset->bAmbientOcclusion ? 0.5f : 0.f; + + FEngineShowFlags& Flags = CaptureComponent->ShowFlags; + + // L'antialiasing du moteur doit rester eteint : le masque de transparence + // vient de la profondeur, qui n'est jamais lissee, alors que la couleur le + // serait -- les deux ne coincideraient plus sur les bords. La suranalyse + // fait ce travail bien mieux, et de facon identique sur les deux passes. + Flags.SetAntiAliasing(false); + Flags.SetTemporalAA(false); + Flags.SetMotionBlur(false); + + // Rien de tout cela n'existe dans une scene de studio, mais un show flag + // laisse actif suffit a colorer le fond ou a voiler l'objet. + Flags.SetAtmosphere(false); + Flags.SetFog(false); + Flags.SetVolumetricFog(false); + Flags.SetGrid(false); + Flags.SetSelectionOutline(false); + Flags.SetLensFlares(false); + Flags.SetScreenSpaceReflections(false); + Flags.SetToneCurve(true); + Flags.SetEyeAdaptation(true); +} + +UTextureRenderTarget2D* FIconStudioRenderer::EnsureTarget(TObjectPtr& Target, int32 Size, bool bFloatingPoint) +{ + if (Target && Target->SizeX == Size && Target->SizeY == Size) + { + return Target; + } + + Target = NewObject(GetTransientPackage(), NAME_None, RF_Transient); + // RTF_RGBA8 et non sa variante sRGB : la capture LDR ecrit deja des valeurs + // encodees en gamma, un second encodage par le materiel les delaverait. + Target->RenderTargetFormat = bFloatingPoint ? RTF_RGBA16f : RTF_RGBA8; + Target->ClearColor = FLinearColor::Black; + Target->bAutoGenerateMips = false; + Target->InitAutoFormat(Size, Size); + Target->UpdateResourceImmediate(true); + + return Target; +} + +bool FIconStudioRenderer::CaptureTo(UTextureRenderTarget2D* Target, uint8 CaptureSource) +{ + if (!Target) + { + return false; + } + + CaptureComponent->TextureTarget = Target; + CaptureComponent->CaptureSource = static_cast(CaptureSource); + + // Le monde de preview n'est pas tique : sans cet appel, les changements de + // transformation et de mesh faits juste au-dessus ne sont pas encore parvenus + // au thread de rendu, et la capture montrerait l'objet precedent. + if (UWorld* World = Scene->GetWorld()) + { + World->SendAllEndOfFrameUpdates(); + } + + CaptureComponent->CaptureScene(); + return true; +} + +bool FIconStudioRenderer::Render(UStaticMesh* Mesh, UMaterialInterface* MaterialOverride, const UIconStudioPreset* Preset, EIconStudioPass Pass, FIconStudioImage& OutImage) +{ + using namespace IconStudioRendererLocal; + + if (!Mesh || !Preset) + { + return false; + } + + EnsureScene(); + + MeshComponent->EmptyOverrideMaterials(); + MeshComponent->SetStaticMesh(Mesh); + if (MaterialOverride) + { + MeshComponent->SetMaterial(0, MaterialOverride); + } + MeshComponent->SetWorldTransform(FTransform::Identity); + + // Sans ca, une texture encore en cours de streaming rend l'icone floue -- + // et comme le monde n'est pas tique, le streaming ne rattraperait jamais son + // retard tout seul. StreamAllResources bloque le temps qu'il faut ; c'est + // acceptable pour un outil d'editeur, et c'est la seule facon d'avoir un + // resultat reproductible entre le premier rendu et les suivants. + MeshComponent->SetTextureForceResidentFlag(true); + MeshComponent->PrestreamTextures(60.f, /*bPrioritizeCharacterTextures=*/false); + IStreamingManager::Get().StreamAllResources(0.f); + + const FRotator CameraRotation(Preset->CameraPitch, Preset->CameraYaw, 0.f); + const FBoxSphereBounds Bounds = Mesh->GetBounds(); + + ApplyLighting(Preset, CameraRotation); + ApplyCamera(Preset, CameraRotation, Bounds); + ApplyPostProcess(Preset); + + const int32 FinalSize = FMath::Max(16, Preset->Resolution); + const int32 Supersample = FMath::Clamp(Preset->SupersampleFactor, 1, 8); + const int32 RenderSize = FinalSize * Supersample; + + UTextureRenderTarget2D* const Color = EnsureTarget(ColorTarget, RenderSize, /*bFloatingPoint=*/false); + UTextureRenderTarget2D* const Depth = EnsureTarget(DepthTarget, RenderSize, /*bFloatingPoint=*/true); + + // Passe de masque d'abord : c'est elle qui decide de ce qui existe, et la + // passe de couleur ne fait que l'habiller. + CaptureTo(Depth, SCS_SceneDepth); + TArray DepthPixels; + if (!Depth->GameThread_GetRenderTargetResource()->ReadFloat16Pixels(DepthPixels)) + { + return false; + } + + uint8 ColorSource = SCS_FinalColorLDR; + bool bColorIsSRGB = true; + switch (Pass) + { + case EIconStudioPass::BaseColor: + ColorSource = SCS_BaseColor; + // Le G-Buffer stocke l'albedo tel quel : le lire comme du sRGB + // l'eclaircirait deux fois. + bColorIsSRGB = false; + break; + case EIconStudioPass::Normal: + ColorSource = SCS_Normal; + bColorIsSRGB = false; + break; + case EIconStudioPass::Depth: + ColorSource = SCS_DeviceDepth; + bColorIsSRGB = false; + break; + default: + break; + } + + CaptureTo(Color, ColorSource); + TArray ColorPixels; + FReadSurfaceDataFlags ReadFlags(RCM_UNorm); + ReadFlags.SetLinearToGamma(false); + if (!Color->GameThread_GetRenderTargetResource()->ReadPixels(ColorPixels, ReadFlags)) + { + return false; + } + + const int32 Expected = RenderSize * RenderSize; + if (ColorPixels.Num() < Expected || DepthPixels.Num() < Expected) + { + return false; + } + + // ------------------------------------------------------------------ + // Reduction : un pixel final = SupersampleFactor^2 pixels de rendu. + // La couleur est moyennee sur les seuls sous-pixels couverts, ce qui donne + // directement une couleur non premultipliee -- pas de division par l'alpha, + // donc pas de bruit sur les bords tres transparents. + // ------------------------------------------------------------------ + TArray Accum; + TArray Coverage; + Accum.SetNumZeroed(FinalSize * FinalSize); + Coverage.SetNumZeroed(FinalSize * FinalSize); + + const float SubPixelCount = static_cast(Supersample * Supersample); + + for (int32 Y = 0; Y < FinalSize; ++Y) + { + for (int32 X = 0; X < FinalSize; ++X) + { + FLinearColor Sum = FLinearColor(0.f, 0.f, 0.f, 0.f); + int32 Covered = 0; + + for (int32 SubY = 0; SubY < Supersample; ++SubY) + { + const int32 SourceRow = (Y * Supersample + SubY) * RenderSize; + for (int32 SubX = 0; SubX < Supersample; ++SubX) + { + const int32 SourceIndex = SourceRow + X * Supersample + SubX; + const float SampleDepth = DepthPixels[SourceIndex].R.GetFloat(); + if (!(SampleDepth > 0.f && SampleDepth < DepthThreshold)) + { + continue; + } + + const FColor& Raw = ColorPixels[SourceIndex]; + // Moyenner des valeurs encodees en gamma assombrit les + // degrades ; on repasse en lineaire le temps de l'operation. + // L'alpha du render target n'a lui aucun sens ici -- il est + // force a 1 pour ne compter que les sous-pixels, jamais leur + // canal alpha parasite. + FLinearColor Sample = bColorIsSRGB + ? FLinearColor(Raw) + : FLinearColor(Raw.R / 255.f, Raw.G / 255.f, Raw.B / 255.f, 1.f); + Sample.A = 1.f; + Sum += Sample; + ++Covered; + } + } + + const int32 Index = Y * FinalSize + X; + Coverage[Index] = Covered / SubPixelCount; + Accum[Index] = Covered > 0 ? Sum / static_cast(Covered) : FLinearColor(0.f, 0.f, 0.f, 0.f); + } + } + + // ------------------------------------------------------------------ + // Etalement des bords : un pixel entierement transparent n'a aucune couleur + // definie. Laisse a noir, il se melange aux pixels voisins des que l'icone + // est filtree ou reduite, et l'objet se retrouve cerne d'un liseré sombre. + // On propage donc la couleur du bord vers l'exterieur, sans toucher a l'alpha. + // ------------------------------------------------------------------ + for (int32 PassIndex = 0; PassIndex < FMath::Clamp(Preset->EdgeBleedPasses, 0, 8); ++PassIndex) + { + TArray Bled = Accum; + bool bAnyFilled = false; + + for (int32 Y = 0; Y < FinalSize; ++Y) + { + for (int32 X = 0; X < FinalSize; ++X) + { + const int32 Index = Y * FinalSize + X; + if (Coverage[Index] > 0.f || Accum[Index].A > 0.f) + { + continue; + } + + FLinearColor Sum(0.f, 0.f, 0.f, 0.f); + int32 Count = 0; + for (int32 OffsetY = -1; OffsetY <= 1; ++OffsetY) + { + for (int32 OffsetX = -1; OffsetX <= 1; ++OffsetX) + { + const int32 NeighbourX = X + OffsetX; + const int32 NeighbourY = Y + OffsetY; + if (NeighbourX < 0 || NeighbourY < 0 || NeighbourX >= FinalSize || NeighbourY >= FinalSize) + { + continue; + } + + const int32 NeighbourIndex = NeighbourY * FinalSize + NeighbourX; + if (Coverage[NeighbourIndex] > 0.f || Accum[NeighbourIndex].A > 0.f) + { + Sum += Accum[NeighbourIndex]; + ++Count; + } + } + } + + if (Count > 0) + { + Bled[Index] = Sum / static_cast(Count); + // L'alpha sert ici de marqueur "ce pixel a recu une couleur", + // pour que la passe suivante puisse s'appuyer dessus. Il est + // remis a la couverture reelle au moment de l'encodage. + Bled[Index].A = 1.f; + bAnyFilled = true; + } + } + } + + if (!bAnyFilled) + { + break; + } + Accum = MoveTemp(Bled); + } + + // ------------------------------------------------------------------ + // Encodage final + // ------------------------------------------------------------------ + const bool bSolid = Preset->BackgroundMode == EIconStudioBackground::SolidColor; + const FLinearColor Background = Preset->BackgroundColor; + + OutImage.Size = FinalSize; + OutImage.Pixels.SetNumUninitialized(FinalSize * FinalSize); + + for (int32 Index = 0; Index < FinalSize * FinalSize; ++Index) + { + const float Alpha = Coverage[Index]; + FLinearColor Linear = Accum[Index]; + Linear.A = 1.f; + + if (bSolid) + { + // Le fond opaque est compose ici, et non rendu : changer sa couleur + // ne coute alors pas un seul rendu, et les deux modes partagent + // exactement le meme masque. + Linear = Linear * Alpha + Background * (1.f - Alpha); + Linear.A = 1.f; + } + + FColor Encoded = bColorIsSRGB ? Linear.ToFColor(/*bSRGB=*/true) : Linear.ToFColor(/*bSRGB=*/false); + Encoded.A = bSolid ? 255 : static_cast(FMath::RoundToInt(FMath::Clamp(Alpha, 0.f, 1.f) * 255.f)); + OutImage.Pixels[Index] = Encoded; + } + + return true; +} + +UTexture2D* FIconStudioRenderer::UpdatePreviewTexture(const FIconStudioImage& Image) +{ + if (!Image.IsValid()) + { + return PreviewTexture; + } + + if (!PreviewTexture || PreviewTexture->GetSizeX() != Image.Size || PreviewTexture->GetSizeY() != Image.Size) + { + // Pas d'AddToRoot : le renderer est un FGCObject, il declare deja cette + // texture dans AddReferencedObjects. L'enraciner en plus la rendrait + // immortelle, y compris apres la fermeture de l'outil. + PreviewTexture = UTexture2D::CreateTransient(Image.Size, Image.Size, PF_B8G8R8A8); + PreviewTexture->SRGB = true; + PreviewTexture->Filter = TF_Bilinear; + } + + FTexture2DMipMap& Mip = PreviewTexture->GetPlatformData()->Mips[0]; + void* Data = Mip.BulkData.Lock(LOCK_READ_WRITE); + FMemory::Memcpy(Data, Image.Pixels.GetData(), Image.Pixels.Num() * sizeof(FColor)); + Mip.BulkData.Unlock(); + PreviewTexture->UpdateResource(); + + return PreviewTexture; +} diff --git a/Plugins/IconStudio/Source/IconStudio/Private/IconStudioSession.cpp b/Plugins/IconStudio/Source/IconStudio/Private/IconStudioSession.cpp new file mode 100644 index 0000000..0aefca4 --- /dev/null +++ b/Plugins/IconStudio/Source/IconStudio/Private/IconStudioSession.cpp @@ -0,0 +1,24 @@ +// Icon Studio - Mathew Simon + +#include "IconStudioSession.h" + +#if WITH_EDITOR +void UIconStudioSession::PostEditChangeProperty(FPropertyChangedEvent& PropertyChangedEvent) +{ + Super::PostEditChangeProperty(PropertyChangedEvent); + + // Modifier la liste du lot ne change rien a l'image affichee : inutile de + // relancer un rendu complet a chaque ligne ajoutee. + const FName PropertyName = PropertyChangedEvent.GetPropertyName(); + static const TSet PreviewProperties = { + GET_MEMBER_NAME_CHECKED(UIconStudioSession, Preset), + GET_MEMBER_NAME_CHECKED(UIconStudioSession, Subject), + GET_MEMBER_NAME_CHECKED(UIconStudioSession, Pass), + }; + + if (PreviewProperties.Contains(PropertyName)) + { + OnSessionChanged.Broadcast(); + } +} +#endif diff --git a/Plugins/IconStudio/Source/IconStudio/Private/IconStudioSettings.cpp b/Plugins/IconStudio/Source/IconStudio/Private/IconStudioSettings.cpp new file mode 100644 index 0000000..d74087e --- /dev/null +++ b/Plugins/IconStudio/Source/IconStudio/Private/IconStudioSettings.cpp @@ -0,0 +1,13 @@ +// Icon Studio - Mathew Simon + +#include "IconStudioSettings.h" + +UIconStudioSettings::UIconStudioSettings() +{ + // Ordre volontaire : un DataAsset qui exposerait a la fois un mesh "en main" + // et un mesh "au sol" doit rendre celui qu'on voit dans le monde. + MeshPropertyNames = { TEXT("WorldMesh"), TEXT("Mesh"), TEXT("StaticMesh") }; + MaterialOverridePropertyName = TEXT("WorldMeshMaterial"); + IconPropertyName = TEXT("Icon"); + DisplayNamePropertyName = TEXT("ItemId"); +} diff --git a/Plugins/IconStudio/Source/IconStudio/Private/IconStudioSubsystem.cpp b/Plugins/IconStudio/Source/IconStudio/Private/IconStudioSubsystem.cpp new file mode 100644 index 0000000..93be57d --- /dev/null +++ b/Plugins/IconStudio/Source/IconStudio/Private/IconStudioSubsystem.cpp @@ -0,0 +1,619 @@ +// Icon Studio - Mathew Simon + +#include "IconStudioSubsystem.h" + +#include "IconStudioPreset.h" +#include "IconStudioRenderer.h" +#include "IconStudioSession.h" +#include "IconStudioSettings.h" + +#include "AssetRegistry/AssetRegistryModule.h" +#include "AssetRegistry/IAssetRegistry.h" +#include "ContentBrowserModule.h" +#include "Engine/StaticMesh.h" +#include "Engine/Texture2D.h" +#include "IContentBrowserSingleton.h" +#include "ImageCore.h" +#include "ImageUtils.h" +#include "Materials/MaterialInterface.h" +#include "Misc/PackageName.h" +#include "Misc/Paths.h" +#include "Misc/ScopedSlowTask.h" +#include "ObjectTools.h" +#include "UObject/SavePackage.h" +#include "UObject/UnrealType.h" + +DEFINE_LOG_CATEGORY_STATIC(LogIconStudio, Log, All); + +#define LOCTEXT_NAMESPACE "IconStudio" + +namespace IconStudioLocal +{ + /** Lit une propriete objet par son nom, en verifiant le type attendu. */ + UObject* GetObjectProperty(const UObject* Owner, FName PropertyName, const UClass* ExpectedClass) + { + if (!Owner || PropertyName.IsNone()) + { + return nullptr; + } + + FObjectPropertyBase* Property = FindFProperty(Owner->GetClass(), PropertyName); + if (!Property) + { + return nullptr; + } + + UObject* Value = Property->GetObjectPropertyValue_InContainer(Owner); + return (Value && Value->IsA(ExpectedClass)) ? Value : nullptr; + } + + /** Lit un nom lisible, quel que soit le type textuel de la propriete. */ + FString GetTextualProperty(const UObject* Owner, FName PropertyName) + { + if (!Owner || PropertyName.IsNone()) + { + return FString(); + } + + const UClass* Class = Owner->GetClass(); + if (const FNameProperty* NameProperty = FindFProperty(Class, PropertyName)) + { + const FName Value = NameProperty->GetPropertyValue_InContainer(Owner); + return Value.IsNone() ? FString() : Value.ToString(); + } + if (const FStrProperty* StringProperty = FindFProperty(Class, PropertyName)) + { + return StringProperty->GetPropertyValue_InContainer(Owner); + } + if (const FTextProperty* TextProperty = FindFProperty(Class, PropertyName)) + { + return TextProperty->GetPropertyValue_InContainer(Owner).ToString(); + } + + return FString(); + } +} + +void UIconStudioSubsystem::Initialize(FSubsystemCollectionBase& Collection) +{ + Super::Initialize(Collection); + + Renderer = MakeUnique(); + + // Regler une lumiere du preset doit rafraichir l'image tout de suite, or le + // preset est edite dans son propre Details View, que l'outil ne possede pas. + // Ecouter le signal global est le seul point d'accroche qui couvre les deux + // panneaux -- d'ou le filtrage strict juste apres, cette delegation etant + // emise pour toute propriete modifiee dans l'editeur. + PropertyChangedHandle = FCoreUObjectDelegates::OnObjectPropertyChanged.AddUObject(this, &UIconStudioSubsystem::HandleObjectPropertyChanged); +} + +void UIconStudioSubsystem::Deinitialize() +{ + FCoreUObjectDelegates::OnObjectPropertyChanged.Remove(PropertyChangedHandle); + PropertyChangedHandle.Reset(); + + Renderer.Reset(); + Session = nullptr; + + Super::Deinitialize(); +} + +UIconStudioSession* UIconStudioSubsystem::GetSession() +{ + if (!Session) + { + Session = NewObject(this, NAME_None, RF_Transient); + Session->OnSessionChanged.AddUObject(this, &UIconStudioSubsystem::HandleSessionChanged); + } + return Session; +} + +void UIconStudioSubsystem::HandleSessionChanged() +{ + RefreshPreview(); +} + +void UIconStudioSubsystem::HandleObjectPropertyChanged(UObject* Object, FPropertyChangedEvent& Event) +{ + if (!Session || !Object) + { + return; + } + + // Seul le preset en cours nous interesse : la session, elle, previent deja + // par son propre delegue. + if (Object == Session->Preset) + { + RefreshPreview(); + } +} + +void UIconStudioSubsystem::Status(const FString& Message, bool bIsError) +{ + if (bIsError) + { + UE_LOG(LogIconStudio, Warning, TEXT("%s"), *Message); + } + else + { + UE_LOG(LogIconStudio, Log, TEXT("%s"), *Message); + } + + OnStatus.Broadcast(Message); +} + +UStaticMesh* UIconStudioSubsystem::ResolveMesh(UObject* Subject, UMaterialInterface*& OutMaterialOverride) const +{ + OutMaterialOverride = nullptr; + + if (!Subject) + { + return nullptr; + } + + // Cas direct : on previsualise un mesh pour lui-meme. + if (UStaticMesh* AsMesh = Cast(Subject)) + { + return AsMesh; + } + + const UIconStudioSettings* Settings = GetDefault(); + + for (const FName& PropertyName : Settings->MeshPropertyNames) + { + if (UObject* Found = IconStudioLocal::GetObjectProperty(Subject, PropertyName, UStaticMesh::StaticClass())) + { + OutMaterialOverride = Cast( + IconStudioLocal::GetObjectProperty(Subject, Settings->MaterialOverridePropertyName, UMaterialInterface::StaticClass())); + return Cast(Found); + } + } + + return nullptr; +} + +FString UIconStudioSubsystem::BuildAssetName(UObject* Subject, const UIconStudioPreset* Preset) const +{ + const UIconStudioSettings* Settings = GetDefault(); + + FString BaseName = IconStudioLocal::GetTextualProperty(Subject, Settings->DisplayNamePropertyName); + if (BaseName.IsEmpty()) + { + // Retomber sur le nom de l'asset, en retirant son prefixe de convention : + // DA_Branch donnerait sinon T_Icon_DA_Branch. + BaseName = Subject->GetName(); + int32 UnderscoreIndex = INDEX_NONE; + if (BaseName.FindChar(TEXT('_'), UnderscoreIndex) && UnderscoreIndex <= 3) + { + BaseName.MidInline(UnderscoreIndex + 1); + } + } + + return ObjectTools::SanitizeObjectName(Preset->AssetPrefix + BaseName); +} + +UTexture2D* UIconStudioSubsystem::CreateOrUpdateTexture(const FIconStudioImage& Image, const FString& PackagePath, const FString& AssetName, TArray& OutTouchedPackages) +{ + const FString PackageName = PackagePath / AssetName; + if (!FPackageName::IsValidLongPackageName(PackageName)) + { + Status(FString::Printf(TEXT("Invalid output path: %s"), *PackageName), /*bIsError=*/true); + return nullptr; + } + + // Regenerer une icone doit MODIFIER la texture existante, jamais en creer une + // seconde : tout ce qui la reference -- les DataAssets, les widgets -- doit + // continuer de pointer au meme endroit. + const FString ObjectPath = PackageName + TEXT(".") + AssetName; + UObject* Existing = LoadObject(nullptr, *ObjectPath, nullptr, LOAD_NoWarn | LOAD_Quiet); + if (Existing && !Existing->IsA()) + { + Status(FString::Printf(TEXT("%s already exists and is not a texture."), *ObjectPath), /*bIsError=*/true); + return nullptr; + } + + UPackage* Package = Existing ? Existing->GetOutermost() : CreatePackage(*PackageName); + if (!Package) + { + return nullptr; + } + + UTexture2D* Texture = Cast(Existing); + const bool bIsNew = (Texture == nullptr); + if (bIsNew) + { + Texture = NewObject(Package, *AssetName, RF_Public | RF_Standalone); + } + + Texture->Modify(); + // FColor est stocke en BGRA en memoire : la source de texture prend donc les + // pixels tels quels, sans conversion. + Texture->Source.Init(Image.Size, Image.Size, 1, 1, TSF_BGRA8, reinterpret_cast(Image.Pixels.GetData())); + + // Reglages d'une texture d'interface : compression qui preserve l'alpha, + // aucun mip -- une icone est affichee a taille fixe, ses mips ne serviraient + // qu'a la rendre floue -- et pas de streaming, pour qu'elle soit la des la + // premiere image du HUD. + Texture->SRGB = true; + Texture->CompressionSettings = TC_EditorIcon; + Texture->MipGenSettings = TMGS_NoMipmaps; + Texture->LODGroup = TEXTUREGROUP_UI; + Texture->NeverStream = true; + Texture->Filter = TF_Bilinear; + Texture->PostEditChange(); + + if (bIsNew) + { + FAssetRegistryModule::AssetCreated(Texture); + } + + Package->MarkPackageDirty(); + OutTouchedPackages.AddUnique(Package); + + return Texture; +} + +bool UIconStudioSubsystem::AssignIcon(UObject* Subject, UTexture2D* Texture, TArray& OutTouchedPackages) const +{ + if (!Subject || !Texture) + { + return false; + } + + const UIconStudioSettings* Settings = GetDefault(); + if (Settings->IconPropertyName.IsNone()) + { + return false; + } + + FObjectPropertyBase* Property = FindFProperty(Subject->GetClass(), Settings->IconPropertyName); + if (!Property || !Property->PropertyClass || !Texture->IsA(Property->PropertyClass)) + { + return false; + } + + Subject->Modify(); + Property->SetObjectPropertyValue_InContainer(Subject, Texture); + + // Sans PostEditChangeProperty, un DataAsset qui valide ses donnees ou met en + // cache quelque chose ne verrait jamais passer la modification. + FPropertyChangedEvent ChangedEvent(Property); + Subject->PostEditChangeProperty(ChangedEvent); + Subject->MarkPackageDirty(); + + OutTouchedPackages.AddUnique(Subject->GetOutermost()); + return true; +} + +bool UIconStudioSubsystem::WritePng(const FIconStudioImage& Image, const FString& AssetName) const +{ + const FString Directory = FPaths::ProjectSavedDir() / TEXT("IconStudio"); + const FString FullPath = Directory / (AssetName + TEXT(".png")); + + FImage Output; + Output.Init(Image.Size, Image.Size, ERawImageFormat::BGRA8, EGammaSpace::sRGB); + FMemory::Memcpy(Output.RawData.GetData(), Image.Pixels.GetData(), Image.Pixels.Num() * sizeof(FColor)); + + return FImageUtils::SaveImageByExtension(*FullPath, Output); +} + +UTexture2D* UIconStudioSubsystem::RefreshPreview() +{ + UIconStudioSession* const Current = GetSession(); + + // Un seul point de sortie qui previent toujours, meme en cas d'echec : c'est + // ce signal qui sert aussi a la fenetre pour raccrocher son panneau de + // preset. S'en dispenser quand il n'y a rien a rendre laisserait l'interface + // afficher les reglages du preset precedent. + UTexture2D* Preview = nullptr; + + if (Current->Preset && Current->Subject && Renderer.IsValid()) + { + UMaterialInterface* MaterialOverride = nullptr; + if (UStaticMesh* const Mesh = ResolveMesh(Current->Subject, MaterialOverride)) + { + FIconStudioImage Image; + if (Renderer->Render(Mesh, MaterialOverride, Current->Preset, Current->Pass, Image)) + { + Preview = Renderer->UpdatePreviewTexture(Image); + } + else + { + Status(TEXT("Render failed."), /*bIsError=*/true); + } + } + else + { + Status(FString::Printf(TEXT("%s exposes no static mesh to render."), *Current->Subject->GetName()), /*bIsError=*/true); + } + } + + OnPreviewUpdated.Broadcast(Preview); + return Preview; +} + +bool UIconStudioSubsystem::GenerateInternal(UObject* Subject, TArray& OutTouchedPackages) +{ + UIconStudioSession* const Current = GetSession(); + + const UIconStudioPreset* const Preset = EnsurePreset(); + if (!Preset) + { + Status(TEXT("No preset available."), /*bIsError=*/true); + return false; + } + if (!Subject) + { + return false; + } + + const UIconStudioSettings* Settings = GetDefault(); + + if (Current->bSkipIfIconAlreadySet) + { + if (IconStudioLocal::GetObjectProperty(Subject, Settings->IconPropertyName, UTexture2D::StaticClass())) + { + Status(FString::Printf(TEXT("%s already has an icon, skipped."), *Subject->GetName())); + return false; + } + } + + UMaterialInterface* MaterialOverride = nullptr; + UStaticMesh* const Mesh = ResolveMesh(Subject, MaterialOverride); + if (!Mesh) + { + Status(FString::Printf(TEXT("%s exposes no static mesh, skipped."), *Subject->GetName()), /*bIsError=*/true); + return false; + } + + // La passe choisie dans la session s'applique aussi au lot : exporter les + // base colors de toute une famille d'objets est un besoin reel. C'est bien + // ce qu'on voit dans la previsualisation qui sera ecrit sur le disque. + FIconStudioImage Image; + if (!Renderer->Render(Mesh, MaterialOverride, Preset, Current->Pass, Image)) + { + Status(FString::Printf(TEXT("Render failed for %s."), *Subject->GetName()), /*bIsError=*/true); + return false; + } + + const FString AssetName = BuildAssetName(Subject, Preset); + + if (Preset->bAlsoWritePngToDisk && !WritePng(Image, AssetName)) + { + Status(FString::Printf(TEXT("Could not write the PNG for %s."), *AssetName), /*bIsError=*/true); + } + + UTexture2D* const Texture = CreateOrUpdateTexture(Image, Preset->OutputDirectory.Path, AssetName, OutTouchedPackages); + if (!Texture) + { + return false; + } + + if (Current->bAssignIconToDataAsset && Subject != Mesh) + { + if (AssignIcon(Subject, Texture, OutTouchedPackages)) + { + Status(FString::Printf(TEXT("%s -> %s (assigned)"), *Subject->GetName(), *AssetName)); + return true; + } + + Status(FString::Printf(TEXT("%s -> %s (created, but no '%s' property to assign it to)"), + *Subject->GetName(), *AssetName, *Settings->IconPropertyName.ToString())); + return true; + } + + Status(FString::Printf(TEXT("%s -> %s"), *Subject->GetName(), *AssetName)); + return true; +} + +bool UIconStudioSubsystem::SavePackageToDisk(UPackage* Package) +{ + if (!Package) + { + return false; + } + + const FString Filename = FPackageName::LongPackageNameToFilename(Package->GetName(), FPackageName::GetAssetPackageExtension()); + + FSavePackageArgs SaveArgs; + SaveArgs.TopLevelFlags = RF_Public | RF_Standalone; + SaveArgs.SaveFlags = SAVE_NoError; + SaveArgs.Error = GError; + + return UPackage::SavePackage(Package, nullptr, *Filename, SaveArgs); +} + +void UIconStudioSubsystem::SavePackages(const TArray& Packages) const +{ + if (!GetDefault()->bSaveModifiedPackages) + { + return; + } + + for (UPackage* Package : Packages) + { + SavePackageToDisk(Package); + } +} + +UIconStudioPreset* UIconStudioSubsystem::EnsurePreset() +{ + UIconStudioSession* const Current = GetSession(); + if (Current->Preset) + { + return Current->Preset; + } + + const IAssetRegistry& AssetRegistry = FModuleManager::LoadModuleChecked(TEXT("AssetRegistry")).Get(); + + // Tant que le registre balaie encore le projet, une recherche infructueuse + // ne prouve rien : creer un preset maintenant en ferait un second a cote de + // celui qu'on n'a pas encore vu. + if (AssetRegistry.IsLoadingAssets()) + { + Status(TEXT("Asset registry still scanning, try again in a second."), /*bIsError=*/true); + return nullptr; + } + + FARFilter Filter; + Filter.ClassPaths.Add(UIconStudioPreset::StaticClass()->GetClassPathName()); + Filter.bRecursiveClasses = true; + + TArray Existing; + AssetRegistry.GetAssets(Filter, Existing); + + if (!Existing.IsEmpty()) + { + Current->Preset = Cast(Existing[0].GetAsset()); + if (Current->Preset) + { + Status(FString::Printf(TEXT("Using preset %s."), *Current->Preset->GetName())); + return Current->Preset; + } + } + + // Aucun preset dans le projet : on en pose un, avec les valeurs par defaut + // de la classe. C'est un asset normal, que l'auteur retouche, renomme ou + // duplique ensuite comme n'importe quel autre. + static const FString DefaultPackageName(TEXT("/Game/EditorTools/DA_IconPreset_Default")); + static const FString DefaultAssetName(TEXT("DA_IconPreset_Default")); + + UPackage* const Package = CreatePackage(*DefaultPackageName); + if (!Package) + { + Status(TEXT("Could not create the default preset package."), /*bIsError=*/true); + return nullptr; + } + + UIconStudioPreset* const Preset = NewObject(Package, *DefaultAssetName, RF_Public | RF_Standalone); + FAssetRegistryModule::AssetCreated(Preset); + Package->MarkPackageDirty(); + SavePackageToDisk(Package); + + Current->Preset = Preset; + Status(FString::Printf(TEXT("Created a default preset: %s"), *DefaultPackageName)); + + return Preset; +} + +bool UIconStudioSubsystem::GenerateForSubject(UObject* Subject) +{ + TArray Touched; + const bool bSuccess = GenerateInternal(Subject, Touched); + SavePackages(Touched); + return bSuccess; +} + +bool UIconStudioSubsystem::GenerateCurrent() +{ + return GenerateForSubject(GetSession()->Subject); +} + +int32 UIconStudioSubsystem::GenerateBatch() +{ + UIconStudioSession* const Current = GetSession(); + if (Current->BatchTargets.IsEmpty()) + { + Status(TEXT("Batch list is empty."), /*bIsError=*/true); + return 0; + } + + TArray Touched; + int32 SuccessCount = 0; + + // Un lot de deux cents objets fige l'editeur plusieurs secondes : sans barre + // de progression, l'utilisateur croit a un plantage et tue le processus au + // milieu de l'ecriture des packages. + FScopedSlowTask SlowTask(static_cast(Current->BatchTargets.Num()), LOCTEXT("GeneratingIcons", "Generating icons...")); + SlowTask.MakeDialog(/*bShowCancelButton=*/true); + + for (const TObjectPtr& Target : Current->BatchTargets) + { + if (SlowTask.ShouldCancel()) + { + Status(TEXT("Batch cancelled.")); + break; + } + + SlowTask.EnterProgressFrame(1.f, FText::FromString(Target ? Target->GetName() : TEXT("..."))); + + if (GenerateInternal(Target, Touched)) + { + ++SuccessCount; + } + } + + SavePackages(Touched); + Status(FString::Printf(TEXT("Batch finished: %d / %d icons generated."), SuccessCount, Current->BatchTargets.Num())); + + return SuccessCount; +} + +int32 UIconStudioSubsystem::AddContentBrowserSelectionToBatch() +{ + FContentBrowserModule& ContentBrowser = FModuleManager::LoadModuleChecked(TEXT("ContentBrowser")); + + TArray Selection; + ContentBrowser.Get().GetSelectedAssets(Selection); + + UIconStudioSession* const Current = GetSession(); + int32 AddedCount = 0; + + for (const FAssetData& Asset : Selection) + { + // GetAsset charge l'objet : c'est voulu, on a besoin de lire ses + // proprietes, et il faudrait le charger de toute facon pour le rendre. + UObject* Loaded = Asset.GetAsset(); + if (!Loaded) + { + continue; + } + + UMaterialInterface* Unused = nullptr; + if (!ResolveMesh(Loaded, Unused)) + { + continue; + } + + if (!Current->BatchTargets.Contains(Loaded)) + { + Current->BatchTargets.Add(Loaded); + ++AddedCount; + } + } + + Status(FString::Printf(TEXT("%d asset(s) added to the batch (%d total)."), AddedCount, Current->BatchTargets.Num())); + return AddedCount; +} + +bool UIconStudioSubsystem::SetSubjectFromContentBrowser() +{ + FContentBrowserModule& ContentBrowser = FModuleManager::LoadModuleChecked(TEXT("ContentBrowser")); + + TArray Selection; + ContentBrowser.Get().GetSelectedAssets(Selection); + + for (const FAssetData& Asset : Selection) + { + UObject* Loaded = Asset.GetAsset(); + UMaterialInterface* Unused = nullptr; + if (Loaded && ResolveMesh(Loaded, Unused)) + { + GetSession()->Subject = Loaded; + RefreshPreview(); + return true; + } + } + + Status(TEXT("No renderable asset selected in the Content Browser."), /*bIsError=*/true); + return false; +} + +void UIconStudioSubsystem::ClearBatch() +{ + GetSession()->BatchTargets.Reset(); + Status(TEXT("Batch list cleared.")); +} + +#undef LOCTEXT_NAMESPACE diff --git a/Plugins/IconStudio/Source/IconStudio/Private/SIconStudioTab.cpp b/Plugins/IconStudio/Source/IconStudio/Private/SIconStudioTab.cpp new file mode 100644 index 0000000..b70ac88 --- /dev/null +++ b/Plugins/IconStudio/Source/IconStudio/Private/SIconStudioTab.cpp @@ -0,0 +1,362 @@ +// Icon Studio - Mathew Simon + +#include "SIconStudioTab.h" + +#include "IconStudioPreset.h" +#include "IconStudioSession.h" +#include "IconStudioSubsystem.h" + +#include "Editor.h" +#include "Engine/Texture2D.h" +#include "IDetailsView.h" +#include "Modules/ModuleManager.h" +#include "PropertyEditorModule.h" +#include "Styling/AppStyle.h" +#include "Widgets/Images/SImage.h" +#include "Widgets/Input/SButton.h" +#include "Widgets/Layout/SBorder.h" +#include "Widgets/Layout/SScaleBox.h" +#include "Widgets/Layout/SSeparator.h" +#include "Widgets/Layout/SSplitter.h" +#include "Widgets/SBoxPanel.h" +#include "Widgets/SOverlay.h" +#include "Widgets/Text/STextBlock.h" + +#define LOCTEXT_NAMESPACE "IconStudio" + +namespace IconStudioTabLocal +{ + /** Un bouton de la barre d'actions, tous construits pareil. */ + TSharedRef MakeButton(const FText& Label, const FText& Tooltip, FOnClicked OnClicked) + { + return SNew(SButton) + .Text(Label) + .ToolTipText(Tooltip) + .HAlign(HAlign_Center) + .ContentPadding(FMargin(10.f, 4.f)) + .OnClicked(OnClicked); + } +} + +UIconStudioSubsystem* SIconStudioTab::GetStudio() +{ + return GEditor ? GEditor->GetEditorSubsystem() : nullptr; +} + +void SIconStudioTab::Construct(const FArguments& InArgs) +{ + PreviewBrush.DrawAs = ESlateBrushDrawType::Image; + PreviewBrush.ImageSize = FVector2D(256.f, 256.f); + + StatusMessage = LOCTEXT("Ready", "Pick a preset and a subject to start."); + + ChildSlot + [ + SNew(SSplitter) + .Orientation(Orient_Horizontal) + + + SSplitter::Slot() + .Value(0.62f) + [ + BuildPreviewPanel() + ] + + + SSplitter::Slot() + .Value(0.38f) + [ + BuildSettingsPanel() + ] + ]; + + // L'abonnement vient apres la construction : les panneaux de details doivent + // exister avant qu'un premier rendu ne cherche a les remplir. + if (UIconStudioSubsystem* const Studio = GetStudio()) + { + PreviewHandle = Studio->OnPreviewUpdated.AddSP(this, &SIconStudioTab::HandlePreviewUpdated); + StatusHandle = Studio->OnStatus.AddSP(this, &SIconStudioTab::HandleStatus); + + SessionDetails->SetObject(Studio->GetSession()); + + // Ouvrir la fenetre suffit a avoir un preset utilisable : celui du + // projet s'il en existe un, un neuf sinon. + Studio->EnsurePreset(); + Studio->RefreshPreview(); + } +} + +SIconStudioTab::~SIconStudioTab() +{ + // Le sous-systeme survit a la fenetre : sans desabonnement il diffuserait + // dans un widget detruit a la premiere generation suivante. + if (UIconStudioSubsystem* const Studio = GetStudio()) + { + Studio->OnPreviewUpdated.Remove(PreviewHandle); + Studio->OnStatus.Remove(StatusHandle); + } +} + +TSharedRef SIconStudioTab::BuildPreviewPanel() +{ + // Le damier est le seul moyen de VOIR la transparence : sur un aplat, une + // icone au fond noir et une icone au fond transparent sont identiques, et on + // ne s'apercoit du probleme qu'une fois la texture dans le jeu. + const FSlateBrush* Checkerboard = FAppStyle::Get().GetBrush(TEXT("Checkerboard")); + + const TAttribute PlaceholderVisibility = TAttribute::CreateLambda( + [this]() { return PreviewBrush.GetResourceObject() ? EVisibility::Collapsed : EVisibility::Visible; }); + + return SNew(SVerticalBox) + + + SVerticalBox::Slot() + .FillHeight(1.f) + .Padding(6.f) + [ + SNew(SBorder) + .BorderImage(FAppStyle::Get().GetBrush(TEXT("ToolPanel.GroupBorder"))) + .Padding(8.f) + [ + SNew(SOverlay) + + + SOverlay::Slot() + [ + SNew(SImage).Image(Checkerboard) + ] + + + SOverlay::Slot() + .HAlign(HAlign_Center) + .VAlign(VAlign_Center) + [ + SNew(SScaleBox) + .Stretch(EStretch::ScaleToFit) + // Jamais au-dela de la taille native : une icone de 256 + // pixels etiree sur tout le panneau parait floue et donne une + // fausse idee de sa nettete reelle. On la juge a sa taille. + .StretchDirection(EStretchDirection::DownOnly) + [ + SNew(SImage) + .Image(&PreviewBrush) + .Visibility(this, &SIconStudioTab::GetPreviewVisibility) + ] + ] + + + SOverlay::Slot() + .HAlign(HAlign_Center) + .VAlign(VAlign_Center) + [ + SNew(STextBlock) + .Text(LOCTEXT("NoPreview", "No preview.\nPick a preset, then select an asset and press Use Selection.")) + .Justification(ETextJustify::Center) + .Visibility(PlaceholderVisibility) + ] + ] + ] + + + SVerticalBox::Slot() + .AutoHeight() + .Padding(6.f, 0.f) + [ + SNew(SHorizontalBox) + + + SHorizontalBox::Slot() + .AutoWidth() + .Padding(0.f, 0.f, 4.f, 0.f) + [ + IconStudioTabLocal::MakeButton( + LOCTEXT("UseSelection", "Use Selection"), + LOCTEXT("UseSelectionTip", "Preview the first renderable asset selected in the Content Browser."), + FOnClicked::CreateSP(this, &SIconStudioTab::OnUseSelectionClicked)) + ] + + + SHorizontalBox::Slot() + .AutoWidth() + .Padding(0.f, 0.f, 4.f, 0.f) + [ + IconStudioTabLocal::MakeButton( + LOCTEXT("Refresh", "Refresh"), + LOCTEXT("RefreshTip", "Render the preview again."), + FOnClicked::CreateSP(this, &SIconStudioTab::OnRefreshClicked)) + ] + + + SHorizontalBox::Slot() + .FillWidth(1.f) + [ + IconStudioTabLocal::MakeButton( + LOCTEXT("Generate", "Generate"), + LOCTEXT("GenerateTip", "Write the icon of the previewed subject and assign it."), + FOnClicked::CreateSP(this, &SIconStudioTab::OnGenerateClicked)) + ] + ] + + + SVerticalBox::Slot() + .AutoHeight() + .Padding(6.f) + [ + SNew(STextBlock) + .Text(this, &SIconStudioTab::GetStatusText) + .AutoWrapText(true) + ]; +} + +TSharedRef SIconStudioTab::BuildSettingsPanel() +{ + FPropertyEditorModule& PropertyEditor = FModuleManager::LoadModuleChecked(TEXT("PropertyEditor")); + + FDetailsViewArgs SessionArgs; + SessionArgs.bAllowSearch = false; + SessionArgs.bHideSelectionTip = true; + SessionArgs.bShowOptions = false; + // Le bandeau de nom afficherait "IconStudioSession", ce qui n'apprend rien. + SessionArgs.NameAreaSettings = FDetailsViewArgs::HideNameArea; + SessionDetails = PropertyEditor.CreateDetailView(SessionArgs); + + FDetailsViewArgs PresetArgs = SessionArgs; + // Le preset a beaucoup plus de champs : la recherche y devient utile. + PresetArgs.bAllowSearch = true; + PresetDetails = PropertyEditor.CreateDetailView(PresetArgs); + + return SNew(SVerticalBox) + + + SVerticalBox::Slot() + .AutoHeight() + [ + SessionDetails.ToSharedRef() + ] + + + SVerticalBox::Slot() + .AutoHeight() + .Padding(0.f, 4.f) + [ + SNew(SSeparator) + ] + + + SVerticalBox::Slot() + .FillHeight(1.f) + [ + PresetDetails.ToSharedRef() + ] + + + SVerticalBox::Slot() + .AutoHeight() + .Padding(4.f) + [ + SNew(SHorizontalBox) + + + SHorizontalBox::Slot() + .FillWidth(1.f) + .Padding(0.f, 0.f, 4.f, 0.f) + [ + IconStudioTabLocal::MakeButton( + LOCTEXT("AddSelection", "Add Selection"), + LOCTEXT("AddSelectionTip", "Add every renderable asset selected in the Content Browser to the batch."), + FOnClicked::CreateSP(this, &SIconStudioTab::OnAddSelectionClicked)) + ] + + + SHorizontalBox::Slot() + .FillWidth(1.f) + .Padding(0.f, 0.f, 4.f, 0.f) + [ + IconStudioTabLocal::MakeButton( + LOCTEXT("GenerateBatch", "Generate Batch"), + LOCTEXT("GenerateBatchTip", "Render every asset in the batch list and assign their icons."), + FOnClicked::CreateSP(this, &SIconStudioTab::OnGenerateBatchClicked)) + ] + + + SHorizontalBox::Slot() + .AutoWidth() + [ + IconStudioTabLocal::MakeButton( + LOCTEXT("ClearBatch", "Clear"), + LOCTEXT("ClearBatchTip", "Empty the batch list."), + FOnClicked::CreateSP(this, &SIconStudioTab::OnClearBatchClicked)) + ] + ]; +} + +EVisibility SIconStudioTab::GetPreviewVisibility() const +{ + return PreviewBrush.GetResourceObject() ? EVisibility::Visible : EVisibility::Collapsed; +} + +void SIconStudioTab::HandlePreviewUpdated(UTexture2D* PreviewTexture) +{ + if (PreviewTexture) + { + PreviewBrush.SetResourceObject(PreviewTexture); + PreviewBrush.ImageSize = FVector2D(PreviewTexture->GetSizeX(), PreviewTexture->GetSizeY()); + } + else + { + PreviewBrush.SetResourceObject(nullptr); + } + + // Le panneau du bas suit le preset choisi dans celui du haut. SetObject sur + // le meme objet ne fait rien, donc editer une valeur ne coupe pas la saisie + // en cours malgre le rendu declenche a chaque frappe. + if (PresetDetails.IsValid()) + { + UIconStudioSubsystem* const Studio = GetStudio(); + UIconStudioPreset* const Preset = Studio ? Studio->GetSession()->Preset.Get() : nullptr; + PresetDetails->SetObject(Preset); + } +} + +void SIconStudioTab::HandleStatus(const FString& Message) +{ + StatusMessage = FText::FromString(Message); +} + +FReply SIconStudioTab::OnRefreshClicked() +{ + if (UIconStudioSubsystem* const Studio = GetStudio()) + { + Studio->RefreshPreview(); + } + return FReply::Handled(); +} + +FReply SIconStudioTab::OnGenerateClicked() +{ + if (UIconStudioSubsystem* const Studio = GetStudio()) + { + Studio->GenerateCurrent(); + } + return FReply::Handled(); +} + +FReply SIconStudioTab::OnUseSelectionClicked() +{ + if (UIconStudioSubsystem* const Studio = GetStudio()) + { + Studio->SetSubjectFromContentBrowser(); + } + return FReply::Handled(); +} + +FReply SIconStudioTab::OnAddSelectionClicked() +{ + if (UIconStudioSubsystem* const Studio = GetStudio()) + { + Studio->AddContentBrowserSelectionToBatch(); + } + return FReply::Handled(); +} + +FReply SIconStudioTab::OnGenerateBatchClicked() +{ + if (UIconStudioSubsystem* const Studio = GetStudio()) + { + Studio->GenerateBatch(); + } + return FReply::Handled(); +} + +FReply SIconStudioTab::OnClearBatchClicked() +{ + if (UIconStudioSubsystem* const Studio = GetStudio()) + { + Studio->ClearBatch(); + } + return FReply::Handled(); +} + +#undef LOCTEXT_NAMESPACE diff --git a/Plugins/IconStudio/Source/IconStudio/Private/SIconStudioTab.h b/Plugins/IconStudio/Source/IconStudio/Private/SIconStudioTab.h new file mode 100644 index 0000000..74ca5a4 --- /dev/null +++ b/Plugins/IconStudio/Source/IconStudio/Private/SIconStudioTab.h @@ -0,0 +1,67 @@ +// Icon Studio - Mathew Simon + +#pragma once + +#include "CoreMinimal.h" +#include "Styling/SlateBrush.h" +#include "Widgets/SCompoundWidget.h" + +class IDetailsView; +class UIconStudioSubsystem; +class UTexture2D; + +/** + * La fenetre du studio, entierement en Slate. + * + * Aucun asset a creer dans l'editeur : l'outil est complet des le chargement du + * module. En contrepartie, retoucher la mise en page demande une recompilation -- + * un echange raisonnable pour un outil dont l'interface ne bouge quasiment pas. + * + * Les deux panneaux de droite sont des IDetailsView, ceux du moteur : ils + * fabriquent leurs champs a partir des UPROPERTY de la session et du preset. + * Ajouter un reglage a UIconStudioPreset le fait donc apparaitre tout seul, sans + * une ligne d'interface a ecrire. + */ +class SIconStudioTab : public SCompoundWidget +{ +public: + SLATE_BEGIN_ARGS(SIconStudioTab) {} + SLATE_END_ARGS() + + void Construct(const FArguments& InArgs); + virtual ~SIconStudioTab() override; + +private: + static UIconStudioSubsystem* GetStudio(); + + TSharedRef BuildPreviewPanel(); + TSharedRef BuildSettingsPanel(); + + void HandlePreviewUpdated(UTexture2D* PreviewTexture); + void HandleStatus(const FString& Message); + + FReply OnRefreshClicked(); + FReply OnGenerateClicked(); + FReply OnUseSelectionClicked(); + FReply OnAddSelectionClicked(); + FReply OnGenerateBatchClicked(); + FReply OnClearBatchClicked(); + + FText GetStatusText() const { return StatusMessage; } + EVisibility GetPreviewVisibility() const; + + TSharedPtr SessionDetails; + TSharedPtr PresetDetails; + + /** + * La brosse pointe sur la texture de previsualisation, qui est recreee des + * que la resolution change : elle est donc reassignee a chaque rendu, jamais + * construite une fois pour toutes. + */ + FSlateBrush PreviewBrush; + + FText StatusMessage; + + FDelegateHandle PreviewHandle; + FDelegateHandle StatusHandle; +}; diff --git a/Plugins/IconStudio/Source/IconStudio/Public/IconStudioPreset.h b/Plugins/IconStudio/Source/IconStudio/Public/IconStudioPreset.h new file mode 100644 index 0000000..57d3020 --- /dev/null +++ b/Plugins/IconStudio/Source/IconStudio/Public/IconStudioPreset.h @@ -0,0 +1,176 @@ +// Icon Studio - Mathew Simon + +#pragma once + +#include "CoreMinimal.h" +#include "Engine/DataAsset.h" +#include "IconStudioTypes.h" +#include "IconStudioPreset.generated.h" + +class UTextureCube; + +/** + * Le "look" d'une serie d'icones : angle, cadrage, lumieres, resolution. + * + * C'est la piece centrale de l'outil. Regler ces valeurs a la main objet par + * objet donnerait deux cents icones qui ne vont pas ensemble -- des tailles + * apparentes differentes, des ombres qui changent de cote. Un preset se regle + * une fois sur un objet representatif, puis tous les autres passent dedans. + * + * Creer autant de presets que de familles d'icones : un pour l'inventaire, un + * autre pour les grandes vignettes de recettes, par exemple. + */ +UCLASS(BlueprintType) +class ICONSTUDIO_API UIconStudioPreset : public UDataAsset +{ + GENERATED_BODY() + +public: + UIconStudioPreset(); + + // ------------------------------------------------------------------ + // Camera et cadrage + // ------------------------------------------------------------------ + + /** Rotation horizontale autour de l'objet. */ + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Camera", meta = (ClampMin = "-180", ClampMax = "180", Units = "deg")) + float CameraYaw = 135.f; + + /** Negatif = on regarde l'objet de haut. */ + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Camera", meta = (ClampMin = "-89", ClampMax = "89", Units = "deg")) + float CameraPitch = -25.f; + + /** + * Projection orthographique par defaut : sans point de fuite, une caisse + * reste une caisse et deux objets de tailles differentes se comparent a + * l'oeil. La perspective ne sert que pour un rendu de presentation. + */ + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Camera") + bool bOrthographic = true; + + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Camera", meta = (EditCondition = "!bOrthographic", ClampMin = "5", ClampMax = "120", Units = "deg")) + float FieldOfView = 30.f; + + /** Marge laissee entre l'objet et le bord de l'image, en fraction de sa taille. */ + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Camera", meta = (ClampMin = "0", UIMax = "0.5")) + float FramingPadding = 0.06f; + + /** + * Decalage fin du cadre, en fraction de la largeur d'image. + * Sert quand l'objet est visuellement desequilibre (un manche tres long). + */ + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Camera", meta = (UIMin = "-0.5", UIMax = "0.5")) + FVector2D FramingOffset = FVector2D::ZeroVector; + + /** + * Cadre tous les objets a la meme echelle au lieu de remplir l'image. + * + * Cadrage automatique : une pomme et un tronc occupent la meme place dans + * leur icone. Echelle fixe : le tronc est visiblement plus gros, ce qui aide + * a lire l'inventaire mais demande de choisir une taille de reference qui + * ne laisse rien deborder. + */ + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Camera") + bool bUseFixedScale = false; + + /** Largeur du cadre en centimetres quand l'echelle est fixe. */ + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Camera", meta = (EditCondition = "bUseFixedScale", ClampMin = "1", Units = "cm")) + float FixedFrameWidth = 100.f; + + // ------------------------------------------------------------------ + // Eclairage + // ------------------------------------------------------------------ + + /** Lumiere principale : celle qui dessine la forme. */ + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Lighting") + FIconStudioLight KeyLight; + + /** Deboucheur : remonte les ombres du cote oppose, sans ombre portee. */ + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Lighting") + FIconStudioLight FillLight; + + /** Contre-jour : decolle l'objet du fond par un liseré lumineux. */ + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Lighting") + FIconStudioLight RimLight; + + /** + * Cubemap d'ambiance. Sans elle, tout ce qui est metallique ou lisse rend + * noir : le speculaire n'a rien a reflechir dans une scene vide. + */ + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Lighting") + TSoftObjectPtr SkyCubemap; + + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Lighting", meta = (ClampMin = "0", UIMax = "5")) + float SkyIntensity = 1.f; + + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Lighting") + FLinearColor SkyColor = FLinearColor::White; + + // ------------------------------------------------------------------ + // Rendu + // ------------------------------------------------------------------ + + /** Cote de l'image finale, en pixels. */ + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Render", meta = (ClampMin = "16", ClampMax = "2048")) + int32 Resolution = 256; + + /** + * Facteur de suranalyse : on rend a Resolution x ce facteur, puis on reduit. + * + * C'est le seul antialiasing utilisable ici. L'antialiasing temporel du + * moteur a besoin d'un historique de plusieurs images, qu'une capture unique + * n'a pas : il produirait un tremblement different a chaque rendu, et surtout + * un masque de transparence different entre les deux passes de fond. + */ + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Render", meta = (ClampMin = "1", ClampMax = "8")) + int32 SupersampleFactor = 4; + + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Render") + EIconStudioBackground BackgroundMode = EIconStudioBackground::Transparent; + + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Render", meta = (EditCondition = "BackgroundMode == EIconStudioBackground::SolidColor", EditConditionHides)) + FLinearColor BackgroundColor = FLinearColor(0.05f, 0.05f, 0.06f, 1.f); + + /** Correction d'exposition, en diaphragmes. L'exposition auto est desactivee. */ + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Render", meta = (UIMin = "-5", UIMax = "5")) + float ExposureBias = 0.f; + + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Render", meta = (ClampMin = "0", UIMax = "2")) + float BloomIntensity = 0.f; + + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Render") + bool bAmbientOcclusion = true; + + /** + * Etale la couleur des bords sur les pixels transparents. + * + * Un pixel entierement transparent n'a pas de couleur definie ; laisse a + * noir, il ressort en liseré sombre des que l'icone est filtree ou reduite. + * Le defaut classique des icones generees. + */ + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Render", meta = (ClampMin = "0", ClampMax = "8")) + int32 EdgeBleedPasses = 2; + + // ------------------------------------------------------------------ + // Sortie + // ------------------------------------------------------------------ + + /** Dossier de destination des textures generees. */ + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Output", meta = (ContentDir)) + FDirectoryPath OutputDirectory; + + /** Prefixe des assets crees. Le suffixe vient du nom de l'objet source. */ + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Output") + FString AssetPrefix = TEXT("T_Icon_"); + + /** + * Ecrit aussi un PNG dans Saved/IconStudio/. + * Utile pour retoucher une icone dans un logiciel externe ; l'asset, lui, + * est cree dans tous les cas. + */ + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Output") + bool bAlsoWritePngToDisk = true; + + /** Resolution effective du rendu avant reduction. */ + int32 GetRenderResolution() const { return Resolution * FMath::Clamp(SupersampleFactor, 1, 8); } +}; diff --git a/Plugins/IconStudio/Source/IconStudio/Public/IconStudioRenderer.h b/Plugins/IconStudio/Source/IconStudio/Public/IconStudioRenderer.h new file mode 100644 index 0000000..04fcb33 --- /dev/null +++ b/Plugins/IconStudio/Source/IconStudio/Public/IconStudioRenderer.h @@ -0,0 +1,112 @@ +// Icon Studio - Mathew Simon + +#pragma once + +#include "CoreMinimal.h" +#include "UObject/GCObject.h" +#include "IconStudioTypes.h" + +class FPreviewScene; +class UDirectionalLightComponent; +class UIconStudioPreset; +class UMaterialInterface; +class USceneCaptureComponent2D; +class USkyLightComponent; +class UStaticMesh; +class UStaticMeshComponent; +class UTexture2D; +class UTextureCube; +class UTextureRenderTarget2D; + +/** + * Le moteur de rendu du studio : une scene isolee, trois lumieres et une + * capture, reutilisees d'un objet a l'autre. + * + * Rien de tout cela ne touche au niveau ouvert dans l'editeur. FPreviewScene + * cree son propre UWorld, invisible et non tique, comme celui de l'editeur de + * Static Mesh -- on peut donc generer un lot entier pendant qu'une carte est + * chargee, sans y poser le moindre acteur. La scene et ses composants sont + * construits une seule fois puis reconfigures a chaque rendu : recreer un UWorld + * par icone couterait bien plus cher que tout le reste du travail. + * + * COMMENT LA TRANSPARENCE EST OBTENUE + * + * Une capture de scene ne fournit pas de canal alpha exploitable : elle efface + * toujours sa cible en noir opaque, sans tenir compte de la couleur de fond du + * render target, et l'alpha qui ressort du post-process ne vaut quelque chose + * qu'avec le support alpha active pour le projet entier -- un reglage de rendu + * global qu'un outil d'icones n'a pas a imposer. + * + * D'ou deux captures du meme point de vue : une de couleur, une de PROFONDEUR. + * La profondeur dit exactement ou se trouve de la geometrie, et c'est elle qui + * sert de masque. Comme l'antialiasing du moteur est desactive, chaque pixel de + * rendu est franc : soit objet, soit vide. La douceur des bords vient de la + * suranalyse -- on rend a quatre fois la taille finale et on moyenne, ce qui + * donne un alpha a seize niveaux et une couleur de bord juste. + * + * Limite assumee : un materiau TRANSLUCIDE n'ecrit pas dans le tampon de + * profondeur, il sera donc absent du masque. Pour du verre ou du feuillage + * translucide, passer le materiau en Masked le temps du rendu. + */ +class ICONSTUDIO_API FIconStudioRenderer : public FGCObject +{ +public: + FIconStudioRenderer(); + virtual ~FIconStudioRenderer(); + + //~ FGCObject + virtual void AddReferencedObjects(FReferenceCollector& Collector) override; + virtual FString GetReferencerName() const override { return TEXT("FIconStudioRenderer"); } + //~ End FGCObject + + /** + * Rend un mesh et renvoie l'image composee, alpha compris. + * MaterialOverride ne remplace que le premier slot, comme le fait le jeu. + */ + bool Render(UStaticMesh* Mesh, UMaterialInterface* MaterialOverride, const UIconStudioPreset* Preset, EIconStudioPass Pass, FIconStudioImage& OutImage); + + /** + * Recopie une image dans la texture de previsualisation et renvoie celle-ci. + * + * Une UTexture2D transitoire, et non un render target : l'image finale est + * assemblee sur le CPU (masque, reduction, etalement des bords), donc le seul + * moyen de montrer exactement ce qui sera exporte est de reinjecter ces + * pixels-la dans une texture. + */ + UTexture2D* UpdatePreviewTexture(const FIconStudioImage& Image); + + UTexture2D* GetPreviewTexture() const { return PreviewTexture; } + +private: + void EnsureScene(); + void ApplyLighting(const UIconStudioPreset* Preset, const FRotator& CameraRotation); + void ApplyCamera(const UIconStudioPreset* Preset, const FRotator& CameraRotation, const FBoxSphereBounds& Bounds); + void ApplyPostProcess(const UIconStudioPreset* Preset); + + UTextureRenderTarget2D* EnsureTarget(TObjectPtr& Target, int32 Size, bool bFloatingPoint); + + /** Une capture sur la cible donnee. Le mode de capture change ce qui est ecrit dans les pixels. */ + bool CaptureTo(UTextureRenderTarget2D* Target, uint8 CaptureSource); + + TUniquePtr Scene; + + TObjectPtr MeshComponent; + TObjectPtr CaptureComponent; + TObjectPtr KeyLightComponent; + TObjectPtr FillLightComponent; + TObjectPtr RimLightComponent; + TObjectPtr SkyLightComponent; + + /** Couleur en 8 bits sRGB, profondeur en virgule flottante : deux formats, deux cibles. */ + TObjectPtr ColorTarget; + TObjectPtr DepthTarget; + + TObjectPtr PreviewTexture; + + /** Cubemap deja appliquee, pour ne pas recapturer le ciel a chaque rendu. */ + TObjectPtr AppliedSkyCubemap; + float AppliedSkyIntensity = -1.f; + + /** Au-dela de cette distance, un pixel est du vide. Recalcule a chaque cadrage. */ + float DepthThreshold = 0.f; +}; diff --git a/Plugins/IconStudio/Source/IconStudio/Public/IconStudioSession.h b/Plugins/IconStudio/Source/IconStudio/Public/IconStudioSession.h new file mode 100644 index 0000000..20d52e2 --- /dev/null +++ b/Plugins/IconStudio/Source/IconStudio/Public/IconStudioSession.h @@ -0,0 +1,67 @@ +// Icon Studio - Mathew Simon + +#pragma once + +#include "CoreMinimal.h" +#include "UObject/Object.h" +#include "IconStudioTypes.h" +#include "IconStudioSession.generated.h" + +class UIconStudioPreset; + +/** + * Ce sur quoi on travaille en ce moment : le preset choisi, l'objet affiche, + * la liste du prochain lot. + * + * Cet objet n'existe que pour etre pose dans un widget Details View. C'est ce + * qui evite d'avoir a dessiner une interface : le moteur genere lui-meme les + * champs, les listes deroulantes et les selecteurs d'assets a partir des + * UPROPERTY ci-dessous. Ajouter un reglage a l'outil ne demande donc aucune + * retouche du Widget Blueprint. + * + * Il est transitoire a dessein : une session de travail ne se sauvegarde pas, + * ce qui doit survivre est dans le preset. + */ +UCLASS(BlueprintType) +class ICONSTUDIO_API UIconStudioSession : public UObject +{ + GENERATED_BODY() + +public: + /** Le look applique. Sans preset, rien ne se rend. */ + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Subject") + TObjectPtr Preset; + + /** + * L'objet affiche dans la previsualisation : un StaticMesh directement, ou + * un DataAsset dont on ira lire le mesh par reflexion. + */ + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Subject", meta = (AllowedClasses = "/Script/Engine.StaticMesh,/Script/Engine.DataAsset")) + TObjectPtr Subject; + + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Subject") + EIconStudioPass Pass = EIconStudioPass::Final; + + /** Les objets traites par le bouton de lot. */ + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Batch", meta = (AllowedClasses = "/Script/Engine.StaticMesh,/Script/Engine.DataAsset")) + TArray> BatchTargets; + + /** + * Ecrit la texture generee dans le champ d'icone du DataAsset. + * Sans effet sur un StaticMesh, qui n'a pas de champ ou ecrire. + */ + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Batch") + bool bAssignIconToDataAsset = true; + + /** Laisse tranquille les objets qui ont deja une icone. Utile pour completer un lot. */ + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Batch") + bool bSkipIfIconAlreadySet = false; + + /** Prevenu des qu'un champ change, pour relancer la previsualisation. */ + DECLARE_MULTICAST_DELEGATE(FOnIconStudioSessionChanged); + FOnIconStudioSessionChanged OnSessionChanged; + +#if WITH_EDITOR + virtual void PostEditChangeProperty(FPropertyChangedEvent& PropertyChangedEvent) override; +#endif +}; diff --git a/Plugins/IconStudio/Source/IconStudio/Public/IconStudioSettings.h b/Plugins/IconStudio/Source/IconStudio/Public/IconStudioSettings.h new file mode 100644 index 0000000..40aecdc --- /dev/null +++ b/Plugins/IconStudio/Source/IconStudio/Public/IconStudioSettings.h @@ -0,0 +1,61 @@ +// Icon Studio - Mathew Simon + +#pragma once + +#include "CoreMinimal.h" +#include "Engine/DeveloperSettings.h" +#include "IconStudioSettings.generated.h" + +/** + * Le pont entre l'outil et les DataAssets du jeu. + * + * Le plugin ne connait volontairement aucune classe du projet : il ne compile + * pas contre UItemDataAsset et n'inclut aucun de ses en-tetes. Il retrouve le + * mesh et le champ d'icone par REFLEXION, a partir des noms de proprietes + * donnes ici. C'est ce qui lui permet de servir tel quel a un autre projet, ou + * a une autre famille d'assets dans celui-ci -- il suffit de changer deux noms. + * + * Les valeurs par defaut correspondent a UItemDataAsset. + */ +UCLASS(config = Editor, defaultconfig, meta = (DisplayName = "Icon Studio")) +class ICONSTUDIO_API UIconStudioSettings : public UDeveloperSettings +{ + GENERATED_BODY() + +public: + UIconStudioSettings(); + + virtual FName GetContainerName() const override { return TEXT("Project"); } + virtual FName GetCategoryName() const override { return TEXT("Plugins"); } + + /** + * Proprietes ou chercher le mesh a rendre, dans l'ordre. + * La premiere qui existe et pointe vers un StaticMesh gagne. + */ + UPROPERTY(config, EditAnywhere, Category = "Data Asset Binding") + TArray MeshPropertyNames; + + /** Propriete ou chercher un materiau qui remplace celui du mesh. Vide pour ne pas en chercher. */ + UPROPERTY(config, EditAnywhere, Category = "Data Asset Binding") + FName MaterialOverridePropertyName; + + /** Propriete Texture2D a remplir avec l'icone generee. */ + UPROPERTY(config, EditAnywhere, Category = "Data Asset Binding") + FName IconPropertyName; + + /** + * Propriete servant a nommer l'asset produit (un FName ou un FString). + * Vide, ou introuvable, on retombe sur le nom de l'asset source. + */ + UPROPERTY(config, EditAnywhere, Category = "Data Asset Binding") + FName DisplayNamePropertyName; + + /** + * Sauve les packages modifies a la fin d'un lot. + * + * Decoche, les textures generees et les DataAssets modifies restent + * seulement en memoire : un editeur ferme sans Save All perd tout le lot. + */ + UPROPERTY(config, EditAnywhere, Category = "Batch") + bool bSaveModifiedPackages = true; +}; diff --git a/Plugins/IconStudio/Source/IconStudio/Public/IconStudioSubsystem.h b/Plugins/IconStudio/Source/IconStudio/Public/IconStudioSubsystem.h new file mode 100644 index 0000000..decaaf0 --- /dev/null +++ b/Plugins/IconStudio/Source/IconStudio/Public/IconStudioSubsystem.h @@ -0,0 +1,133 @@ +// Icon Studio - Mathew Simon + +#pragma once + +#include "CoreMinimal.h" +#include "EditorSubsystem.h" +#include "IconStudioRenderer.h" +#include "IconStudioTypes.h" +#include "IconStudioSubsystem.generated.h" + +class UIconStudioPreset; +class UIconStudioSession; +class UMaterialInterface; +class UStaticMesh; +class UTexture2D; + +// Delegues C++ et non dynamiques : la fenetre est un widget Slate, qui n'est pas +// un UObject et ne peut donc pas s'abonner a un delegue dynamique. Les fonctions +// de l'outil restent BlueprintCallable pour rester pilotables depuis un script. +DECLARE_MULTICAST_DELEGATE_OneParam(FOnIconStudioPreviewUpdated, UTexture2D* /*PreviewTexture*/); +DECLARE_MULTICAST_DELEGATE_OneParam(FOnIconStudioStatus, const FString& /*Message*/); + +/** + * L'API de l'outil, cote Blueprint comme cote C++. + * + * Un sous-systeme d'editeur plutot qu'un objet possede par le widget : la scene + * de rendu coute cher a construire, et un Editor Utility Widget est detruit et + * recree a chaque fois qu'on ferme son onglet. Poser l'etat ici, c'est retrouver + * son preset et sa liste de lot en rouvrant la fenetre, et ne payer la mise en + * place du monde de preview qu'une fois par session d'editeur. + * + * Le widget ne fait donc que trois choses : afficher la texture renvoyee par + * RefreshPreview, montrer la session dans un Details View, et appeler les deux + * boutons de generation. + */ +UCLASS() +class ICONSTUDIO_API UIconStudioSubsystem : public UEditorSubsystem +{ + GENERATED_BODY() + +public: + //~ USubsystem + virtual void Initialize(FSubsystemCollectionBase& Collection) override; + virtual void Deinitialize() override; + //~ End USubsystem + + /** L'objet a poser dans le Details View de la fenetre. */ + UFUNCTION(BlueprintCallable, BlueprintPure = false, Category = "Icon Studio") + UIconStudioSession* GetSession(); + + /** + * Garantit qu'un preset est selectionne : reprend celui du projet s'il en + * existe un, en cree un sinon. + * + * Sans lui, l'outil s'ouvre sur une fenetre qui ne fait rien tant qu'on n'a + * pas devine qu'il fallait aller creer un Data Asset dans le Content Browser. + * Un outil qui demande une manip prealable pour donner signe de vie est un + * outil qu'on croit casse. + */ + UFUNCTION(BlueprintCallable, Category = "Icon Studio") + UIconStudioPreset* EnsurePreset(); + + /** + * Relance le rendu et renvoie la texture a afficher. + * Renvoie null s'il manque le preset ou le sujet -- pas une erreur, juste + * une fenetre pas encore renseignee. + */ + UFUNCTION(BlueprintCallable, Category = "Icon Studio") + UTexture2D* RefreshPreview(); + + /** Genere l'icone d'un seul objet : PNG, texture, et affectation du champ. */ + UFUNCTION(BlueprintCallable, Category = "Icon Studio") + bool GenerateForSubject(UObject* Subject); + + /** Genere celle du sujet actuellement previsualise. */ + UFUNCTION(BlueprintCallable, Category = "Icon Studio") + bool GenerateCurrent(); + + /** Traite toute la liste de lot. Renvoie le nombre d'icones ecrites. */ + UFUNCTION(BlueprintCallable, Category = "Icon Studio") + int32 GenerateBatch(); + + /** Ajoute la selection du Content Browser au lot, sans doublon. */ + UFUNCTION(BlueprintCallable, Category = "Icon Studio") + int32 AddContentBrowserSelectionToBatch(); + + /** Prend le premier asset selectionne dans le Content Browser comme sujet. */ + UFUNCTION(BlueprintCallable, Category = "Icon Studio") + bool SetSubjectFromContentBrowser(); + + UFUNCTION(BlueprintCallable, Category = "Icon Studio") + void ClearBatch(); + + /** + * Emis a chaque tentative de rendu, reussie ou non -- avec un pointeur nul + * dans le second cas. La fenetre s'en sert aussi pour raccrocher son panneau + * de preset, qui doit suivre meme quand il n'y a rien a afficher. + */ + FOnIconStudioPreviewUpdated OnPreviewUpdated; + + /** Ligne de statut lisible, affichee sous les boutons. */ + FOnIconStudioStatus OnStatus; + +private: + /** Retrouve le mesh a rendre, que le sujet soit un mesh ou un DataAsset. */ + UStaticMesh* ResolveMesh(UObject* Subject, UMaterialInterface*& OutMaterialOverride) const; + + /** Nom de l'asset produit, prefixe compris. */ + FString BuildAssetName(UObject* Subject, const UIconStudioPreset* Preset) const; + + UTexture2D* CreateOrUpdateTexture(const FIconStudioImage& Image, const FString& PackagePath, const FString& AssetName, TArray& OutTouchedPackages); + bool AssignIcon(UObject* Subject, UTexture2D* Texture, TArray& OutTouchedPackages) const; + bool WritePng(const FIconStudioImage& Image, const FString& AssetName) const; + + bool GenerateInternal(UObject* Subject, TArray& OutTouchedPackages); + + /** Ecrit un package sur le disque, sans condition. */ + static bool SavePackageToDisk(UPackage* Package); + + /** Ecrit les packages touches par une generation, si le reglage l'autorise. */ + void SavePackages(const TArray& Packages) const; + + void HandleSessionChanged(); + void HandleObjectPropertyChanged(UObject* Object, struct FPropertyChangedEvent& Event); + void Status(const FString& Message, bool bIsError = false); + + UPROPERTY(Transient) + TObjectPtr Session; + + TUniquePtr Renderer; + + FDelegateHandle PropertyChangedHandle; +}; diff --git a/Plugins/IconStudio/Source/IconStudio/Public/IconStudioTypes.h b/Plugins/IconStudio/Source/IconStudio/Public/IconStudioTypes.h new file mode 100644 index 0000000..6c97f82 --- /dev/null +++ b/Plugins/IconStudio/Source/IconStudio/Public/IconStudioTypes.h @@ -0,0 +1,100 @@ +// Icon Studio - Mathew Simon + +#pragma once + +#include "CoreMinimal.h" +#include "IconStudioTypes.generated.h" + +/** + * Ce que contient l'image produite. + * + * Les passes autres que Final servent au debug et a la retouche : recuperer la + * base color seule permet de recolorer une icone dans un logiciel externe sans + * refaire le rendu. Elles gardent le meme masque de transparence que la passe + * finale -- c'est lui qui decoupe l'objet, pas la passe. + */ +UENUM(BlueprintType) +enum class EIconStudioPass : uint8 +{ + /** Rendu complet, eclairage et post-process compris. C'est la passe des icones. */ + Final UMETA(DisplayName = "Final Color"), + + /** Albedo brut, sans aucune lumiere. */ + BaseColor UMETA(DisplayName = "Base Color"), + + /** Normales monde encodees en RGB. */ + Normal UMETA(DisplayName = "World Normal"), + + /** Profondeur encodee sur RGB. Utilisable comme masque, pas comme image. */ + Depth UMETA(DisplayName = "Device Depth"), +}; + +/** Ce qu'on trouve derriere l'objet. */ +UENUM(BlueprintType) +enum class EIconStudioBackground : uint8 +{ + /** Canal alpha decoupe sur l'objet. C'est ce qu'il faut pour l'inventaire. */ + Transparent UMETA(DisplayName = "Transparent"), + + /** Aplat de couleur opaque, compose apres coup sur le meme masque. */ + SolidColor UMETA(DisplayName = "Solid Color"), +}; + +/** + * Une des trois lumieres du studio. + * + * Les angles sont RELATIFS A LA CAMERA, jamais au monde. Sans ca, changer + * l'angle de vue d'un objet deplacerait ses ombres et deux icones de la meme + * serie n'auraient pas le meme eclairage -- exactement ce qu'on cherche a + * eviter en travaillant avec des presets. + */ +USTRUCT(BlueprintType) +struct FIconStudioLight +{ + GENERATED_BODY() + + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Light") + bool bEnabled = true; + + /** Positif = la lumiere part vers la droite de la camera. */ + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Light", meta = (EditCondition = "bEnabled", ClampMin = "-180", ClampMax = "180", Units = "deg")) + float Yaw = 0.f; + + /** Negatif = la lumiere vient d'en haut. */ + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Light", meta = (EditCondition = "bEnabled", ClampMin = "-90", ClampMax = "90", Units = "deg")) + float Pitch = 0.f; + + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Light", meta = (EditCondition = "bEnabled", ClampMin = "0", UIMax = "20")) + float Intensity = 3.f; + + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Light", meta = (EditCondition = "bEnabled")) + FLinearColor Color = FLinearColor::White; + + /** + * Une ombre portee n'a rien a se poser dessus dans une scene vide, mais elle + * fait toute la lisibilite des creux d'un objet un peu detaille. + */ + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Light", meta = (EditCondition = "bEnabled")) + bool bCastShadows = true; + + FIconStudioLight() = default; + + FIconStudioLight(float InYaw, float InPitch, float InIntensity, bool bInShadows) + : bEnabled(true), Yaw(InYaw), Pitch(InPitch), Intensity(InIntensity), bCastShadows(bInShadows) + { + } +}; + +/** + * Image produite par le studio : BGRA 8 bits, espace sRGB, alpha NON premultiplie. + * + * Non premultiplie parce que c'est ce que UMG attend d'une texture d'interface, + * et ce que tout logiciel d'image comprend a l'ouverture du PNG. + */ +struct FIconStudioImage +{ + int32 Size = 0; + TArray Pixels; + + bool IsValid() const { return Size > 0 && Pixels.Num() == Size * Size; } +}; diff --git a/Source/Survival_projet/Private/CookingStation.cpp b/Source/Survival_projet/Private/CookingStation.cpp new file mode 100644 index 0000000..78998a3 --- /dev/null +++ b/Source/Survival_projet/Private/CookingStation.cpp @@ -0,0 +1,840 @@ +// Fill out your copyright notice in the Description page of Project Settings. + + +#include "CookingStation.h" + +#include "Components/PointLightComponent.h" +#include "Components/SphereComponent.h" +#include "Components/StaticMeshComponent.h" +#include "Engine/World.h" +#include "InventoryComponent.h" +#include "ItemDataAsset.h" +#include "Kismet/GameplayStatics.h" +#include "NiagaraComponent.h" +#include "TimerManager.h" + +#define LOCTEXT_NAMESPACE "CookingStation" + +ACookingStation::ACookingStation() +{ + // Tout passe par des timers : la station n'a rien a faire chaque frame. + PrimaryActorTick.bCanEverTick = false; + + BaseMesh = CreateDefaultSubobject(TEXT("BaseMesh")); + SetRootComponent(BaseMesh); + // Le foyer est un obstacle physique, contrairement a un ramassable : on + // n'entre pas dans un feu de camp. + BaseMesh->SetCollisionEnabled(ECollisionEnabled::QueryAndPhysics); + + InteractionSphere = CreateDefaultSubobject(TEXT("InteractionSphere")); + InteractionSphere->SetupAttachment(BaseMesh); + InteractionSphere->InitSphereRadius(90.f); + InteractionSphere->SetCollisionEnabled(ECollisionEnabled::QueryOnly); + InteractionSphere->SetCollisionResponseToAllChannels(ECR_Ignore); + InteractionSphere->SetCollisionResponseToChannel(ECC_Visibility, ECR_Block); + + FireEffect = CreateDefaultSubobject(TEXT("FireEffect")); + FireEffect->SetupAttachment(BaseMesh); + // Surtout pas d'auto-activation : un feu neuf n'a pas de bois, il ne doit + // pas flamber une frame avant que BeginPlay ne le coupe. + FireEffect->SetAutoActivate(false); + + FireLight = CreateDefaultSubobject(TEXT("FireLight")); + FireLight->SetupAttachment(BaseMesh); + FireLight->SetRelativeLocation(FVector(0.f, 0.f, 40.f)); + + // Movable, sinon rien ne fonctionne : une lumiere Static -- le defaut d'un + // composant lumiere -- est cuite dans le lightmap, et l'allumer ou + // l'eteindre a l'execution n'a strictement aucun effet a l'ecran. + FireLight->SetMobility(EComponentMobility::Movable); + + FireLight->SetIntensity(3000.f); + FireLight->SetAttenuationRadius(600.f); + FireLight->SetLightColor(FLinearColor(1.f, 0.55f, 0.2f)); + + // Une lumiere ponctuelle projette ses ombres sur SIX faces de cubemap, a + // chaque frame et pour chaque objet a portee. Sur un feu de camp qu'on + // posera par dizaines, c'est le poste le plus cher du systeme, et de loin. + // Coche-la sur le feu principal du campement si tu la veux, pas partout. + FireLight->CastShadows = false; + + FireLight->SetVisibility(false); + + SlotMeshes.Reserve(MaxCookingSlots); + for (int32 Index = 0; Index < MaxCookingSlots; ++Index) + { + const FName ComponentName(*FString::Printf(TEXT("CookSlot_%d"), Index)); + + UStaticMeshComponent* SlotMesh = CreateDefaultSubobject(ComponentName); + SlotMesh->SetupAttachment(BaseMesh); + SlotMesh->SetCollisionEnabled(ECollisionEnabled::NoCollision); + // Visible dans l'editeur pour que tu puisses positionner l'emplacement a + // la souris avec un mesh de reperage ; le jeu le cache au demarrage tant + // qu'il n'y a rien dessus. + SlotMesh->SetHiddenInGame(false); + + SlotMeshes.Add(SlotMesh); + } +} + +void ACookingStation::BeginPlay() +{ + Super::BeginPlay(); + + Slots.SetNum(MaxCookingSlots); + + // Les meshes de reperage poses dans le Blueprint n'ont plus rien a faire la : + // RefreshSlotMesh remet chaque emplacement sur son contenu reel, donc rien. + for (int32 Index = 0; Index < MaxCookingSlots; ++Index) + { + RefreshSlotMesh(Index); + } + + // Avant tout usage du carburant : c'est ce recensement qui fixe la capacite. + CacheFuelIndicators(); + + if (StartingFuelItem && StartingFuelItem->bIsFuel) + { + const int32 Count = FMath::Min(StartingFuelCount, GetFuelCapacity()); + for (int32 Index = 0; Index < Count; ++Index) + { + FFuelSlotState& NewFuel = Fuel.AddDefaulted_GetRef(); + NewFuel.Item = StartingFuelItem; + NewFuel.RemainingSeconds = FMath::Max(1.f, StartingFuelItem->FuelDuration); + } + } + + RefreshFuelIndicators(); + + // Le grill est vide au demarrage, donc le feu reste eteint quoi qu'il + // arrive. On passe quand meme par le point de decision unique plutot que + // d'ecrire un cas particulier de plus. + ApplyFireVisuals(false); + UpdateFireState(); +} + +void ACookingStation::EndPlay(const EEndPlayReason::Type EndPlayReason) +{ + // Les timers portent un delegue vers this. Les laisser tourner apres la + // destruction de l'acteur est le genre de detail qui ne se voit qu'au + // changement de niveau, sous la forme d'un crash sans pile lisible. + if (UWorld* World = GetWorld()) + { + FTimerManager& TimerManager = World->GetTimerManager(); + TimerManager.ClearTimer(FuelTimer); + + for (FCookingSlotState& Slot : Slots) + { + TimerManager.ClearTimer(Slot.Timer); + } + } + + Super::EndPlay(EndPlayReason); +} + +// ---------------------------------------------------------------------- +// Carburant et allumage +// ---------------------------------------------------------------------- + +float ACookingStation::GetFuelRemaining() const +{ + float Total = 0.f; + + for (int32 Index = 0; Index < Fuel.Num(); ++Index) + { + // Feu allume, c'est le timer qui fait autorite pour la buche en cours : + // son RemainingSeconds n'est rafraichi qu'a l'extinction. + if (Index == 0 && bIsLit) + { + Total += FMath::Max(0.f, GetWorldTimerManager().GetTimerRemaining(FuelTimer)); + } + else + { + Total += Fuel[Index].RemainingSeconds; + } + } + + return Total; +} + +void ACookingStation::SyncFuelFromTimer() +{ + if (bIsLit && Fuel.Num() > 0) + { + Fuel[0].RemainingSeconds = FMath::Max(0.f, GetWorldTimerManager().GetTimerRemaining(FuelTimer)); + } +} + +void ACookingStation::StartFuelTimer() +{ + GetWorldTimerManager().ClearTimer(FuelTimer); + + if (!bIsLit || Fuel.Num() == 0) + { + return; + } + + const float Duration = FMath::Max(0.05f, Fuel[0].RemainingSeconds); + GetWorldTimerManager().SetTimer(FuelTimer, this, &ACookingStation::HandleFuelConsumed, Duration, false); +} + +bool ACookingStation::Light() +{ + if (bIsLit) + { + return true; + } + + if (Fuel.Num() == 0) + { + return false; + } + + bIsLit = true; + StartFuelTimer(); + + // Reprise, pas redemarrage : chaque cuisson repart exactement la ou elle + // s'etait figee quand le feu s'est eteint. + for (const FCookingSlotState& Slot : Slots) + { + GetWorldTimerManager().UnPauseTimer(Slot.Timer); + } + + ApplyFireVisuals(true); + UGameplayStatics::PlaySoundAtLocation(this, LightSound, GetActorLocation()); + + OnStationChanged.Broadcast(); + return true; +} + +void ACookingStation::Extinguish() +{ + if (!bIsLit) + { + return; + } + + SyncFuelFromTimer(); + GetWorldTimerManager().ClearTimer(FuelTimer); + bIsLit = false; + + for (const FCookingSlotState& Slot : Slots) + { + GetWorldTimerManager().PauseTimer(Slot.Timer); + } + + ApplyFireVisuals(false); + UGameplayStatics::PlaySoundAtLocation(this, ExtinguishSound, GetActorLocation()); + + OnStationChanged.Broadcast(); +} + +bool ACookingStation::HasPendingWork() const +{ + for (const FCookingSlotState& Slot : Slots) + { + float Unused = 0.f; + if (!Slot.IsEmpty() && GetNextStage(Slot.Item, Unused)) + { + return true; + } + } + + return false; +} + +void ACookingStation::UpdateFireState() +{ + // Un objet DEJA cuit qui peut encore bruler compte comme du travail : sans + // ca le feu s'arreterait pile a la fin de la cuisson et la sur-cuisson + // n'arriverait jamais. Oublier sa viande doit rester punitif. + if (Fuel.Num() > 0 && HasPendingWork()) + { + Light(); + } + else + { + Extinguish(); + } +} + +void ACookingStation::HandleFuelConsumed() +{ + if (Fuel.Num() > 0) + { + // RemoveAt et non un index de lecture qui avance : le foyer doit + // toujours se lire "les N premieres buches sont pleines", c'est ce qui + // rend l'affichage trivial et sans etat supplementaire. + Fuel.RemoveAt(0); + } + + RefreshFuelIndicators(); + + if (Fuel.Num() == 0) + { + Extinguish(); + return; + } + + StartFuelTimer(); + OnStationChanged.Broadcast(); +} + +int32 ACookingStation::FindFuelSource(const UInventoryComponent* Inventory, UItemDataAsset*& OutItem) +{ + OutItem = nullptr; + + if (!Inventory) + { + return INDEX_NONE; + } + + // La main d'abord : c'est le seul moyen pour le joueur de designer ce qu'il + // accepte de bruler. Sans cette priorite, remplir le feu piocherait la + // premiere chose venue et ses planches partiraient avant ses branches. + const FInventorySlot Selected = Inventory->GetSelectedSlot(); + if (Selected.Item && Selected.Item->bIsFuel) + { + OutItem = Selected.Item; + return Inventory->GetSelectedHotbarIndex(); + } + + const TArray& InventorySlots = Inventory->GetSlots(); + for (int32 Index = 0; Index < InventorySlots.Num(); ++Index) + { + if (!InventorySlots[Index].IsEmpty() && InventorySlots[Index].Item->bIsFuel) + { + OutItem = InventorySlots[Index].Item; + return Index; + } + } + + return INDEX_NONE; +} + +bool ACookingStation::AddFuelFrom(int32 InventorySlotIndex, AActor* Interactor) +{ + UInventoryComponent* Inventory = GetInventoryOf(Interactor); + if (!Inventory || Fuel.Num() >= GetFuelCapacity()) + { + return false; + } + + // Un seul exemplaire, jamais la pile : c'est le joueur qui decide combien + // de bois il engage, buche par buche. + FInventorySlot Taken; + if (!Inventory->TakeFromSlot(InventorySlotIndex, 1, Taken) || Taken.IsEmpty()) + { + return false; + } + + FFuelSlotState& NewFuel = Fuel.AddDefaulted_GetRef(); + NewFuel.Item = Taken.Item; + NewFuel.RemainingSeconds = FMath::Max(1.f, Taken.Item->FuelDuration); + + RefreshFuelIndicators(); + + // Du bois arrive alors qu'une cuisson attendait : c'est ce qui relance le + // feu. Si rien n'attend, la buche patiente sans se consumer. + UpdateFireState(); + + UGameplayStatics::PlaySoundAtLocation(this, PlaceItemSound, GetActorLocation()); + + OnStationChanged.Broadcast(); + return true; +} + +void ACookingStation::ApplyFireVisuals(bool bActive) +{ + if (bActive) + { + FireEffect->Activate(/*bReset=*/true); + } + else + { + FireEffect->Deactivate(); + } + + FireLight->SetVisibility(bActive); +} + +void ACookingStation::CacheFuelIndicators() +{ + TArray Found; + GetComponents(Found); + + FuelIndicators.Reset(); + for (UStaticMeshComponent* Component : Found) + { + if (Component->ComponentHasTag(FuelIndicatorTag)) + { + FuelIndicators.Add(Component); + } + } + + // GetComponents ne promet aucun ordre. Sans tri, la buche qui disparait en + // premier changerait d'une compilation du Blueprint a l'autre -- un bug + // qu'on ne reproduit jamais deux fois pareil. + // + // TArray::Sort DEREFERENCE les elements des qu'il s'agit de pointeurs, + // TObjectPtr compris : le predicat recoit les composants, pas les pointeurs. + // + // Tri alphabetique, donc Log_10 passerait AVANT Log_2 : au-dela de neuf + // buches, nomme-les Log_01, Log_02... + FuelIndicators.Sort([](const UStaticMeshComponent& A, const UStaticMeshComponent& B) + { + return A.GetName().Compare(B.GetName()) < 0; + }); +} + +void ACookingStation::RefreshFuelIndicators() +{ + for (int32 Index = 0; Index < FuelIndicators.Num(); ++Index) + { + const bool bOccupied = Fuel.IsValidIndex(Index); + FuelIndicators[Index]->SetVisibility(bOccupied); + + if (bOccupied && bFuelIndicatorsUseItemMesh && Fuel[Index].Item) + { + Fuel[Index].Item->ApplyWorldVisualsTo(FuelIndicators[Index]); + } + } +} + +// ---------------------------------------------------------------------- +// Cuisson +// ---------------------------------------------------------------------- + +UItemDataAsset* ACookingStation::GetNextStage(const UItemDataAsset* Item, float& OutDuration) +{ + OutDuration = 0.f; + + if (!Item) + { + return nullptr; + } + + // Le test "!= Item" n'est pas de la paranoia : un resultat qui pointe sur + // l'objet lui-meme fait tourner le timer indefiniment sans que rien ne + // change a l'ecran. La viande "cuit" en boucle, reste crue, et le feu ne + // s'arrete jamais puisqu'il croit avoir du travail. Vu en jeu, ca ressemble + // a un timer casse, et on cherche du cote du code pendant une heure. + // + // La cuisson d'abord : un objet cru qui porterait aussi bCanBurn doit + // devenir cuit avant de se gacher, jamais l'inverse. + if (Item->bCanBeCooked && Item->CookedResult && Item->CookedResult != Item) + { + OutDuration = Item->CookDuration; + return Item->CookedResult; + } + + if (Item->bCanBurn && Item->BurntResult && Item->BurntResult != Item) + { + OutDuration = Item->BurnDuration; + return Item->BurntResult; + } + + return nullptr; +} + +void ACookingStation::StartSlotTimer(int32 SlotIndex) +{ + FCookingSlotState& Slot = Slots[SlotIndex]; + + GetWorldTimerManager().ClearTimer(Slot.Timer); + + if (Slot.IsEmpty()) + { + return; + } + + float Duration = 0.f; + if (!GetNextStage(Slot.Item, Duration)) + { + // Un objet qui se DIT transformable sans avoir d'etape suivante + // exploitable n'est pas une fin de chaine, c'est une donnee cassee. + // Sans ce message il resterait inerte sur le grill, et rien a l'ecran + // ne dirait que le probleme est dans l'asset et pas dans le feu. + if (Slot.Item->bCanBeCooked || Slot.Item->bCanBurn) + { + UE_LOG(LogTemp, Warning, TEXT("ACookingStation : %s se declare transformable mais n'a aucune etape suivante valide (resultat vide, ou pointant sur lui-meme). Il restera inerte sur le feu."), + *GetNameSafe(Slot.Item)); + } + + // Maillon final -- un steak brule -- : il reste sur le grill sans plus + // rien faire, et sans consommer un timer pour ne rien faire. + return; + } + + Duration = FMath::Max(0.05f, Duration / CookSpeedMultiplier); + + const FTimerDelegate Finished = FTimerDelegate::CreateUObject(this, &ACookingStation::HandleSlotFinished, SlotIndex); + GetWorldTimerManager().SetTimer(Slot.Timer, Finished, Duration, false); + + // Poser quelque chose sur un feu eteint est autorise : le compte a rebours + // existe, il attend simplement qu'on allume. + if (!bIsLit) + { + GetWorldTimerManager().PauseTimer(Slot.Timer); + } +} + +void ACookingStation::HandleSlotFinished(int32 SlotIndex) +{ + if (!Slots.IsValidIndex(SlotIndex)) + { + return; + } + + FCookingSlotState& Slot = Slots[SlotIndex]; + + float Unused = 0.f; + UItemDataAsset* NextItem = GetNextStage(Slot.Item, Unused); + if (!NextItem) + { + return; + } + + Slot.Item = NextItem; + RefreshSlotMesh(SlotIndex); + + // Enchainement automatique : le steak cuit qui porte bCanBurn se remet a + // compter tout seul vers le brule. C'est ce qui fait que le joueur doit + // revenir chercher sa viande au lieu de l'oublier sur le feu. + StartSlotTimer(SlotIndex); + + // Apres StartSlotTimer : si ce maillon etait le dernier, il n'y a plus rien + // a transformer et le feu s'arrete de lui-meme. + UpdateFireState(); + + OnStationChanged.Broadcast(); +} + +float ACookingStation::GetSlotTimeRemaining(int32 SlotIndex) const +{ + if (!Slots.IsValidIndex(SlotIndex)) + { + return 0.f; + } + + // GetTimerRemaining renvoie -1 quand le handle ne designe aucun timer actif. + return FMath::Max(0.f, GetWorldTimerManager().GetTimerRemaining(Slots[SlotIndex].Timer)); +} + +bool ACookingStation::CanTakeFromSlot(int32 SlotIndex) const +{ + if (!Slots.IsValidIndex(SlotIndex) || Slots[SlotIndex].IsEmpty()) + { + return false; + } + + if (bAllowTakingRawItems) + { + return true; + } + + const UItemDataAsset* Item = Slots[SlotIndex].Item; + + // Critere porte par l'objet lui-meme, sans etat a maintenir : tant qu'il + // sait encore CUIRE, il est cru, donc engage. Des qu'il ne sait plus que + // bruler, c'est qu'il a fini sa cuisson et qu'on peut le sauver. + // + // Consequence voulue : reposer une viande cuite sur le feu ne la reverrouille + // pas, alors qu'un booleen "a deja transforme" l'aurait fait. + if (!Item->bCanBeCooked) + { + return true; + } + + // Second filet : un objet dont la chaine est cassee ne cuira jamais. Le + // laisser verrouille le sequestrerait pour toujours sur le grill, avec pour + // seul recours de recharger la partie. + float Unused = 0.f; + return GetNextStage(Item, Unused) == nullptr; +} + +void ACookingStation::RefreshSlotMesh(int32 SlotIndex) +{ + UStaticMeshComponent* SlotMesh = SlotMeshes[SlotIndex]; + const FCookingSlotState& Slot = Slots[SlotIndex]; + + if (Slot.IsEmpty() || !Slot.Item->WorldMesh) + { + SlotMesh->SetStaticMesh(nullptr); + SlotMesh->SetVisibility(false); + return; + } + + // Mesh ET materiau : c'est souvent le materiau seul qui distingue le cru du + // cuit quand les deux etapes partagent la meme geometrie. + Slot.Item->ApplyWorldVisualsTo(SlotMesh); + SlotMesh->SetRelativeScale3D(FVector(CookingMeshScale)); + SlotMesh->SetVisibility(true); +} + +// ---------------------------------------------------------------------- +// Visee et decision +// ---------------------------------------------------------------------- + +int32 ACookingStation::ResolveAimedSlot(const AActor* Interactor) const +{ + if (!Interactor) + { + return INDEX_NONE; + } + + FVector ViewLocation; + FRotator ViewRotation; + // GetActorEyesViewPoint : sur un pawn possede, il renvoie le point de vue du + // controller, donc exactement ce que le joueur voit. On evite ainsi de + // dependre d'AFpsPlayer -- n'importe quel acteur pourra cuisiner. + Interactor->GetActorEyesViewPoint(ViewLocation, ViewRotation); + + const FVector ViewDirection = ViewRotation.Vector(); + const float MinDot = FMath::Cos(FMath::DegreesToRadians(SlotAimHalfAngle)); + + int32 BestIndex = INDEX_NONE; + float BestDot = MinDot; + + const int32 UsedSlots = FMath::Min(CookingSlotCount, MaxCookingSlots); + for (int32 Index = 0; Index < UsedSlots; ++Index) + { + const FVector ToSlot = SlotMeshes[Index]->GetComponentLocation() - ViewLocation; + if (ToSlot.IsNearlyZero()) + { + continue; + } + + // Produit scalaire et non distance a l'ecran : c'est l'ecart ANGULAIRE + // au centre du viseur qui compte, et il ne demande ni projection ni + // acces au viewport. Sous le cone, aucun emplacement n'est vise et le + // joueur s'adresse au foyer lui-meme. + const float Dot = FVector::DotProduct(ToSlot.GetSafeNormal(), ViewDirection); + if (Dot > BestDot) + { + BestDot = Dot; + BestIndex = Index; + } + } + + return BestIndex; +} + +UInventoryComponent* ACookingStation::GetInventoryOf(AActor* Interactor) +{ + return Interactor ? Interactor->FindComponentByClass() : nullptr; +} + +FCookingInteraction ACookingStation::ResolveAction(AActor* Interactor) const +{ + FCookingInteraction Result; + Result.SlotIndex = ResolveAimedSlot(Interactor); + + // Slots n'est dimensionne qu'au BeginPlay : un trace d'interaction qui + // arriverait avant lirait hors du tableau. + if (!Slots.IsValidIndex(Result.SlotIndex)) + { + Result.SlotIndex = INDEX_NONE; + } + + const UInventoryComponent* Inventory = GetInventoryOf(Interactor); + if (Inventory) + { + Result.HeldItem = Inventory->GetSelectedSlot().Item; + Result.FuelSourceSlot = FindFuelSource(Inventory, Result.FuelItem); + } + + // 1. Un emplacement vise et occupe par quelque chose qu'on a le droit de + // reprendre. Recuperer passe avant tout le reste, sinon on ne pourrait + // jamais sortir sa viande en ayant du bois en main. + if (CanTakeFromSlot(Result.SlotIndex)) + { + Result.Action = ECookingAction::TakeItem; + return Result; + } + + // 2. Un emplacement vise et libre, quelque chose de cuisinable en main. + if (Result.SlotIndex != INDEX_NONE && Slots[Result.SlotIndex].IsEmpty() + && Result.HeldItem && Result.HeldItem->CanBePlacedOnFire()) + { + Result.Action = ECookingAction::PlaceItem; + return Result; + } + + // 3. Du bois quelque part dans l'inventaire et de la place dans le foyer. + // Pas besoin de l'avoir en main : la main sert a CHOISIR le combustible, + // pas a autoriser le geste. + if (Result.FuelSourceSlot != INDEX_NONE && Fuel.Num() < GetFuelCapacity()) + { + Result.Action = ECookingAction::AddFuel; + return Result; + } + + // Pas de quatrieme cas : allumer n'est plus un geste du joueur. + return Result; +} + +// ---------------------------------------------------------------------- +// Actions +// ---------------------------------------------------------------------- + +bool ACookingStation::PlaceItemFromHand(int32 SlotIndex, AActor* Interactor) +{ + UInventoryComponent* Inventory = GetInventoryOf(Interactor); + if (!Inventory) + { + return false; + } + + // Un seul exemplaire, meme si la pile en contient vingt : un emplacement de + // grill porte une piece, comme dans Raft. + FInventorySlot Taken; + if (!Inventory->TakeFromSlot(Inventory->GetSelectedHotbarIndex(), 1, Taken) || Taken.IsEmpty()) + { + return false; + } + + FCookingSlotState& Slot = Slots[SlotIndex]; + Slot.Item = Taken.Item; + Slot.RemainingUses = Taken.RemainingUses; + + RefreshSlotMesh(SlotIndex); + StartSlotTimer(SlotIndex); + + // Poser quelque chose EST ce qui declenche le feu, s'il a du bois. + UpdateFireState(); + + UGameplayStatics::PlaySoundAtLocation(this, PlaceItemSound, SlotMeshes[SlotIndex]->GetComponentLocation()); + + OnStationChanged.Broadcast(); + return true; +} + +bool ACookingStation::TakeItemToInventory(int32 SlotIndex, AActor* Interactor) +{ + UInventoryComponent* Inventory = GetInventoryOf(Interactor); + if (!Inventory) + { + return false; + } + + FCookingSlotState& Slot = Slots[SlotIndex]; + + // On tente l'ajout AVANT de vider l'emplacement. Inventaire plein : la + // nourriture reste sur le feu -- et continue donc de cuire, ce qui est la + // bonne sanction plutot que de la faire disparaitre. + const int32 Leftover = Inventory->AddItem(Slot.Item, 1, Slot.RemainingUses); + if (Leftover > 0) + { + return false; + } + + GetWorldTimerManager().ClearTimer(Slot.Timer); + Slot.Item = nullptr; + Slot.RemainingUses = -1; + + RefreshSlotMesh(SlotIndex); + + // Le grill vide, plus rien ne justifie de bruler du bois. + UpdateFireState(); + + OnStationChanged.Broadcast(); + return true; +} + +// ---------------------------------------------------------------------- +// IInteractable +// ---------------------------------------------------------------------- + +bool ACookingStation::CanInteract_Implementation(AActor* Interactor) const +{ + // Toujours vrai : meme sans rien a faire, le poste doit rester visable pour + // que le prompt puisse annoncer son etat. C'est la seule interface qu'a le + // joueur pour savoir ou en est sa cuisson et combien de bois il lui reste. + // Le fait qu'une action soit possible ou non se dit par + // IsInteractionAvailable, qui n'efface pas le texte. + return true; +} + +FText ACookingStation::GetInteractionPrompt_Implementation(AActor* Interactor) const +{ + const FCookingInteraction Interaction = ResolveAction(Interactor); + + switch (Interaction.Action) + { + case ECookingAction::TakeItem: + { + const FText ItemName = Slots[Interaction.SlotIndex].Item->DisplayName; + const float Remaining = GetSlotTimeRemaining(Interaction.SlotIndex); + + // Exactement la formulation d'un objet au sol : une fois cuit, ce n'est + // plus une manipulation de four, c'est un ramassage. + if (!bShowRemainingTimeInPrompt || Remaining <= 0.f || !bIsLit) + { + return FText::Format(LOCTEXT("TakeDone", "Pick up {0}"), ItemName); + } + + return FText::Format(LOCTEXT("TakeDoneTimed", "Pick up {0} ({1}s)"), + ItemName, FText::AsNumber(FMath::CeilToInt(Remaining))); + } + + case ECookingAction::PlaceItem: + return FText::Format(LOCTEXT("PlaceOnFire", "Cook {0}"), Interaction.HeldItem->DisplayName); + + case ECookingAction::AddFuel: + return FText::Format(LOCTEXT("AddFuel", "Add {0} to the fire"), Interaction.FuelItem->DisplayName); + + default: + break; + } + + // Aucune action possible : aucun texte. Tout ce qu'un commentaire d'etat + // dirait -- ca cuit, il manque du bois, le foyer est plein -- se lit deja + // sur les flammes, sur le nombre de buches et sur le mesh de la nourriture. + // L'ecrire en plus, c'est reconstruire une interface par-dessus un monde + // qui se suffit a lui-meme. + return FText::GetEmpty(); +} + +void ACookingStation::Interact_Implementation(AActor* Interactor) +{ + // Meme fonction que le prompt : ce que le joueur vient de lire est + // exactement ce qui va se produire. + const FCookingInteraction Interaction = ResolveAction(Interactor); + + switch (Interaction.Action) + { + case ECookingAction::TakeItem: + TakeItemToInventory(Interaction.SlotIndex, Interactor); + break; + + case ECookingAction::PlaceItem: + PlaceItemFromHand(Interaction.SlotIndex, Interactor); + break; + + case ECookingAction::AddFuel: + AddFuelFrom(Interaction.FuelSourceSlot, Interactor); + break; + + default: + break; + } +} + +void ACookingStation::OnBeginFocus_Implementation() +{ + if (bHighlightOnFocus) + { + BaseMesh->SetRenderCustomDepth(true); + } +} + +void ACookingStation::OnEndFocus_Implementation() +{ + if (bHighlightOnFocus) + { + BaseMesh->SetRenderCustomDepth(false); + } +} + +#undef LOCTEXT_NAMESPACE diff --git a/Source/Survival_projet/Private/CraftingComponent.cpp b/Source/Survival_projet/Private/CraftingComponent.cpp index 118074e..7aa7ee9 100644 --- a/Source/Survival_projet/Private/CraftingComponent.cpp +++ b/Source/Survival_projet/Private/CraftingComponent.cpp @@ -19,8 +19,8 @@ void UCraftingComponent::InitializeComponent() { Super::InitializeComponent(); - // Les mains sont toujours disponibles. Les postes s'ajoutent par-dessus. - AvailableStations.Add(ECraftingStation::Hands); + // Les mains sont toujours disponibles, et rien ne peut les retirer. + StationRefCounts.Add(ECraftingStation::Hands, 1); if (const AActor* Owner = GetOwner()) { @@ -40,6 +40,12 @@ void UCraftingComponent::InitializeComponent() } } +bool UCraftingComponent::HasStation(ECraftingStation Station) const +{ + const int32* Count = StationRefCounts.Find(Station); + return Count && *Count > 0; +} + void UCraftingComponent::AddAvailableStation(ECraftingStation Station) { if (Station == ECraftingStation::Count) @@ -47,12 +53,13 @@ void UCraftingComponent::AddAvailableStation(ECraftingStation Station) return; } - bool bAlreadyThere = false; - AvailableStations.Add(Station, &bAlreadyThere); + int32& Count = StationRefCounts.FindOrAdd(Station); + ++Count; - // On ne diffuse que sur un vrai changement : deux volumes d'etabli qui se - // chevauchent rafraichiraient l'interface deux fois pour rien. - if (!bAlreadyThere) + // On ne diffuse que sur la transition 0 -> 1. Entrer dans le rayon d'un + // deuxieme etabli ne change rien de visible, inutile de reconstruire la + // grille de recettes pour ca. + if (Count == 1) { OnAvailableStationsChanged.Broadcast(); } @@ -67,8 +74,17 @@ void UCraftingComponent::RemoveAvailableStation(ECraftingStation Station) return; } - if (AvailableStations.Remove(Station) > 0) + int32* Count = StationRefCounts.Find(Station); + if (!Count || *Count <= 0) { + return; + } + + --(*Count); + + if (*Count <= 0) + { + StationRefCounts.Remove(Station); OnAvailableStationsChanged.Broadcast(); } } @@ -94,7 +110,7 @@ void UCraftingComponent::GatherRecipes(TArray& OutRec continue; } - if (!AvailableStations.Contains(Recipe->RequiredStation)) + if (!HasStation(Recipe->RequiredStation)) { continue; } @@ -130,7 +146,7 @@ bool UCraftingComponent::CanCraft(const UCraftingRecipeDataAsset* Recipe, ECraft return false; } - if (!AvailableStations.Contains(Recipe->RequiredStation)) + if (!HasStation(Recipe->RequiredStation)) { OutReason = ECraftFailureReason::StationUnavailable; return false; diff --git a/Source/Survival_projet/Private/CraftingStation.cpp b/Source/Survival_projet/Private/CraftingStation.cpp new file mode 100644 index 0000000..c70e429 --- /dev/null +++ b/Source/Survival_projet/Private/CraftingStation.cpp @@ -0,0 +1,49 @@ +// Fill out your copyright notice in the Description page of Project Settings. + + +#include "CraftingStation.h" + +#include "Components/StaticMeshComponent.h" +#include "Engine/CollisionProfile.h" +#include "FpsPlayerController.h" +#include "GameFramework/Pawn.h" + +#define LOCTEXT_NAMESPACE "CraftingStation" + +ACraftingStation::ACraftingStation() +{ + PrimaryActorTick.bCanEverTick = false; + + Mesh = CreateDefaultSubobject(TEXT("Mesh")); + SetRootComponent(Mesh); + + // Explicite plutot que de compter sur le profil par defaut : ce composant a + // deux roles indissociables, empecher le joueur de traverser le meuble et + // bloquer le canal Visibility pour que le trace d'interaction le trouve. + // Un profil qui laisserait passer Visibility rendrait le poste inutilisable + // sans qu'aucune erreur ne le signale. + Mesh->SetCollisionProfileName(UCollisionProfile::BlockAll_ProfileName); + + InteractionPrompt = LOCTEXT("UseStation", "Utiliser l'établi"); +} + +FText ACraftingStation::GetInteractionPrompt_Implementation(AActor* Interactor) const +{ + return InteractionPrompt; +} + +void ACraftingStation::Interact_Implementation(AActor* Interactor) +{ + // L'ecran vit sur le controller, pas sur le pawn : c'est lui qu'on cherche. + const APawn* InteractingPawn = Cast(Interactor); + AFpsPlayerController* PlayerController = InteractingPawn ? Cast(InteractingPawn->GetController()) : nullptr; + + if (!PlayerController) + { + return; + } + + PlayerController->OpenCraftingAtStation(StationType); +} + +#undef LOCTEXT_NAMESPACE diff --git a/Source/Survival_projet/Private/FpsPlayerController.cpp b/Source/Survival_projet/Private/FpsPlayerController.cpp index 25f5099..84431d8 100644 --- a/Source/Survival_projet/Private/FpsPlayerController.cpp +++ b/Source/Survival_projet/Private/FpsPlayerController.cpp @@ -14,6 +14,7 @@ #include "InputCoreTypes.h" #include "InventoryComponent.h" #include "InteractionPromptWidget.h" +#include "CraftingComponent.h" #include "InventoryScreenWidget.h" #include "Kismet/GameplayStatics.h" #include "PauseMenuWidget.h" @@ -420,6 +421,47 @@ void AFpsPlayerController::ToggleCrafting() SetInventoryScreenOpen(true, /*bShowCraftingTab=*/true); } +void AFpsPlayerController::OpenCraftingAtStation(ECraftingStation Station) +{ + if (Station == ECraftingStation::Count) + { + return; + } + + // Deja ouvert sur un autre poste : on rend le precedent avant d'accorder le + // nouveau, sinon le compteur du composant ne redescendrait jamais. + ReleaseActiveStation(); + + if (UCraftingComponent* Crafting = GetPawnCrafting()) + { + Crafting->AddAvailableStation(Station); + ActiveStation = Station; + } + + SetInventoryScreenOpen(true, /*bShowCraftingTab=*/true); +} + +void AFpsPlayerController::ReleaseActiveStation() +{ + if (ActiveStation == ECraftingStation::Count) + { + return; + } + + if (UCraftingComponent* Crafting = GetPawnCrafting()) + { + Crafting->RemoveAvailableStation(ActiveStation); + } + + ActiveStation = ECraftingStation::Count; +} + +UCraftingComponent* AFpsPlayerController::GetPawnCrafting() const +{ + const AFpsPlayer* PlayerPawn = Cast(GetPawn()); + return PlayerPawn ? PlayerPawn->GetCraftingComponent() : nullptr; +} + void AFpsPlayerController::SetInventoryScreenOpen(bool bOpen, bool bShowCraftingTab) { if (!InventoryScreen) @@ -450,6 +492,15 @@ void AFpsPlayerController::SetInventoryScreenOpen(bool bOpen, bool bShowCrafting bInventoryOpen = bOpen; + // Une fermeture, quelle qu'en soit la cause -- Tab, Echap, la mort -- + // rend le poste. Le faire ici et nulle part ailleurs garantit qu'aucun + // chemin de sortie ne laisse l'etabli accessible depuis l'autre bout de + // la carte. + if (!bInventoryOpen) + { + ReleaseActiveStation(); + } + if (bInventoryOpen) { if (bShowCraftingTab) diff --git a/Source/Survival_projet/Private/InteractionComponent.cpp b/Source/Survival_projet/Private/InteractionComponent.cpp index 9640436..17c1a53 100644 --- a/Source/Survival_projet/Private/InteractionComponent.cpp +++ b/Source/Survival_projet/Private/InteractionComponent.cpp @@ -57,6 +57,7 @@ void UInteractionComponent::UpdateFocus() if (!GetViewPoint(ViewLocation, ViewRotation)) { SetFocusedActor(nullptr); + RefreshPrompt(); return; } @@ -84,6 +85,10 @@ void UInteractionComponent::UpdateFocus() SetFocusedActor(Candidate); + // Apres SetFocusedActor, jamais avant : l'ordre garantit que l'UI recoit + // d'abord "la cible a change", puis le texte correspondant. + RefreshPrompt(); + #if ENABLE_DRAW_DEBUG if (bDrawDebug) { @@ -161,13 +166,26 @@ void UInteractionComponent::TryInteract() UpdateFocus(); } -FText UInteractionComponent::GetFocusedPrompt() const +void UInteractionComponent::RefreshPrompt() { AActor* Target = FocusedActor.Get(); - if (!IsValid(Target)) + + // Un seul FText::Format par trace, soit 20 fois par seconde et seulement + // quand on vise quelque chose. Recalculer ici plutot que dans le getter + // evite qu'un widget qui interroge le prompt plusieurs fois par frame + // paie le format autant de fois. + const FText NewPrompt = IsValid(Target) + ? IInteractable::Execute_GetInteractionPrompt(Target, GetOwner()) + : FText::GetEmpty(); + + // EqualTo et non IdenticalTo : on compare ce qui s'affiche, pas l'instance. + // Deux FText::Format successifs produisent toujours deux instances + // differentes, IdenticalTo redeclencherait donc l'UI a chaque trace. + if (CachedPrompt.EqualTo(NewPrompt)) { - return FText::GetEmpty(); + return; } - return IInteractable::Execute_GetInteractionPrompt(Target); + CachedPrompt = NewPrompt; + OnPromptChanged.Broadcast(CachedPrompt); } diff --git a/Source/Survival_projet/Private/InteractionPromptWidget.cpp b/Source/Survival_projet/Private/InteractionPromptWidget.cpp index 88d34ff..77ae91f 100644 --- a/Source/Survival_projet/Private/InteractionPromptWidget.cpp +++ b/Source/Survival_projet/Private/InteractionPromptWidget.cpp @@ -40,16 +40,16 @@ void UInteractionPromptWidget::BindToOwningPawn() if (BoundComponent.IsValid()) { - BoundComponent->OnFocusChanged.RemoveDynamic(this, &UInteractionPromptWidget::HandleFocusChanged); + BoundComponent->OnPromptChanged.RemoveDynamic(this, &UInteractionPromptWidget::HandlePromptChanged); } BoundComponent = NewComponent; if (BoundComponent.IsValid()) { - // Abonnement au delegue : le widget ne se reveille que quand la cible + // Abonnement au delegue : le widget ne se reveille que quand le texte // change vraiment. Pas de Tick, pas de polling. - BoundComponent->OnFocusChanged.AddDynamic(this, &UInteractionPromptWidget::HandleFocusChanged); + BoundComponent->OnPromptChanged.AddDynamic(this, &UInteractionPromptWidget::HandlePromptChanged); } else { @@ -65,14 +65,14 @@ void UInteractionPromptWidget::NativeDestruct() // vers un widget detruit -- typiquement au changement de niveau. if (BoundComponent.IsValid()) { - BoundComponent->OnFocusChanged.RemoveDynamic(this, &UInteractionPromptWidget::HandleFocusChanged); + BoundComponent->OnPromptChanged.RemoveDynamic(this, &UInteractionPromptWidget::HandlePromptChanged); } BoundComponent.Reset(); Super::NativeDestruct(); } -void UInteractionPromptWidget::HandleFocusChanged(AActor* NewFocus, AActor* OldFocus) +void UInteractionPromptWidget::HandlePromptChanged(const FText& NewPrompt) { Refresh(); } @@ -91,6 +91,9 @@ void UInteractionPromptWidget::Refresh() if (PromptText) { + // Un prompt non vide est toujours une action realisable : les cibles ne + // renvoient jamais de texte purement informatif, donc la touche a + // toujours sa place devant. PromptText->SetText(FText::Format(PromptFormat, GetInteractKeyDisplayName(), Prompt)); } diff --git a/Source/Survival_projet/Private/ItemDataAsset.cpp b/Source/Survival_projet/Private/ItemDataAsset.cpp new file mode 100644 index 0000000..54a03f4 --- /dev/null +++ b/Source/Survival_projet/Private/ItemDataAsset.cpp @@ -0,0 +1,76 @@ +// Fill out your copyright notice in the Description page of Project Settings. + + +#include "ItemDataAsset.h" + +#include "Components/StaticMeshComponent.h" + +#if WITH_EDITOR +#include "Misc/DataValidation.h" +#endif + +#define LOCTEXT_NAMESPACE "ItemData" + +void UItemDataAsset::ApplyWorldVisualsTo(UStaticMeshComponent* Component) const +{ + if (!Component) + { + return; + } + + Component->SetStaticMesh(WorldMesh); + + // SetMaterial(0, nullptr) ne "retire" pas le materiau, il pose un slot vide + // et le mesh devient gris damier. Sans override, on ne touche a rien et le + // mesh garde le sien. + if (WorldMeshMaterial) + { + Component->SetMaterial(0, WorldMeshMaterial); + } +} + +#if WITH_EDITOR +EDataValidationResult UItemDataAsset::IsDataValid(FDataValidationContext& Context) const +{ + EDataValidationResult Result = Super::IsDataValid(Context); + + if (bCanBeCooked && !CookedResult) + { + Context.AddError(LOCTEXT("CookNoResult", "'Can Be Cooked' is checked but no 'Cooked Result' is assigned: this item would sit on the fire forever without ever changing.")); + Result = EDataValidationResult::Invalid; + } + + if (bCanBurn && !BurntResult) + { + Context.AddError(LOCTEXT("BurnNoResult", "'Can Burn' is checked but no 'Burnt Result' is assigned.")); + Result = EDataValidationResult::Invalid; + } + + // Une chaine qui reboucle sur elle-meme ne plante pas, elle tourne : la + // station re-arme un timer identique a chaque etape et le joueur voit un + // objet qui ne finit jamais de cuire. Impossible a diagnostiquer en jeu. + if (CookedResult == this) + { + Context.AddError(LOCTEXT("CookSelfResult", "'Cooked Result' points back to this asset: the item would cook into itself, endlessly.")); + Result = EDataValidationResult::Invalid; + } + + if (BurntResult == this) + { + Context.AddError(LOCTEXT("BurnSelfResult", "'Burnt Result' points back to this asset: the item would burn into itself, endlessly.")); + Result = EDataValidationResult::Invalid; + } + + // Un objet a charges ne s'empile pas (voir GetEffectiveMaxStack). Le poser + // sur le feu reste possible, mais la charge entamee suit l'exemplaire et le + // resultat en herite : autant que ce soit un choix, pas une surprise. + if (MaxUses > 1 && bCanBeCooked) + { + Context.AddWarning(LOCTEXT("CookableWithCharges", "This item has multiple uses AND can be cooked. The remaining charges follow the item through cooking, which is rarely what you want for food.")); + } + + return Result; +} +#endif + +#undef LOCTEXT_NAMESPACE diff --git a/Source/Survival_projet/Private/PickupItem.cpp b/Source/Survival_projet/Private/PickupItem.cpp index cc125dc..6077729 100644 --- a/Source/Survival_projet/Private/PickupItem.cpp +++ b/Source/Survival_projet/Private/PickupItem.cpp @@ -45,24 +45,25 @@ void APickupItem::OnConstruction(const FTransform& Transform) // pour les objets jetes, puisque OnConstruction s'execute a FinishSpawning. if (bUseMeshFromItemData && ItemData && ItemData->WorldMesh) { - Mesh->SetStaticMesh(ItemData->WorldMesh); + ItemData->ApplyWorldVisualsTo(Mesh); } } -FText APickupItem::GetInteractionPrompt_Implementation() const +FText APickupItem::GetInteractionPrompt_Implementation(AActor* Interactor) const { + // Interactor ne sert pas ici : ramasser dit la meme chose a tout le monde. if (!ItemData) { - return LOCTEXT("PickupUnconfigured", "Objet non configure"); + return LOCTEXT("PickupUnconfigured", "Unconfigured item"); } if (Quantity > 1) { - return FText::Format(LOCTEXT("PickupPromptStack", "Ramasser {0} x{1}"), + return FText::Format(LOCTEXT("PickupPromptStack", "Pick up {0} x{1}"), ItemData->DisplayName, FText::AsNumber(Quantity)); } - return FText::Format(LOCTEXT("PickupPrompt", "Ramasser {0}"), ItemData->DisplayName); + return FText::Format(LOCTEXT("PickupPrompt", "Pick up {0}"), ItemData->DisplayName); } bool APickupItem::CanInteract_Implementation(AActor* Interactor) const diff --git a/Source/Survival_projet/Public/CookingStation.h b/Source/Survival_projet/Public/CookingStation.h new file mode 100644 index 0000000..43166f0 --- /dev/null +++ b/Source/Survival_projet/Public/CookingStation.h @@ -0,0 +1,482 @@ +// Fill out your copyright notice in the Description page of Project Settings. + +#pragma once + +#include "CoreMinimal.h" +#include "GameFramework/Actor.h" +#include "Interactable.h" +#include "CookingStation.generated.h" + +class UInventoryComponent; +class UItemDataAsset; +class UNiagaraComponent; +class UPointLightComponent; +class USoundBase; +class USphereComponent; +class UStaticMeshComponent; + +/** + * Ce qu'un emplacement du grill porte a l'instant t. + * + * Uniquement de l'etat : le DataAsset dit ce que l'objet EST, cette struct dit + * ou il en est. C'est la meme separation que FInventorySlot, pour la meme raison. + */ +USTRUCT(BlueprintType) +struct FCookingSlotState +{ + GENERATED_BODY() + + /** L'objet pose, ou nullptr. Un seul exemplaire par emplacement, comme dans Raft. */ + UPROPERTY(BlueprintReadOnly, Category = "Cooking") + TObjectPtr Item = nullptr; + + /** + * Charges restantes de l'exemplaire pose. -1 = plein. + * L'usure traverse la cuisson comme elle traverse le sol : ce qu'on + * recupere est le meme exemplaire, pas un neuf. + */ + UPROPERTY(BlueprintReadOnly, Category = "Cooking") + int32 RemainingUses = -1; + + /** + * Compte a rebours de l'etape en cours. Pas une UPROPERTY : un FTimerHandle + * n'est qu'un index dans le gestionnaire de timers, il n'y a rien a + * collecter ni a serialiser. + */ + FTimerHandle Timer; + + bool IsEmpty() const { return Item == nullptr; } +}; + +/** + * Une buche dans le foyer : QUEL objet a ete mis, et combien de temps il tient + * encore. + * + * C'est le coeur du modele : le carburant n'est pas une jauge de secondes mais + * une pile d'objets. Cinq buches, cinq objets -- une branche qui tient dix + * secondes occupe exactement la meme place qu'une planche qui en tient cent + * quatre-vingts. Le joueur voit donc ce qu'il a donne au feu, pas un + * pourcentage abstrait, et melanger les combustibles reste lisible. + */ +USTRUCT(BlueprintType) +struct FFuelSlotState +{ + GENERATED_BODY() + + UPROPERTY(BlueprintReadOnly, Category = "Cooking") + TObjectPtr Item = nullptr; + + /** Secondes de combustion restantes pour CE morceau. */ + UPROPERTY(BlueprintReadOnly, Category = "Cooking") + float RemainingSeconds = 0.f; +}; + +/** L'etat de la station a change : allumage, depot, transformation, retrait. */ +DECLARE_DYNAMIC_MULTICAST_DELEGATE(FOnCookingStationChanged); + +/** + * Ce que l'appui sur Interagir va declencher, compte tenu de ce que le joueur + * vise et de ce qu'il tient. + * + * Pas un UENUM : c'est un detail d'implementation, rien a l'exterieur n'a + * besoin de le nommer. + */ +enum class ECookingAction : uint8 +{ + None, + TakeItem, + PlaceItem, + AddFuel +}; + +/** + * Resultat complet de la decision. Calcule UNE fois, par ResolveAction(), et + * servi a la fois au texte du prompt et a l'execution : deux cascades de `if` + * separees finiraient par diverger, et le joueur lirait "Light the fire" en + * obtenant autre chose. + * + * Struct de pile a duree de vie tres courte, d'ou les pointeurs bruts : rien + * ici ne peut etre collecte entre le calcul et son usage. + */ +struct FCookingInteraction +{ + ECookingAction Action = ECookingAction::None; + + /** Emplacement de cuisson vise, ou INDEX_NONE si le joueur regarde le foyer. */ + int32 SlotIndex = INDEX_NONE; + + /** Objet actif de la barre rapide. */ + UItemDataAsset* HeldItem = nullptr; + + /** Slot d'inventaire d'ou sortira le bois, et l'objet correspondant. */ + int32 FuelSourceSlot = INDEX_NONE; + UItemDataAsset* FuelItem = nullptr; +}; + +/** + * Poste de cuisson pose dans le monde : feu de camp, et plus tard fourneau ou + * sechoir en changeant simplement ses reglages. + * + * Modele Raft assume : AUCUNE interface. Le joueur tient sa viande crue dans la + * barre rapide, vise un emplacement du grill, appuie sur Interagir, et regarde + * le mesh changer. + * + * Le poste ne commente jamais son propre etat : le prompt n'affiche QUE des + * actions realisables, exactement comme un objet a ramasser. Ce qui cuit, ce + * qui manque et ce qui brule se lit sur les flammes, sur le nombre de buches + * et sur le mesh de la nourriture -- l'ecrire en plus reconstruirait une + * interface par-dessus un monde qui se suffit a lui-meme. + * + * Aucun Tick. Un timer par emplacement de cuisson, un seul pour le carburant : + * celui de la buche en train de bruler. Eteindre le feu met ces timers en + * pause, et la cuisson reprend exactement ou elle s'etait arretee sans qu'une + * ligne ne compte le temps a la main. + * + * Le feu ne s'allume PAS a la main : il part des qu'il a du bois et quelque + * chose a transformer, et s'arrete des qu'il n'a plus rien a faire. Le bois ne + * part donc jamais en fumee pour rien -- ce qui evite au joueur d'avoir a + * penser a eteindre derriere lui, une corvee qui n'apporte aucune decision + * interessante. + */ +UCLASS() +class SURVIVAL_PROJET_API ACookingStation : public AActor, public IInteractable +{ + GENERATED_BODY() + +public: + ACookingStation(); + + // --- IInteractable --- + virtual FText GetInteractionPrompt_Implementation(AActor* Interactor) const override; + virtual bool CanInteract_Implementation(AActor* Interactor) const override; + virtual void Interact_Implementation(AActor* Interactor) override; + virtual void OnBeginFocus_Implementation() override; + virtual void OnEndFocus_Implementation() override; + + /** + * Allume le feu s'il reste du bois dans le foyer. + * + * En temps normal, personne n'appelle ceci : UpdateFireState() decide seul. + * Reste exposee pour un futur allume-feu ou un evenement scenarise. + * @return false si le foyer est vide. + */ + UFUNCTION(BlueprintCallable, Category = "Cooking") + bool Light(); + + /** Eteint le feu. Les cuissons en cours se figent, elles ne repartent pas de zero. */ + UFUNCTION(BlueprintCallable, Category = "Cooking") + void Extinguish(); + + /** Vrai si au moins un emplacement porte quelque chose qui a encore une etape a franchir. */ + UFUNCTION(BlueprintPure, Category = "Cooking") + bool HasPendingWork() const; + + UFUNCTION(BlueprintPure, Category = "Cooking") + bool IsLit() const { return bIsLit; } + + /** + * Combien de morceaux de bois le foyer peut contenir. + * + * C'est le nombre de buches taguees dans le Blueprint : la capacite est une + * decision de mise en scene, et la regler a deux endroits garantirait qu'ils + * finissent par se contredire. FallbackFuelCapacity ne sert qu'aux postes + * sans buche visible, un four ferme par exemple. + */ + UFUNCTION(BlueprintPure, Category = "Cooking") + int32 GetFuelCapacity() const { return FuelIndicators.Num() > 0 ? FuelIndicators.Num() : FallbackFuelCapacity; } + + /** Morceaux de bois actuellement dans le foyer. */ + UFUNCTION(BlueprintPure, Category = "Cooking") + int32 GetFuelCount() const { return Fuel.Num(); } + + /** Secondes de combustion cumulees sur tout ce qui est dans le foyer. */ + UFUNCTION(BlueprintPure, Category = "Cooking") + float GetFuelRemaining() const; + + /** Secondes avant la prochaine transformation, ou 0 si l'emplacement n'attend rien. */ + UFUNCTION(BlueprintPure, Category = "Cooking") + float GetSlotTimeRemaining(int32 SlotIndex) const; + + UFUNCTION(BlueprintPure, Category = "Cooking") + const TArray& GetSlots() const { return Slots; } + + UPROPERTY(BlueprintAssignable, Category = "Cooking") + FOnCookingStationChanged OnStationChanged; + +protected: + virtual void BeginPlay() override; + virtual void EndPlay(const EEndPlayReason::Type EndPlayReason) override; + + /** + * Nombre d'emplacements de cuisson existant dans la classe. Les composants + * sont crees au constructeur, donc ce nombre est fige a la compilation -- + * c'est le prix a payer pour pouvoir les positionner A LA SOURIS dans le + * viewport du Blueprint. Des composants engendres a l'execution ne seraient + * reglables qu'en tapant des coordonnees a l'aveugle. + */ + static constexpr int32 MaxCookingSlots = 4; + + // ------------------------------------------------------------------ + // Composants + // ------------------------------------------------------------------ + + /** Le foyer lui-meme : bois, pierres, structure. */ + UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category = "Cooking") + TObjectPtr BaseMesh; + + /** + * Ce que le trace d'interaction vient toucher. Sphere dediee et non le mesh, + * pour la meme raison que sur APickupItem : rien ne garantit qu'un mesh + * d'asset pack ait une collision. + */ + UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category = "Cooking") + TObjectPtr InteractionSphere; + + /** + * Un mesh par emplacement de cuisson, qui porte la nourriture posee. Sa + * transform sert a la fois a l'afficher et a savoir ce que le joueur vise : + * pas besoin d'une collision par emplacement, donc pas une requete physique + * de plus. + * + * Positionne-les dans le viewport du Blueprint. Ils sont caches au demarrage + * tant qu'ils sont vides, mais restent visibles dans l'editeur pour que tu + * puisses les placer. + */ + UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category = "Cooking") + TArray> SlotMeshes; + + /** Flamme. Active tant que le feu brule, coupee des qu'il s'eteint. */ + UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category = "Cooking") + TObjectPtr FireEffect; + + /** + * Halo du foyer, allume en meme temps que la flamme. + * + * Regle intensite, couleur et rayon directement sur le composant dans le + * Blueprint : ce sont des proprietes natives, les redeclarer ici en + * doublon garantirait qu'un jour les deux se contredisent. + */ + UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category = "Cooking") + TObjectPtr FireLight; + + // ------------------------------------------------------------------ + // Reglages + // ------------------------------------------------------------------ + + /** Emplacements de cuisson reellement utilises. Les autres restent caches. */ + UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "Cooking", meta = (ClampMin = "1", ClampMax = "4")) + int32 CookingSlotCount = 2; + + /** + * Echelle appliquee au mesh de la nourriture posee. + * Les meshes d'objets sont dimensionnes pour etre poses au sol ; sur un + * grill ils sont souvent trop gros. + */ + UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "Cooking", meta = (ClampMin = "0.01")) + float CookingMeshScale = 1.f; + + /** + * Demi-angle du cone de visee autour de chaque emplacement, en degres. + * + * Au-dela, on considere que le joueur vise le foyer et pas un emplacement : + * c'est ce qui lui permet d'ajouter du bois ou d'allumer le feu sans devoir + * eviter le grill du regard. + */ + UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "Cooking", meta = (ClampMin = "1", ClampMax = "89")) + float SlotAimHalfAngle = 25.f; + + /** Multiplie la vitesse de cuisson. Un fourneau va plus vite que des braises. */ + UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "Cooking", meta = (ClampMin = "0.01")) + float CookSpeedMultiplier = 1.f; + + /** + * Autorise a reprendre un objet qui n'a pas fini de cuire. + * + * Decoche par defaut : ce qu'on a mis a cuire est engage, on attend. Un + * objet qui a fini sa cuisson reste toujours recuperable, y compris pendant + * qu'il se dirige vers le brule -- sans quoi il serait impossible de sauver + * sa viande a temps, ce qui viderait la sur-cuisson de tout son sens. + */ + UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "Cooking") + bool bAllowTakingRawItems = false; + + /** + * Ajoute les secondes restantes aux textes du prompt. + * + * Decoche en jeu : un chiffre qui s'egrene est de l'interface deguisee, et + * le joueur doit lire l'avancement sur le mesh, pas sur un compteur. Coche + * le temps d'un reglage pour verifier tes durees. + */ + UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "Cooking") + bool bShowRemainingTimeInPrompt = false; + + + /** Active le Custom Depth quand le poste est vise, comme les ramassables. */ + UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "Cooking") + bool bHighlightOnFocus = true; + + // ------------------------------------------------------------------ + // Reglages : carburant + // ------------------------------------------------------------------ + + /** + * Tag a poser sur les meshes de buches qui figurent le contenu du foyer. + * Leur NOMBRE fait la capacite du feu, et leur ordre alphabetique l'ordre + * d'apparition : la derniere posee est la premiere a bruler. + */ + UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "Cooking|Fuel") + FName FuelIndicatorTag = TEXT("FuelLog"); + + /** Capacite des postes qui n'ont aucune buche visible. Ignore des qu'il y en a une. */ + UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "Cooking|Fuel", meta = (ClampMin = "1")) + int32 FallbackFuelCapacity = 5; + + /** + * Chaque buche prend le mesh de l'objet qu'elle represente. + * + * Decoche par defaut : les buches d'un feu de camp sont posees a la main + * dans le Blueprint, avec leur orientation et leur imbrication soignees, et + * y substituer un mesh d'objet gacherait ce travail. Coche-le pour un + * support ou l'on veut distinguer d'un coup d'oeil branches et planches. + */ + UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "Cooking|Fuel") + bool bFuelIndicatorsUseItemMesh = false; + + /** Bois deja dans le foyer au demarrage. Laisse vide pour un feu a alimenter. */ + UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "Cooking|Fuel") + TObjectPtr StartingFuelItem; + + UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "Cooking|Fuel", meta = (ClampMin = "0")) + int32 StartingFuelCount = 0; + + // ------------------------------------------------------------------ + // Sons. Tous facultatifs : un champ vide ne joue rien. + // ------------------------------------------------------------------ + + UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "Cooking|Sound") + TObjectPtr LightSound; + + UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "Cooking|Sound") + TObjectPtr ExtinguishSound; + + UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "Cooking|Sound") + TObjectPtr PlaceItemSound; + +private: + /** + * Quel emplacement de cuisson le joueur vise, ou INDEX_NONE s'il regarde le + * foyer. Se base sur le point de vue reel du pawn, donc sur ce qu'il voit a + * l'ecran, et non sur la position de son corps. + */ + int32 ResolveAimedSlot(const AActor* Interactor) const; + + /** Decide ce que ferait un appui sur Interagir, sans rien modifier. */ + FCookingInteraction ResolveAction(AActor* Interactor) const; + + /** Depose l'objet actif de la barre rapide sur l'emplacement de cuisson. */ + bool PlaceItemFromHand(int32 SlotIndex, AActor* Interactor); + + /** Rend l'objet a l'inventaire. Refuse et laisse tout en place si c'est plein. */ + bool TakeItemToInventory(int32 SlotIndex, AActor* Interactor); + + /** + * Met UN morceau de bois dans le foyer, pris dans un slot d'inventaire. + * + * Un exemplaire par appui, jamais la pile entiere : donner du bois est un + * geste irreversible, et vider vingt branches d'un coup sur un feu qui n'en + * demandait qu'une ne se rattrape pas. Le joueur dose lui-meme. + */ + bool AddFuelFrom(int32 InventorySlotIndex, AActor* Interactor); + + /** + * Ou prendre du bois : la main d'abord, sinon le premier slot qui en + * contient. La main est prioritaire parce que c'est le seul moyen pour le + * joueur de CHOISIR ce qu'il brule. + */ + static int32 FindFuelSource(const UInventoryComponent* Inventory, UItemDataAsset*& OutItem); + + /** Peut-on retirer ce qui se trouve sur cet emplacement de cuisson. */ + bool CanTakeFromSlot(int32 SlotIndex) const; + + /** Arme le compte a rebours de l'etape courante de l'emplacement. */ + void StartSlotTimer(int32 SlotIndex); + + /** Fin d'etape : l'objet devient son resultat, et on enchaine s'il y a une suite. */ + void HandleSlotFinished(int32 SlotIndex); + + /** Recopie le WorldMesh de l'objet pose, ou cache le composant si l'emplacement est vide. */ + void RefreshSlotMesh(int32 SlotIndex); + + /** + * Allume ou eteint selon qu'il y ait, ou non, du bois ET du travail. + * + * Point de decision UNIQUE : toutes les actions qui changent le contenu du + * foyer ou du grill finissent ici. Laisser chaque action decider elle-meme + * d'allumer aurait fini par oublier un cas -- typiquement le dernier objet + * retire, qui laisserait le feu bruler dans le vide. + */ + void UpdateFireState(); + + /** La buche du dessus a fini de bruler : on passe a la suivante. */ + void HandleFuelConsumed(); + + /** Arme le timer sur la buche en cours de combustion. */ + void StartFuelTimer(); + + /** Recopie le restant du timer dans la buche courante avant de le modifier. */ + void SyncFuelFromTimer(); + + /** + * Allume ou coupe tout ce qui se voit quand le feu brule. + * + * Un seul endroit pour la flamme et la lumiere : le jour ou s'ajoute une + * boucle sonore ou un panache de fumee, il n'y aura toujours qu'un point a + * modifier au lieu de deux appels a retrouver dans Light() et Extinguish(). + */ + void ApplyFireVisuals(bool bActive); + + /** Retrouve les buches par leur tag, une fois pour toutes, au demarrage. */ + void CacheFuelIndicators(); + + /** + * Montre exactement autant de buches qu'il y a de morceaux dans le foyer. + * + * Plus aucun calcul de palier ni de timer d'affichage depuis que le + * carburant est une pile d'objets : une buche visible EST un objet stocke. + */ + void RefreshFuelIndicators(); + + /** + * Ce que cet objet va devenir sur le feu, et en combien de temps. + * La cuisson passe avant la combustion : voir le commentaire de bCanBurn + * sur UItemDataAsset. + */ + static UItemDataAsset* GetNextStage(const UItemDataAsset* Item, float& OutDuration); + + /** Inventaire du pawn qui interagit, ou nullptr. */ + static UInventoryComponent* GetInventoryOf(AActor* Interactor); + + /** Etat courant de chaque emplacement de cuisson. Toujours dimensionne a MaxCookingSlots. */ + UPROPERTY(Transient) + TArray Slots; + + /** + * Le contenu du foyer, dans l'ordre ou il a ete donne. L'index 0 est celui + * qui brule ; quand il est consomme, tout le monde avance d'un cran et la + * derniere buche disparait du foyer. + */ + UPROPERTY(Transient) + TArray Fuel; + + FTimerHandle FuelTimer; + + /** + * Buches de mise en scene, resolues au BeginPlay et triees par nom. + * Transient : ces pointeurs designent des composants du Blueprint, il n'y a + * rien a sauvegarder, seulement a garder du GC le temps de la partie. + */ + UPROPERTY(Transient) + TArray> FuelIndicators; + + bool bIsLit = false; +}; diff --git a/Source/Survival_projet/Public/CraftingComponent.h b/Source/Survival_projet/Public/CraftingComponent.h index e0abb84..9064cd2 100644 --- a/Source/Survival_projet/Public/CraftingComponent.h +++ b/Source/Survival_projet/Public/CraftingComponent.h @@ -131,9 +131,16 @@ public: // ------------------------------------------------------------------ UFUNCTION(BlueprintPure, Category = "Crafting|Stations") - bool HasStation(ECraftingStation Station) const { return AvailableStations.Contains(Station); } + bool HasStation(ECraftingStation Station) const; - /** A appeler quand le joueur entre dans le rayon d'un poste. */ + /** + * A appeler quand le joueur entre dans le rayon d'un poste. + * + * Les appels se COMPTENT : deux etablis dont les portees se chevauchent, ce + * qui arrive des qu'on construit une base un peu dense, s'ajoutent tous les + * deux. Sortir du premier ne doit pas retirer l'acces alors qu'on est encore + * devant le second. + */ UFUNCTION(BlueprintCallable, Category = "Crafting|Stations") void AddAvailableStation(ECraftingStation Station); @@ -161,8 +168,11 @@ protected: private: /** - * Pas une UPROPERTY : un TSet de valeurs d'enum ne contient aucune - * reference a collecter, et cet etat n'a rien a regler dans l'editeur. + * Combien de postes de chaque type sont a portee, et non un simple + * "present / absent" -- voir AddAvailableStation. + * + * Pas une UPROPERTY : ni la cle ni la valeur ne sont des references a + * collecter, et cet etat n'a rien a regler dans l'editeur. */ - TSet AvailableStations; + TMap StationRefCounts; }; diff --git a/Source/Survival_projet/Public/CraftingStation.h b/Source/Survival_projet/Public/CraftingStation.h new file mode 100644 index 0000000..086a263 --- /dev/null +++ b/Source/Survival_projet/Public/CraftingStation.h @@ -0,0 +1,65 @@ +// Fill out your copyright notice in the Description page of Project Settings. + +#pragma once + +#include "CoreMinimal.h" +#include "GameFramework/Actor.h" +#include "CraftingRecipeDataAsset.h" +#include "Interactable.h" +#include "CraftingStation.generated.h" + +class UStaticMeshComponent; + +/** + * Un poste de travail pose dans le monde : etabli, et ce qui suivra. + * + * Il ne fabrique rien lui-meme et ne contient aucune recette. Tout ce qu'il + * fait, c'est ouvrir l'ecran de fabrication en annoncant SON type de poste -- + * le reste appartient au UCraftingComponent du joueur, qui filtrera les + * recettes en consequence. + * + * L'acces au poste ne dure que le temps de l'ecran : c'est le controller qui + * l'accorde a l'ouverture et le reprend a la fermeture. Un etabli qui donnerait + * son acces "par proximite" obligerait a surveiller la distance en permanence, + * pour un resultat que le joueur comprendrait moins bien -- ici on fabrique a + * l'etabli parce qu'on est en train de s'en servir. + * + * Un seul BP_CraftingStation suffit pour tous les postes : c'est StationType + * qui change par instance, comme ItemData sur BP_Pickup. + */ +UCLASS() +class SURVIVAL_PROJET_API ACraftingStation : public AActor, public IInteractable +{ + GENERATED_BODY() + +public: + ACraftingStation(); + + // --- IInteractable --- + virtual FText GetInteractionPrompt_Implementation(AActor* Interactor) const override; + virtual void Interact_Implementation(AActor* Interactor) override; + +protected: + /** + * Le visuel ET la surface d'interaction. + * + * Pas de sphere dediee ici, contrairement a APickupItem : un poste est un + * meuble construit, dont le mesh a une vraie collision simple. Une sphere + * autour d'un volume pareil serait touchee AVANT lui -- le trace s'arrete au + * premier bloqueur -- et le prompt apparaitrait en visant le vide autour, ou + * masquerait un objet pose au pied du meuble. + * + * Corollaire : le mesh assigne doit avoir une collision simple. Sans elle, + * le trace le traverse, puisqu'il est lance en bTraceComplex = false. + */ + UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category = "Crafting") + TObjectPtr Mesh; + + /** Le poste que cet acteur rend accessible pendant qu'on s'en sert. */ + UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "Crafting") + ECraftingStation StationType = ECraftingStation::Workbench; + + /** Texte affiche quand le joueur vise le poste. */ + UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "Crafting") + FText InteractionPrompt; +}; diff --git a/Source/Survival_projet/Public/FpsPlayerController.h b/Source/Survival_projet/Public/FpsPlayerController.h index 948c6e8..7405957 100644 --- a/Source/Survival_projet/Public/FpsPlayerController.h +++ b/Source/Survival_projet/Public/FpsPlayerController.h @@ -4,12 +4,15 @@ #include "CoreMinimal.h" // ESlateVisibility n'est que declare en avant par le moteur : il faut le type -// complet pour en stocker une valeur par defaut. +// complet pour en stocker une valeur par defaut. Meme raison pour +// ECraftingStation, stocke en membre. #include "Components/SlateWrapperTypes.h" +#include "CraftingRecipeDataAsset.h" #include "GameFramework/PlayerController.h" #include "FpsPlayerController.generated.h" class UConfirmDialogWidget; +class UCraftingComponent; class UHotbarWidget; class UInputAction; class UInventoryComponent; @@ -46,6 +49,20 @@ public: UFUNCTION(BlueprintCallable, Category = "UI") void ToggleCrafting(); + /** + * Ouvre l'ecran de fabrication depuis un poste de travail. + * + * L'acces au poste ne dure QUE le temps de l'ecran : il est accorde ici et + * repris a la fermeture. C'est le contrat de l'interaction -- on fabrique a + * l'etabli parce qu'on est en train de s'en servir, pas parce qu'on en a + * croise un un jour. + * + * Le contrôleur s'en charge et non l'etabli : c'est lui qui sait quand + * l'ecran se referme, et lui seul peut donc rendre le poste au bon moment. + */ + UFUNCTION(BlueprintCallable, Category = "UI") + void OpenCraftingAtStation(ECraftingStation Station); + UFUNCTION(BlueprintPure, Category = "UI") bool IsInventoryOpen() const { return bInventoryOpen; } @@ -277,6 +294,12 @@ private: */ void SetInventoryScreenOpen(bool bOpen, bool bShowCraftingTab); + /** Rend le poste accorde par le dernier OpenCraftingAtStation. Sans effet sinon. */ + void ReleaseActiveStation(); + + /** Raccourci vers le composant de fabrication du pawn possede. */ + UCraftingComponent* GetPawnCrafting() const; + /** L'ecran a change d'onglet : la barre rapide n'a rien a faire sous la page de craft. */ UFUNCTION() void HandleInventoryTabChanged(bool bInventoryTabActive); @@ -311,6 +334,12 @@ private: /** Onglet Fabrication affiche. N'a de sens que si bInventoryOpen est vrai. */ bool bCraftingTabActive = false; + /** + * Poste accorde par l'ecran actuellement ouvert, a rendre a la fermeture. + * Count = aucun, l'ecran a ete ouvert au clavier et pas depuis un etabli. + */ + ECraftingStation ActiveStation = ECraftingStation::Count; + /** * Visibilite d'origine de la barre rapide, relevee a sa creation. * On la restaure telle quelle plutot que de forcer Visible : le Blueprint a diff --git a/Source/Survival_projet/Public/Interactable.h b/Source/Survival_projet/Public/Interactable.h index 030da23..d5ba405 100644 --- a/Source/Survival_projet/Public/Interactable.h +++ b/Source/Survival_projet/Public/Interactable.h @@ -40,10 +40,16 @@ public: * Texte affiche au joueur quand il vise l'objet ("Ramasser", "Ouvrir"...). * Renvoie du FText et non du FString : c'est le type localisable d'Unreal, * indispensable si tu traduis le jeu un jour. + * + * Interactor est fourni parce que le texte depend souvent de CELUI qui vise + * et d'ou il vise : un feu de camp nomme l'emplacement precis qu'on regarde, + * un coffre verrouille annonce quelle cle il attend. Sans lui, l'objet + * devrait aller chercher le joueur local par un chemin detourne -- ce qui + * marche exactement jusqu'au jour ou il y a deux joueurs. */ UFUNCTION(BlueprintNativeEvent, BlueprintCallable, Category = "Interaction") - FText GetInteractionPrompt() const; - virtual FText GetInteractionPrompt_Implementation() const { return FText::GetEmpty(); } + FText GetInteractionPrompt(AActor* Interactor) const; + virtual FText GetInteractionPrompt_Implementation(AActor* Interactor) const { return FText::GetEmpty(); } /** * Permet de refuser l'interaction selon le contexte : porte verrouillee, diff --git a/Source/Survival_projet/Public/InteractionComponent.h b/Source/Survival_projet/Public/InteractionComponent.h index ad5a5c1..f7e09cd 100644 --- a/Source/Survival_projet/Public/InteractionComponent.h +++ b/Source/Survival_projet/Public/InteractionComponent.h @@ -13,6 +13,14 @@ */ DECLARE_DYNAMIC_MULTICAST_DELEGATE_TwoParams(FOnInteractionFocusChanged, AActor*, NewFocus, AActor*, OldFocus); +/** + * Diffuse quand le TEXTE du prompt change, ce qui n'est pas la meme chose qu'un + * changement de cible : un feu de camp affiche un compte a rebours, et le fait + * de balayer d'un emplacement a l'autre ne change pas l'acteur vise. S'abonner + * uniquement a OnFocusChanged laisserait ces deux cas figes a l'ecran. + */ +DECLARE_DYNAMIC_MULTICAST_DELEGATE_OneParam(FOnInteractionPromptChanged, const FText&, NewPrompt); + /** * A poser sur le pawn du joueur. Lance regulierement un trace depuis le point * de vue de la camera, garde en memoire l'objet IInteractable vise, et declenche @@ -40,14 +48,24 @@ public: UFUNCTION(BlueprintPure, Category = "Interaction") AActor* GetFocusedActor() const { return FocusedActor.Get(); } - /** Texte a afficher a l'ecran, vide si rien n'est vise. */ + /** + * Texte a afficher a l'ecran, vide si rien n'est vise. + * + * Renvoie une valeur DEJA calculee : le prompt est reconstruit une fois par + * trace, pas une fois par lecture. Un widget peut donc l'interroger sans + * jamais declencher le moindre travail. + */ UFUNCTION(BlueprintPure, Category = "Interaction") - FText GetFocusedPrompt() const; + const FText& GetFocusedPrompt() const { return CachedPrompt; } /** Branche ton widget la-dessus pour afficher / cacher le prompt. */ UPROPERTY(BlueprintAssignable, Category = "Interaction") FOnInteractionFocusChanged OnFocusChanged; + /** Le texte affiche a change. C'est a ca qu'un widget de prompt s'abonne. */ + UPROPERTY(BlueprintAssignable, Category = "Interaction") + FOnInteractionPromptChanged OnPromptChanged; + protected: /** Portee du trace en cm. 250 = un peu plus d'un bras et demi. */ UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Interaction", meta = (ClampMin = "1")) @@ -88,6 +106,9 @@ private: /** Point de vue reel du joueur, camera comprise. */ bool GetViewPoint(FVector& OutLocation, FRotator& OutRotation) const; + /** Reconstruit CachedPrompt et diffuse uniquement si le texte a reellement change. */ + void RefreshPrompt(); + /** Cible courante. TWeakObjectPtr : si l'objet est detruit, on ne garde pas un pointeur mort. */ TWeakObjectPtr FocusedActor; @@ -99,5 +120,11 @@ private: */ bool bHasFocusedActor = false; + /** + * Dernier texte diffuse. Le garder permet deux choses : ne reveiller l'UI + * que sur un vrai changement, et servir GetFocusedPrompt() sans recalculer. + */ + FText CachedPrompt; + float TimeSinceLastTrace = 0.f; }; diff --git a/Source/Survival_projet/Public/InteractionPromptWidget.h b/Source/Survival_projet/Public/InteractionPromptWidget.h index 7ff1efc..c3899df 100644 --- a/Source/Survival_projet/Public/InteractionPromptWidget.h +++ b/Source/Survival_projet/Public/InteractionPromptWidget.h @@ -19,8 +19,12 @@ class UTextBlock; * en UMG, l'equivalent d'un prefab d'UI avec son script en Unity. * * Le widget ne fait AUCUN travail par frame : il s'abonne au delegue - * OnFocusChanged du composant d'interaction et ne se met a jour que lorsque - * la cible change reellement. + * OnPromptChanged du composant d'interaction et ne se met a jour que lorsque + * le texte change reellement. + * + * OnPromptChanged et pas OnFocusChanged : le texte peut bouger sans que la + * cible change -- un feu de camp qui egrene son compte a rebours, ou le regard + * qui glisse d'un emplacement du grill a l'autre sur le meme acteur. */ UCLASS(Abstract) class SURVIVAL_PROJET_API UInteractionPromptWidget : public UUserWidget @@ -54,9 +58,9 @@ protected: UInteractionPromptWidget(const FObjectInitializer& ObjectInitializer); private: - /** Appele par le composant d'interaction a chaque changement de cible. */ + /** Appele par le composant d'interaction a chaque changement du texte affiche. */ UFUNCTION() - void HandleFocusChanged(AActor* NewFocus, AActor* OldFocus); + void HandlePromptChanged(const FText& NewPrompt); /** Recalcule le texte et la visibilite. */ void Refresh(); diff --git a/Source/Survival_projet/Public/ItemDataAsset.h b/Source/Survival_projet/Public/ItemDataAsset.h index 117a540..3350d3f 100644 --- a/Source/Survival_projet/Public/ItemDataAsset.h +++ b/Source/Survival_projet/Public/ItemDataAsset.h @@ -6,6 +6,7 @@ #include "Engine/DataAsset.h" #include "ItemDataAsset.generated.h" +class UMaterialInterface; class UStaticMesh; class UTexture2D; @@ -47,6 +48,18 @@ public: UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "Item") TObjectPtr WorldMesh; + /** + * Materiau force sur le WorldMesh. Vide = celui du mesh. + * + * Indispensable des qu'un pack partage une geometrie entre plusieurs + * aliments : une chaine de cuisson demande un visuel par etape, et sans ca + * il faudrait trois meshes distincts la ou un seul suffit avec trois + * teintes. N'ecrase que le PREMIER slot de materiau -- un mesh qui en + * expose plusieurs garde les autres tels quels. + */ + UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "Item") + TObjectPtr WorldMeshMaterial; + /** * Nombre maximum d'exemplaires par slot. * 1 = ne s'empile pas (outils, armes), 20 = ressource classique. @@ -75,11 +88,22 @@ public: UFUNCTION(BlueprintPure, Category = "Item") int32 GetEffectiveMaxStack() const { return MaxUses > 1 ? 1 : FMath::Max(1, MaxStackSize); } + /** + * Pose le mesh et le materiau de l'objet sur un composant. + * + * Un DataAsset ne devrait pas piloter un composant, mais la regle "mesh plus + * materiau optionnel" a deja deux appelants -- l'objet au sol et l'objet sur + * le feu -- et en aura d'autres, l'objet en main le premier. La dupliquer + * garantit qu'un jour l'un des deux oubliera le materiau. + */ + UFUNCTION(BlueprintCallable, Category = "Item") + void ApplyWorldVisualsTo(class UStaticMeshComponent* Component) const; + /** * Slots ajoutes a l'inventaire quand cet objet est equipe comme sac. * Laisse a 0 pour tout ce qui n'est pas un contenant. */ - UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "Item|Sac", meta = (ClampMin = "0")) + UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "Item|Backpack", meta = (ClampMin = "0")) int32 BonusInventorySlots = 0; // ------------------------------------------------------------------ @@ -87,18 +111,101 @@ public: // ------------------------------------------------------------------ /** Coche pour qu'un clic gauche consomme l'objet et applique ses effets. */ - UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "Item|Consommable") + UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "Item|Consumable") bool bIsConsumable = false; /** Faim rendue a la consommation. */ - UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "Item|Consommable", meta = (EditCondition = "bIsConsumable")) + UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "Item|Consumable", meta = (EditCondition = "bIsConsumable")) float HungerRestore = 0.f; /** Soif rendue. Une valeur negative deshydrate -- utile pour l'eau salee. */ - UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "Item|Consommable", meta = (EditCondition = "bIsConsumable")) + UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "Item|Consumable", meta = (EditCondition = "bIsConsumable")) float ThirstRestore = 0.f; /** Vie rendue. Negative pour un aliment avarie ou toxique. */ - UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "Item|Consommable", meta = (EditCondition = "bIsConsumable")) + UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "Item|Consumable", meta = (EditCondition = "bIsConsumable")) float HealthRestore = 0.f; + + // ------------------------------------------------------------------ + // Cuisson + // + // Modele en CHAINE D'OBJETS, sans recette : cuire n'est pas un choix que le + // joueur fait dans un menu, c'est une propriete de l'objet. "Steak cru" + // pointe vers "Steak cuit", qui pointe vers "Steak brule". Chaque maillon + // est un asset complet, donc le changement de mesh sur le feu ne coute pas + // une ligne : c'est le WorldMesh du maillon suivant. + // + // Ce qui n'est PAS ici, et ne doit jamais y venir : le temps deja passe sur + // le feu. C'est de l'etat, il vit sur ACookingStation. Le mettre dans le + // DataAsset ferait cuire tous les steaks du monde en meme temps. + // ------------------------------------------------------------------ + + /** Cet objet se transforme quand on le pose sur un feu allume. */ + UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "Item|Cooking") + bool bCanBeCooked = false; + + /** Secondes de feu ACTIF necessaires. Un feu eteint met le compteur en pause. */ + UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "Item|Cooking", meta = (EditCondition = "bCanBeCooked", ClampMin = "0.1", Units = "s")) + float CookDuration = 20.f; + + /** Ce que l'objet devient une fois cuit. */ + UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "Item|Cooking", meta = (EditCondition = "bCanBeCooked")) + TObjectPtr CookedResult; + + /** + * L'objet se degrade s'il reste sur le feu. + * + * Volontairement independant de bCanBeCooked : un objet peut bruler sans + * jamais avoir ete cuisinable (une planche jetee dans les flammes), et un + * plat peut rester indefiniment au chaud sans jamais se gacher. Une seule + * chaine commune imposerait l'un ou l'autre a tout le monde. + * + * Si les deux sont coches, la CUISSON passe en premier : c'est le maillon + * cuit qui portera bCanBurn pour continuer vers le brule. + */ + UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "Item|Cooking") + bool bCanBurn = false; + + /** Secondes de feu actif avant que l'objet se gache. */ + UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "Item|Cooking", meta = (EditCondition = "bCanBurn", ClampMin = "0.1", Units = "s")) + float BurnDuration = 40.f; + + /** Ce que l'objet devient une fois brule. */ + UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "Item|Cooking", meta = (EditCondition = "bCanBurn")) + TObjectPtr BurntResult; + + /** + * Le feu accepte-t-il cet objet sur un emplacement de cuisson. + * + * Un maillon final -- le steak brule -- repond non : on ne peut plus le + * poser, et il ne fait plus rien s'il est deja la. La regle est centralisee + * ici pour que la station n'ait pas a la reconstruire a chaque appel. + */ + UFUNCTION(BlueprintPure, Category = "Item|Cooking") + bool CanBePlacedOnFire() const + { + return (bCanBeCooked && CookedResult != nullptr) || (bCanBurn && BurntResult != nullptr); + } + + // ------------------------------------------------------------------ + // Carburant + // ------------------------------------------------------------------ + + /** Cet objet peut alimenter un feu. */ + UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "Item|Fuel") + bool bIsFuel = false; + + /** Secondes de combustion apportees par exemplaire. */ + UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "Item|Fuel", meta = (EditCondition = "bIsFuel", ClampMin = "1", Units = "s")) + float FuelDuration = 60.f; + +#if WITH_EDITOR + /** + * Une chaine de cuisson mal branchee ne planterait pas : la viande resterait + * simplement crue sur le feu, sans rien dire. C'est exactement le genre de + * bug qu'on cherche une heure -- autant que l'editeur le refuse a la + * sauvegarde. + */ + virtual EDataValidationResult IsDataValid(class FDataValidationContext& Context) const override; +#endif }; diff --git a/Source/Survival_projet/Public/PickupItem.h b/Source/Survival_projet/Public/PickupItem.h index acbe1bc..eeba36a 100644 --- a/Source/Survival_projet/Public/PickupItem.h +++ b/Source/Survival_projet/Public/PickupItem.h @@ -36,7 +36,7 @@ public: void InitPickup(UItemDataAsset* InItemData, int32 InQuantity, int32 InRemainingUses = -1); // --- IInteractable --- - virtual FText GetInteractionPrompt_Implementation() const override; + virtual FText GetInteractionPrompt_Implementation(AActor* Interactor) const override; virtual bool CanInteract_Implementation(AActor* Interactor) const override; virtual void Interact_Implementation(AActor* Interactor) override; virtual void OnBeginFocus_Implementation() override; diff --git a/Source/Survival_projet/Survival_projet.Build.cs b/Source/Survival_projet/Survival_projet.Build.cs index 9f03666..ee46b2f 100644 --- a/Source/Survival_projet/Survival_projet.Build.cs +++ b/Source/Survival_projet/Survival_projet.Build.cs @@ -11,7 +11,11 @@ public class Survival_projet : ModuleRules // GameplayTags : Enhanced Input rend ses erreurs de remappage sous forme // de FGameplayTagContainer. Sans ce module on peut declarer le type mais // pas l'inspecter, et on perdrait la raison d'un echec dans le log. - PublicDependencyModuleNames.AddRange(new string[] { "Core", "CoreUObject", "Engine", "InputCore", "EnhancedInput", "GameplayTags", "UMG" }); + // Niagara : ACookingStation pilote sa flamme depuis le C++ (allumage, + // extinction). Passer par un evenement Blueprint marcherait aussi, mais + // l'etat du feu appartient au C++ -- le Blueprint ne doit brancher que + // l'asset, pas decider quand il s'allume. + PublicDependencyModuleNames.AddRange(new string[] { "Core", "CoreUObject", "Engine", "InputCore", "EnhancedInput", "GameplayTags", "UMG", "Niagara" }); PrivateDependencyModuleNames.AddRange(new string[] { "Slate", "SlateCore" }); diff --git a/Survival_projet.uproject b/Survival_projet.uproject index 2fc3168..7045fb7 100644 --- a/Survival_projet.uproject +++ b/Survival_projet.uproject @@ -24,6 +24,13 @@ { "Name": "DiscordRichPresence", "Enabled": true + }, + { + "Name": "IconStudio", + "Enabled": true, + "TargetAllowList": [ + "Editor" + ] } ] } \ No newline at end of file