├── docs ├── bc_s.png ├── open.png ├── bc_sd.png ├── closed.png ├── nav_f.png ├── nav_fd.png ├── nav_g.png ├── nav_h.png ├── nav_hd.png ├── tab_a.png ├── tab_ad.png ├── tab_b.png ├── tab_bd.png ├── tab_h.png ├── tab_hd.png ├── tab_s.png ├── tab_sd.png ├── splitbar.png ├── splitbard.png ├── sync_off.png ├── sync_on.png ├── Tree_structure.png ├── class_visual_u.png ├── logocombined.png ├── struct_f_scenario.png ├── class_s_visual_image.png ├── class_s_visual_socket.png ├── class_u_visual_image.png ├── class_u_visual_socket.png ├── class_u_visual_sprite.png ├── struct_f_visual_info.png ├── AssignVisualInfo_default.png ├── class_f_visual_u_module.png ├── class_i_info_assignable.png ├── class_u_info_assignable.png ├── class_u_visual_renderer.png ├── concepts.js ├── struct_f_visual_anchors.png ├── struct_f_visual_margin.png ├── class_s_visual_image_base.png ├── class_s_visual_text_block.png ├── class_u_visual_controller.png ├── class_u_visual_image_base.png ├── class_u_visual_text_block.png ├── class_u_visual_u_settings.png ├── search │ ├── classes_5.js │ ├── concepts_0.js │ ├── classes_1.js │ ├── variables_c.js │ ├── variables_6.js │ ├── namespaces_0.js │ ├── variables_d.js │ ├── functions_1.js │ ├── classes_2.js │ ├── functions_9.js │ ├── functions_3.js │ ├── functions_a.js │ ├── functions_11.js │ ├── functions_10.js │ ├── functions_6.js │ ├── variables_8.js │ ├── variables_4.js │ ├── variables_10.js │ ├── variables_a.js │ ├── functions_8.js │ ├── variables_7.js │ ├── classes_3.js │ ├── variables_3.js │ ├── searchdata.js │ ├── all_4.js │ ├── variables_9.js │ ├── functions_4.js │ ├── all_b.js │ ├── all_7.js │ ├── functions_b.js │ ├── all_12.js │ ├── all_3.js │ ├── variables_0.js │ ├── all_9.js │ ├── all_a.js │ ├── mag.svg │ ├── mag_d.svg │ ├── close.svg │ ├── mag_sel.svg │ ├── mag_seld.svg │ ├── variables_b.js │ ├── variables_5.js │ ├── classes_4.js │ ├── variables_e.js │ ├── classes_0.js │ ├── functions_f.js │ ├── variables_f.js │ ├── variables_2.js │ ├── all_11.js │ ├── all_c.js │ ├── functions_0.js │ ├── functions_c.js │ ├── variables_1.js │ ├── all_d.js │ ├── functions_7.js │ ├── all_1.js │ ├── functions_2.js │ ├── all_0.js │ ├── functions_d.js │ ├── all_e.js │ ├── all_8.js │ ├── all_10.js │ └── all_5.js ├── struct_f_visual_image_info.png ├── struct_f_visual_scenario_info.png ├── class_s_background_visual_image.png ├── class_u_background_visual_image.png ├── class_u_visual_u_blueprint_statics.png ├── class_u_visual_controller_interface.png ├── class_u_visual_versioning_subsystem.png ├── class_u_m_e___transition_parameter2_d.png ├── class_f_break_visual_text_block_decorator.png ├── namespaces_dup.js ├── struct_f_visual_info.js ├── struct_f_visual_anchors.js ├── struct_f_visual_margin.js ├── class_u_visual_image_base.js ├── class_u_e_1_1_visual_u_1_1_private_1_1_f_fast_move_async_task.png ├── class_u_e_1_1_visual_u_1_1_private_1_1_f_fast_move_async_worker.png ├── class_i_visual_controller_interface.js ├── class_f_visual_u_module.js ├── struct_f_background.js ├── class_u_m_e___transition_parameter2_d.js ├── class_u_visual_sprite.js ├── struct_f_sprite.js ├── minus.svg ├── minusd.svg ├── class_u_visual_u_settings.js ├── class_u_background_visual_image.js ├── plus.svg ├── plusd.svg ├── class_f_break_visual_text_block_decorator.js ├── class_s_visual_text_block.js ├── functions_dup.js ├── struct_f_visual_image_info.js ├── struct_f_visual_scenario_info.js ├── functions_func.js ├── struct_f_scenario.js ├── class_s_visual_socket.js ├── class_s_visual_image_base.js ├── class_u_visual_socket.js ├── class_u_visual_versioning_subsystem.js ├── doc.svg ├── docd.svg ├── class_u_visual_renderer.js ├── class_s_background_visual_image.js ├── folderclosed.svg ├── folderclosedd.svg ├── cookie.js ├── navtreedata.js ├── class_u_visual_text_block.js ├── navtree.css ├── folderopend.svg ├── clipboard.js ├── folderopen.svg ├── class_u_visual_image.js ├── annotated_dup.js └── class_s_visual_image.js ├── Resources └── Icon128.png ├── Source ├── VisualU │ ├── Private │ │ ├── SVisualImageBase.cpp │ │ ├── VisualTemplates.cpp │ │ ├── VisualDefaults.cpp │ │ ├── InfoAssignable.cpp │ │ ├── VisualImageBase.cpp │ │ ├── VisualControllerInterface.cpp │ │ ├── Scenario.cpp │ │ ├── VisualUCustomVersion.cpp │ │ ├── VisualSprite.cpp │ │ ├── GameplayDebuggerCategory_VisualU.h │ │ ├── ME_TransitionParameter2D.cpp │ │ ├── BackgroundVisualImage.cpp │ │ ├── SVisualSocket.cpp │ │ ├── VisualUSettings.cpp │ │ ├── VisualU.cpp │ │ ├── VisualSocket.cpp │ │ └── BreakVisualTextBlockDecorator.cpp │ ├── Public │ │ ├── VisualUCustomVersion.h │ │ ├── VisualImageBase.h │ │ ├── VisualControllerInterface.h │ │ ├── VisualTemplates.h │ │ ├── VisualU.h │ │ ├── InfoAssignable.h │ │ ├── BreakVisualTextBlockDecorator.h │ │ ├── BackgroundVisualImage.h │ │ ├── ME_TransitionParameter2D.h │ │ ├── VisualSprite.h │ │ ├── SBackgroundVisualImage.h │ │ ├── SVisualSocket.h │ │ ├── VisualUSettings.h │ │ └── VisualDefaults.h │ └── VisualU.Build.cs └── VisualUEditor │ ├── Public │ └── VisualUEditor.h │ ├── Private │ ├── VisualUSettingsCustomization.h │ ├── SpriteStructCustomization.h │ ├── VisualUEditor.cpp │ └── VisualUSettingsCustomization.cpp │ └── VisualUEditor.Build.cs ├── Content └── Misc │ └── TransitionParamCollection.uasset ├── Config ├── FilterPlugin.ini └── DefaultPlugins.ini ├── .gitignore ├── README.md ├── VisualU.uplugin └── LICENSE /docs/bc_s.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Razdvizh/VisualU/HEAD/docs/bc_s.png -------------------------------------------------------------------------------- /docs/open.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Razdvizh/VisualU/HEAD/docs/open.png -------------------------------------------------------------------------------- /docs/bc_sd.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Razdvizh/VisualU/HEAD/docs/bc_sd.png -------------------------------------------------------------------------------- /docs/closed.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Razdvizh/VisualU/HEAD/docs/closed.png -------------------------------------------------------------------------------- /docs/nav_f.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Razdvizh/VisualU/HEAD/docs/nav_f.png -------------------------------------------------------------------------------- /docs/nav_fd.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Razdvizh/VisualU/HEAD/docs/nav_fd.png -------------------------------------------------------------------------------- /docs/nav_g.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Razdvizh/VisualU/HEAD/docs/nav_g.png -------------------------------------------------------------------------------- /docs/nav_h.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Razdvizh/VisualU/HEAD/docs/nav_h.png -------------------------------------------------------------------------------- /docs/nav_hd.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Razdvizh/VisualU/HEAD/docs/nav_hd.png -------------------------------------------------------------------------------- /docs/tab_a.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Razdvizh/VisualU/HEAD/docs/tab_a.png -------------------------------------------------------------------------------- /docs/tab_ad.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Razdvizh/VisualU/HEAD/docs/tab_ad.png -------------------------------------------------------------------------------- /docs/tab_b.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Razdvizh/VisualU/HEAD/docs/tab_b.png -------------------------------------------------------------------------------- /docs/tab_bd.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Razdvizh/VisualU/HEAD/docs/tab_bd.png -------------------------------------------------------------------------------- /docs/tab_h.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Razdvizh/VisualU/HEAD/docs/tab_h.png -------------------------------------------------------------------------------- /docs/tab_hd.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Razdvizh/VisualU/HEAD/docs/tab_hd.png -------------------------------------------------------------------------------- /docs/tab_s.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Razdvizh/VisualU/HEAD/docs/tab_s.png -------------------------------------------------------------------------------- /docs/tab_sd.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Razdvizh/VisualU/HEAD/docs/tab_sd.png -------------------------------------------------------------------------------- /docs/splitbar.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Razdvizh/VisualU/HEAD/docs/splitbar.png -------------------------------------------------------------------------------- /docs/splitbard.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Razdvizh/VisualU/HEAD/docs/splitbard.png -------------------------------------------------------------------------------- /docs/sync_off.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Razdvizh/VisualU/HEAD/docs/sync_off.png -------------------------------------------------------------------------------- /docs/sync_on.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Razdvizh/VisualU/HEAD/docs/sync_on.png -------------------------------------------------------------------------------- /Resources/Icon128.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Razdvizh/VisualU/HEAD/Resources/Icon128.png -------------------------------------------------------------------------------- /docs/Tree_structure.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Razdvizh/VisualU/HEAD/docs/Tree_structure.png -------------------------------------------------------------------------------- /docs/class_visual_u.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Razdvizh/VisualU/HEAD/docs/class_visual_u.png -------------------------------------------------------------------------------- /docs/logocombined.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Razdvizh/VisualU/HEAD/docs/logocombined.png -------------------------------------------------------------------------------- /docs/struct_f_scenario.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Razdvizh/VisualU/HEAD/docs/struct_f_scenario.png -------------------------------------------------------------------------------- /docs/class_s_visual_image.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Razdvizh/VisualU/HEAD/docs/class_s_visual_image.png -------------------------------------------------------------------------------- /docs/class_s_visual_socket.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Razdvizh/VisualU/HEAD/docs/class_s_visual_socket.png -------------------------------------------------------------------------------- /docs/class_u_visual_image.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Razdvizh/VisualU/HEAD/docs/class_u_visual_image.png -------------------------------------------------------------------------------- /docs/class_u_visual_socket.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Razdvizh/VisualU/HEAD/docs/class_u_visual_socket.png -------------------------------------------------------------------------------- /docs/class_u_visual_sprite.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Razdvizh/VisualU/HEAD/docs/class_u_visual_sprite.png -------------------------------------------------------------------------------- /docs/struct_f_visual_info.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Razdvizh/VisualU/HEAD/docs/struct_f_visual_info.png -------------------------------------------------------------------------------- /docs/AssignVisualInfo_default.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Razdvizh/VisualU/HEAD/docs/AssignVisualInfo_default.png -------------------------------------------------------------------------------- /docs/class_f_visual_u_module.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Razdvizh/VisualU/HEAD/docs/class_f_visual_u_module.png -------------------------------------------------------------------------------- /docs/class_i_info_assignable.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Razdvizh/VisualU/HEAD/docs/class_i_info_assignable.png -------------------------------------------------------------------------------- /docs/class_u_info_assignable.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Razdvizh/VisualU/HEAD/docs/class_u_info_assignable.png -------------------------------------------------------------------------------- /docs/class_u_visual_renderer.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Razdvizh/VisualU/HEAD/docs/class_u_visual_renderer.png -------------------------------------------------------------------------------- /docs/concepts.js: -------------------------------------------------------------------------------- 1 | var concepts = 2 | [ 3 | [ "HasMemberOfType", "concept_has_member_of_type.html", null ] 4 | ]; -------------------------------------------------------------------------------- /docs/struct_f_visual_anchors.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Razdvizh/VisualU/HEAD/docs/struct_f_visual_anchors.png -------------------------------------------------------------------------------- /docs/struct_f_visual_margin.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Razdvizh/VisualU/HEAD/docs/struct_f_visual_margin.png -------------------------------------------------------------------------------- /docs/class_s_visual_image_base.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Razdvizh/VisualU/HEAD/docs/class_s_visual_image_base.png -------------------------------------------------------------------------------- /docs/class_s_visual_text_block.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Razdvizh/VisualU/HEAD/docs/class_s_visual_text_block.png -------------------------------------------------------------------------------- /docs/class_u_visual_controller.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Razdvizh/VisualU/HEAD/docs/class_u_visual_controller.png -------------------------------------------------------------------------------- /docs/class_u_visual_image_base.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Razdvizh/VisualU/HEAD/docs/class_u_visual_image_base.png -------------------------------------------------------------------------------- /docs/class_u_visual_text_block.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Razdvizh/VisualU/HEAD/docs/class_u_visual_text_block.png -------------------------------------------------------------------------------- /docs/class_u_visual_u_settings.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Razdvizh/VisualU/HEAD/docs/class_u_visual_u_settings.png -------------------------------------------------------------------------------- /docs/search/classes_5.js: -------------------------------------------------------------------------------- 1 | var searchData= 2 | [ 3 | ['visualu_0',['VisualU',['../class_visual_u.html',1,'']]] 4 | ]; 5 | -------------------------------------------------------------------------------- /docs/struct_f_visual_image_info.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Razdvizh/VisualU/HEAD/docs/struct_f_visual_image_info.png -------------------------------------------------------------------------------- /Source/VisualU/Private/SVisualImageBase.cpp: -------------------------------------------------------------------------------- 1 | // Copyright (c) 2025 Evgeny Shustov 2 | 3 | 4 | #include "SVisualImageBase.h" 5 | -------------------------------------------------------------------------------- /Source/VisualU/Private/VisualTemplates.cpp: -------------------------------------------------------------------------------- 1 | // Copyright (c) 2025 Evgeny Shustov 2 | 3 | 4 | #include "VisualTemplates.h" 5 | -------------------------------------------------------------------------------- /docs/struct_f_visual_scenario_info.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Razdvizh/VisualU/HEAD/docs/struct_f_visual_scenario_info.png -------------------------------------------------------------------------------- /docs/class_s_background_visual_image.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Razdvizh/VisualU/HEAD/docs/class_s_background_visual_image.png -------------------------------------------------------------------------------- /docs/class_u_background_visual_image.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Razdvizh/VisualU/HEAD/docs/class_u_background_visual_image.png -------------------------------------------------------------------------------- /Source/VisualU/Private/VisualDefaults.cpp: -------------------------------------------------------------------------------- 1 | // Copyright (c) 2025 Evgeny Shustov 2 | 3 | 4 | #include "VisualDefaults.h" 5 | 6 | -------------------------------------------------------------------------------- /docs/class_u_visual_u_blueprint_statics.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Razdvizh/VisualU/HEAD/docs/class_u_visual_u_blueprint_statics.png -------------------------------------------------------------------------------- /Content/Misc/TransitionParamCollection.uasset: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Razdvizh/VisualU/HEAD/Content/Misc/TransitionParamCollection.uasset -------------------------------------------------------------------------------- /docs/class_u_visual_controller_interface.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Razdvizh/VisualU/HEAD/docs/class_u_visual_controller_interface.png -------------------------------------------------------------------------------- /docs/class_u_visual_versioning_subsystem.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Razdvizh/VisualU/HEAD/docs/class_u_visual_versioning_subsystem.png -------------------------------------------------------------------------------- /docs/class_u_m_e___transition_parameter2_d.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Razdvizh/VisualU/HEAD/docs/class_u_m_e___transition_parameter2_d.png -------------------------------------------------------------------------------- /docs/class_f_break_visual_text_block_decorator.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Razdvizh/VisualU/HEAD/docs/class_f_break_visual_text_block_decorator.png -------------------------------------------------------------------------------- /docs/namespaces_dup.js: -------------------------------------------------------------------------------- 1 | var namespaces_dup = 2 | [ 3 | [ "EVisualControllerDirection", "namespace_e_visual_controller_direction.html", null ] 4 | ]; -------------------------------------------------------------------------------- /docs/search/concepts_0.js: -------------------------------------------------------------------------------- 1 | var searchData= 2 | [ 3 | ['hasmemberoftype_0',['HasMemberOfType',['../concept_has_member_of_type.html',1,'']]] 4 | ]; 5 | -------------------------------------------------------------------------------- /docs/search/classes_1.js: -------------------------------------------------------------------------------- 1 | var searchData= 2 | [ 3 | ['hasmemberoftypeimpl_0',['HasMemberOfTypeImpl',['../class_has_member_of_type_impl.html',1,'']]] 4 | ]; 5 | -------------------------------------------------------------------------------- /docs/struct_f_visual_info.js: -------------------------------------------------------------------------------- 1 | var struct_f_visual_info = 2 | [ 3 | [ "ToString", "struct_f_visual_info.html#a7325c2f51f9b2598526049bf5ec733c8", null ] 4 | ]; -------------------------------------------------------------------------------- /docs/search/variables_c.js: -------------------------------------------------------------------------------- 1 | var searchData= 2 | [ 3 | ['position_0',['Position',['../struct_f_sprite.html#a2c809693994e7587afb0a223bf361344',1,'FSprite']]] 4 | ]; 5 | -------------------------------------------------------------------------------- /docs/struct_f_visual_anchors.js: -------------------------------------------------------------------------------- 1 | var struct_f_visual_anchors = 2 | [ 3 | [ "ToString", "struct_f_visual_anchors.html#ad8bfdc4f37a8022848c07f19b222949a", null ] 4 | ]; -------------------------------------------------------------------------------- /docs/struct_f_visual_margin.js: -------------------------------------------------------------------------------- 1 | var struct_f_visual_margin = 2 | [ 3 | [ "ToString", "struct_f_visual_margin.html#a299d62f4fe58483a4ab0863c520c8fb4", null ] 4 | ]; -------------------------------------------------------------------------------- /docs/class_u_visual_image_base.js: -------------------------------------------------------------------------------- 1 | var class_u_visual_image_base = 2 | [ 3 | [ "UVisualImageBase", "class_u_visual_image_base.html#af9cb3714f867095d34bcd4b4504ce35a", null ] 4 | ]; -------------------------------------------------------------------------------- /docs/search/variables_6.js: -------------------------------------------------------------------------------- 1 | var searchData= 2 | [ 3 | ['head_0',['Head',['../class_u_visual_controller.html#aa3947b01d044fcdbb3266e5434ea3c59',1,'UVisualController']]] 4 | ]; 5 | -------------------------------------------------------------------------------- /docs/search/namespaces_0.js: -------------------------------------------------------------------------------- 1 | var searchData= 2 | [ 3 | ['evisualcontrollerdirection_0',['EVisualControllerDirection',['../namespace_e_visual_controller_direction.html',1,'']]] 4 | ]; 5 | -------------------------------------------------------------------------------- /docs/search/variables_d.js: -------------------------------------------------------------------------------- 1 | var searchData= 2 | [ 3 | ['renderer_0',['Renderer',['../class_u_visual_controller.html#a094c02bc723bce8a93e8cf785f195314',1,'UVisualController']]] 4 | ]; 5 | -------------------------------------------------------------------------------- /docs/class_u_e_1_1_visual_u_1_1_private_1_1_f_fast_move_async_task.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Razdvizh/VisualU/HEAD/docs/class_u_e_1_1_visual_u_1_1_private_1_1_f_fast_move_async_task.png -------------------------------------------------------------------------------- /docs/class_u_e_1_1_visual_u_1_1_private_1_1_f_fast_move_async_worker.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Razdvizh/VisualU/HEAD/docs/class_u_e_1_1_visual_u_1_1_private_1_1_f_fast_move_async_worker.png -------------------------------------------------------------------------------- /docs/search/functions_1.js: -------------------------------------------------------------------------------- 1 | var searchData= 2 | [ 3 | ['begindestroy_0',['BeginDestroy',['../class_u_visual_controller.html#a4c5d53d4cdb84d15bd6a0257fc52bb20',1,'UVisualController']]] 4 | ]; 5 | -------------------------------------------------------------------------------- /docs/class_i_visual_controller_interface.js: -------------------------------------------------------------------------------- 1 | var class_i_visual_controller_interface = 2 | [ 3 | [ "GetVisualController", "class_i_visual_controller_interface.html#acd441a269fcf471e06d19c172de12c83", null ] 4 | ]; -------------------------------------------------------------------------------- /Source/VisualU/Private/InfoAssignable.cpp: -------------------------------------------------------------------------------- 1 | // Copyright (c) 2025 Evgeny Shustov 2 | 3 | 4 | #include "InfoAssignable.h" 5 | 6 | FVisualInfo::FVisualInfo() = default; 7 | 8 | FVisualInfo::~FVisualInfo() = default; 9 | -------------------------------------------------------------------------------- /Source/VisualU/Private/VisualImageBase.cpp: -------------------------------------------------------------------------------- 1 | // Copyright (c) 2025 Evgeny Shustov 2 | 3 | 4 | #include "VisualImageBase.h" 5 | 6 | UVisualImageBase::UVisualImageBase(const FObjectInitializer& ObjectInitializer) : UWidget(ObjectInitializer) 7 | { 8 | } 9 | -------------------------------------------------------------------------------- /Source/VisualU/Private/VisualControllerInterface.cpp: -------------------------------------------------------------------------------- 1 | // Copyright (c) 2025 Evgeny Shustov 2 | 3 | 4 | #include "VisualControllerInterface.h" 5 | 6 | // Add default functionality here for any IVisualControllerInterface functions that are not pure virtual. 7 | -------------------------------------------------------------------------------- /docs/search/classes_2.js: -------------------------------------------------------------------------------- 1 | var searchData= 2 | [ 3 | ['iinfoassignable_0',['IInfoAssignable',['../class_i_info_assignable.html',1,'']]], 4 | ['ivisualcontrollerinterface_1',['IVisualControllerInterface',['../class_i_visual_controller_interface.html',1,'']]] 5 | ]; 6 | -------------------------------------------------------------------------------- /docs/class_f_visual_u_module.js: -------------------------------------------------------------------------------- 1 | var class_f_visual_u_module = 2 | [ 3 | [ "ShutdownModule", "class_f_visual_u_module.html#a26015f0a0bc10a5efa7fda642b2c8010", null ], 4 | [ "StartupModule", "class_f_visual_u_module.html#a7ef37b2c20d8cada28da5521fd5699a7", null ] 5 | ]; -------------------------------------------------------------------------------- /docs/search/functions_9.js: -------------------------------------------------------------------------------- 1 | var searchData= 2 | [ 3 | ['makecustomgeometry_0',['MakeCustomGeometry',['../class_s_visual_image.html#a5a6de8778f47541e84d76640b96e1baa',1,'SVisualImage::MakeCustomGeometry()'],['../class_s_visual_image_base.html#adbab3e3688c45b041e89da19ceb8709b',1,'SVisualImageBase::MakeCustomGeometry()']]] 4 | ]; 5 | -------------------------------------------------------------------------------- /docs/search/functions_3.js: -------------------------------------------------------------------------------- 1 | var searchData= 2 | [ 3 | ['deinitialize_0',['Deinitialize',['../class_u_visual_versioning_subsystem.html#ab93f84faf0151f581bcc6fad29435b77',1,'UVisualVersioningSubsystem']]], 4 | ['drawscene_1',['DrawScene',['../class_u_visual_renderer.html#ac9fdb53238e7e26929aabf31753744d9',1,'UVisualRenderer']]] 5 | ]; 6 | -------------------------------------------------------------------------------- /docs/search/functions_a.js: -------------------------------------------------------------------------------- 1 | var searchData= 2 | [ 3 | ['nativedestruct_0',['NativeDestruct',['../class_u_visual_renderer.html#a92aad92fbe9e0600c42922ad81fbae1d',1,'UVisualRenderer']]], 4 | ['nativeoninitialized_1',['NativeOnInitialized',['../class_u_visual_renderer.html#aa235aed796167a3087e03288a04c5b03',1,'UVisualRenderer']]] 5 | ]; 6 | -------------------------------------------------------------------------------- /Source/VisualU/Private/Scenario.cpp: -------------------------------------------------------------------------------- 1 | // Copyright (c) 2025 Evgeny Shustov 2 | 3 | 4 | #include "Scenario.h" 5 | 6 | FSprite::FSprite() : Position(ForceInit), ZOrder(ForceInit) {}; 7 | 8 | FBackground::FBackground() = default; 9 | 10 | FVisualScenarioInfo::FVisualScenarioInfo() = default; 11 | 12 | FScenario::FScenario() = default; 13 | -------------------------------------------------------------------------------- /docs/search/functions_11.js: -------------------------------------------------------------------------------- 1 | var searchData= 2 | [ 3 | ['visualizetocomponent_0',['VisualizeToComponent',['../class_u_visual_controller.html#a527c78c99a1031647e0253b42bd3088e',1,'UVisualController']]], 4 | ['visualizetoscreen_1',['VisualizeToScreen',['../class_u_visual_controller.html#af51339139fe620c44248bb699e0aca12',1,'UVisualController']]] 5 | ]; 6 | -------------------------------------------------------------------------------- /docs/struct_f_background.js: -------------------------------------------------------------------------------- 1 | var struct_f_background = 2 | [ 3 | [ "ToString", "struct_f_background.html#ae8c64926c63e62ce38d1c42d724e4c4f", null ], 4 | [ "BackgroundArtInfo", "struct_f_background.html#a24ae2bed9091b63c7e740ac6b1561072", null ], 5 | [ "TransitionMaterial", "struct_f_background.html#a7d852002f7a301bc55257cf118ae8cc8", null ] 6 | ]; -------------------------------------------------------------------------------- /Source/VisualU/Private/VisualUCustomVersion.cpp: -------------------------------------------------------------------------------- 1 | // Copyright (c) 2025 Evgeny Shustov 2 | 3 | 4 | #include "VisualUCustomVersion.h" 5 | #include "UObject/DevObjectVersion.h" 6 | 7 | const FGuid FVisualUCustomVersion::GUID(0xDA06AED2, 0xFF31AE8C, 0x38A2C1BE, 0x6DAA21EC); 8 | 9 | FDevVersionRegistration GVisualUCustomVersionRegistration(FVisualUCustomVersion::GUID, FVisualUCustomVersion::LatestVersion, TEXT("VisualUVersion")); 10 | -------------------------------------------------------------------------------- /docs/search/functions_10.js: -------------------------------------------------------------------------------- 1 | var searchData= 2 | [ 3 | ['updatesequence_0',['UpdateSequence',['../class_s_visual_image.html#ade6908c66fa0da03b2ab839689b7a080',1,'SVisualImage']]], 4 | ['uproperty_1',['UPROPERTY',['../struct_f_sprite.html#a6fe2c8dd0679188caa2b7402ab0eb4c5',1,'FSprite']]], 5 | ['uvisualimagebase_2',['UVisualImageBase',['../class_u_visual_image_base.html#af9cb3714f867095d34bcd4b4504ce35a',1,'UVisualImageBase']]] 6 | ]; 7 | -------------------------------------------------------------------------------- /docs/class_u_m_e___transition_parameter2_d.js: -------------------------------------------------------------------------------- 1 | var class_u_m_e___transition_parameter2_d = 2 | [ 3 | [ "AParameterName", "class_u_m_e___transition_parameter2_d.html#ad1b892ac4e671fe1ddc78fd17e8c2ab8", null ], 4 | [ "bIsSecondTransition", "class_u_m_e___transition_parameter2_d.html#a9b33574aac624109d32317ef733ce85c", null ], 5 | [ "BParameterName", "class_u_m_e___transition_parameter2_d.html#a3982eb0b445bd7001fdf39ab44f9dc63", null ] 6 | ]; -------------------------------------------------------------------------------- /docs/search/functions_6.js: -------------------------------------------------------------------------------- 1 | var searchData= 2 | [ 3 | ['haschoice_0',['HasChoice',['../struct_f_scenario.html#a92e73e2d4004acd57beb35393dbc5369',1,'FScenario']]], 4 | ['hastransition_1',['HasTransition',['../struct_f_scenario.html#a4c08bdf223c01bfc66dfbaa1f30d4b4c',1,'FScenario']]], 5 | ['hastypewriterfinished_2',['HasTypewriterFinished',['../class_u_visual_text_block.html#a462795416025b4ef44c3a127b5c90840',1,'UVisualTextBlock']]] 6 | ]; 7 | -------------------------------------------------------------------------------- /docs/search/variables_8.js: -------------------------------------------------------------------------------- 1 | var searchData= 2 | [ 3 | ['letterplaytime_0',['LetterPlayTime',['../class_u_visual_text_block.html#ac11fbfd7f6f94270d3059cb30b915ec3',1,'UVisualTextBlock']]], 4 | ['lettertimer_1',['LetterTimer',['../class_u_visual_text_block.html#a443c1539f33a7a79be6872860064752c',1,'UVisualTextBlock']]], 5 | ['line_2',['Line',['../struct_f_visual_scenario_info.html#a46c00b31f03e76c8a9ffaee0fbf056d7',1,'FVisualScenarioInfo']]] 6 | ]; 7 | -------------------------------------------------------------------------------- /Config/FilterPlugin.ini: -------------------------------------------------------------------------------- 1 | [FilterPlugin] 2 | ; This section lists additional files which will be packaged along with your plugin. Paths should be listed relative to the root plugin directory, and 3 | ; may include "...", "*", and "?" wildcards to match directories, files, and individual characters respectively. 4 | ; 5 | ; Examples: 6 | ; /README.txt 7 | ; /Extras/... 8 | ; /Binaries/ThirdParty/*.dll 9 | /Config/DefaultPlugins.ini 10 | /docs/... -------------------------------------------------------------------------------- /docs/search/variables_4.js: -------------------------------------------------------------------------------- 1 | var searchData= 2 | [ 3 | ['endholdtime_0',['EndHoldTime',['../class_u_visual_text_block.html#a848f39c0004a6199772727fe61fb8518',1,'UVisualTextBlock']]], 4 | ['exhaustedscenes_1',['ExhaustedScenes',['../class_u_visual_controller.html#ac43fdbcd42d094c7afc963bfc822c734',1,'UVisualController']]], 5 | ['expression_2',['Expression',['../struct_f_visual_image_info.html#a892c3729d99eb50ed752220475020a4a',1,'FVisualImageInfo']]] 6 | ]; 7 | -------------------------------------------------------------------------------- /docs/search/variables_10.js: -------------------------------------------------------------------------------- 1 | var searchData= 2 | [ 3 | ['versions_0',['Versions',['../class_u_visual_versioning_subsystem.html#a7aa92d508f06504e7271cc7c9d96e088',1,'UVisualVersioningSubsystem']]], 4 | ['visualimage_1',['VisualImage',['../class_s_visual_socket.html#a9e9795157e001d817e0e12bc8e1ff47f',1,'SVisualSocket']]], 5 | ['visualimageslate_2',['VisualImageSlate',['../class_u_visual_image.html#ab233653f890d0bdc7c20ff7685d96f8e',1,'UVisualImage']]] 6 | ]; 7 | -------------------------------------------------------------------------------- /docs/search/variables_a.js: -------------------------------------------------------------------------------- 1 | var searchData= 2 | [ 3 | ['nextscenehandle_0',['NextSceneHandle',['../class_u_visual_controller.html#acdb1cd8fde61538d7c9819257455c459',1,'UVisualController']]], 4 | ['node_1',['Node',['../class_u_visual_controller.html#a0eed69a32e0d273d9c1dce4a707d6d54',1,'UVisualController']]], 5 | ['nodereferencekeeper_2',['NodeReferenceKeeper',['../class_u_visual_controller.html#a7d06e50e359b94c2f92128e6f3bc88ee',1,'UVisualController']]] 6 | ]; 7 | -------------------------------------------------------------------------------- /docs/class_u_visual_sprite.js: -------------------------------------------------------------------------------- 1 | var class_u_visual_sprite = 2 | [ 3 | [ "AssignSpriteInfo", "class_u_visual_sprite.html#a0fa01c9d6eb5b9f12cb49715384bf07f", null ], 4 | [ "ReleaseSlateResources", "class_u_visual_sprite.html#a966c751cfaee68607ce703a8c775cc50", null ], 5 | [ "OnSpriteAppear", "class_u_visual_sprite.html#af9798f6d6e1fa042623ee2e6fb27be11", null ], 6 | [ "OnSpriteDisappear", "class_u_visual_sprite.html#a3606eae439eff9a6cc54b424d6c81d15", null ] 7 | ]; -------------------------------------------------------------------------------- /docs/search/functions_8.js: -------------------------------------------------------------------------------- 1 | var searchData= 2 | [ 3 | ['loadscene_0',['LoadScene',['../class_u_visual_controller.html#af57409462cef6195928971101e6a884c',1,'UVisualController']]], 4 | ['loadsceneasync_1',['LoadSceneAsync',['../class_u_visual_controller.html#a38b41b254094fc786c99412d416d626e',1,'UVisualController']]], 5 | ['loadvisualu_2',['LoadVisualU',['../class_u_visual_u_blueprint_statics.html#a1adb505d36d6b9563abe2e04b8b9da19',1,'UVisualUBlueprintStatics']]] 6 | ]; 7 | -------------------------------------------------------------------------------- /Config/DefaultPlugins.ini: -------------------------------------------------------------------------------- 1 | 2 | 3 | [/Script/VisualU.VisualUSettings] 4 | FirstDataTable=None 5 | TransitionMPC=/VisualU/Misc/TransitionParamCollection.TransitionParamCollection 6 | TransitionDuration=1.000000 7 | AParameterName=Transition 1 8 | BParameterName=Transition 2 9 | +ScenarioFlagsNameOverrides=Custom 1 10 | +ScenarioFlagsNameOverrides=Custom 2 11 | +ScenarioFlagsNameOverrides=Custom 3 12 | +ScenarioFlagsNameOverrides=Custom 4 13 | +ScenarioFlagsNameOverrides=Custom 5 14 | 15 | -------------------------------------------------------------------------------- /Source/VisualU/Public/VisualUCustomVersion.h: -------------------------------------------------------------------------------- 1 | // Copyright (c) 2025 Evgeny Shustov 2 | 3 | #pragma once 4 | 5 | #include "CoreMinimal.h" 6 | #include "Misc/Guid.h" 7 | 8 | struct VISUALU_API FVisualUCustomVersion 9 | { 10 | public: 11 | FVisualUCustomVersion() = delete; 12 | 13 | enum Type 14 | { 15 | //-------------------------------------------------------------- 16 | VersionPlusOne, 17 | LatestVersion = VersionPlusOne - 1 18 | }; 19 | 20 | const static FGuid GUID; 21 | }; 22 | -------------------------------------------------------------------------------- /docs/search/variables_7.js: -------------------------------------------------------------------------------- 1 | var searchData= 2 | [ 3 | ['imagedesiredposition_0',['ImageDesiredPosition',['../class_s_visual_socket.html#a7896c1a1c1dbeffa8066fec4226cd006',1,'SVisualSocket::ImageDesiredPosition'],['../class_u_visual_socket.html#a963208d8dfe3c4c594e088e81667d694',1,'UVisualSocket::ImageDesiredPosition']]], 4 | ['index_1',['Index',['../struct_f_scenario.html#ae32b136b41b749c0b575672066e1812b',1,'FScenario']]], 5 | ['info_2',['Info',['../struct_f_scenario.html#add30ca76b5404432c2e0ca01e03338ed',1,'FScenario']]] 6 | ]; 7 | -------------------------------------------------------------------------------- /Source/VisualUEditor/Public/VisualUEditor.h: -------------------------------------------------------------------------------- 1 | // Copyright (c) 2025 Evgeny Shustov 2 | 3 | #pragma once 4 | 5 | #include "CoreMinimal.h" 6 | #include "Modules/ModuleManager.h" 7 | 8 | /** 9 | * VisualU plugin editor module. 10 | */ 11 | class FVisualUEditorModule : public IModuleInterface 12 | { 13 | /** 14 | * Registers custom property layout for FSprite. 15 | */ 16 | virtual void StartupModule() override; 17 | 18 | /** 19 | * Unregisters custom property layout for FSprite. 20 | */ 21 | virtual void ShutdownModule() override; 22 | 23 | }; -------------------------------------------------------------------------------- /docs/search/classes_3.js: -------------------------------------------------------------------------------- 1 | var searchData= 2 | [ 3 | ['sbackgroundvisualimage_0',['SBackgroundVisualImage',['../class_s_background_visual_image.html',1,'']]], 4 | ['svisualimage_1',['SVisualImage',['../class_s_visual_image.html',1,'']]], 5 | ['svisualimagebase_2',['SVisualImageBase',['../class_s_visual_image_base.html',1,'']]], 6 | ['svisualimagebase_3c_20svisualimage_20_3e_3',['SVisualImageBase< SVisualImage >',['../class_s_visual_image_base.html',1,'']]], 7 | ['svisualsocket_4',['SVisualSocket',['../class_s_visual_socket.html',1,'']]] 8 | ]; 9 | -------------------------------------------------------------------------------- /docs/search/variables_3.js: -------------------------------------------------------------------------------- 1 | var searchData= 2 | [ 3 | ['debugscenehandles_0',['DebugSceneHandles',['../class_u_visual_controller.html#ab5c17e26799bd1034aa43c5e16d25c5f',1,'UVisualController']]], 4 | ['desiredscale_1',['DesiredScale',['../struct_f_visual_image_info.html#a574b5d7c205477a5c42461e1f46f24d8',1,'FVisualImageInfo::DesiredScale'],['../class_u_visual_image.html#a0e3621c8bcf4486f90fcad4c29343915',1,'UVisualImage::DesiredScale']]], 5 | ['drawhandle_2',['DrawHandle',['../class_u_visual_renderer.html#a319f0976168ea69fd070aa02cf9b92a8',1,'UVisualRenderer']]] 6 | ]; 7 | -------------------------------------------------------------------------------- /docs/search/searchdata.js: -------------------------------------------------------------------------------- 1 | var indexSectionsWithContent = 2 | { 3 | 0: "abcdefghilmnoprstuv", 4 | 1: "fhisuv", 5 | 2: "e", 6 | 3: "abcdfghilmnoprstuv", 7 | 4: "abcdefhilmnoprstv", 8 | 5: "h" 9 | }; 10 | 11 | var indexSectionNames = 12 | { 13 | 0: "all", 14 | 1: "classes", 15 | 2: "namespaces", 16 | 3: "functions", 17 | 4: "variables", 18 | 5: "concepts" 19 | }; 20 | 21 | var indexSectionLabels = 22 | { 23 | 0: "All", 24 | 1: "Classes", 25 | 2: "Namespaces", 26 | 3: "Functions", 27 | 4: "Variables", 28 | 5: "Concepts" 29 | }; 30 | 31 | -------------------------------------------------------------------------------- /docs/search/all_4.js: -------------------------------------------------------------------------------- 1 | var searchData= 2 | [ 3 | ['endholdtime_0',['EndHoldTime',['../class_u_visual_text_block.html#a848f39c0004a6199772727fe61fb8518',1,'UVisualTextBlock']]], 4 | ['evisualcontrollerdirection_1',['EVisualControllerDirection',['../namespace_e_visual_controller_direction.html',1,'']]], 5 | ['exhaustedscenes_2',['ExhaustedScenes',['../class_u_visual_controller.html#ac43fdbcd42d094c7afc963bfc822c734',1,'UVisualController']]], 6 | ['expression_3',['Expression',['../struct_f_visual_image_info.html#a892c3729d99eb50ed752220475020a4a',1,'FVisualImageInfo']]] 7 | ]; 8 | -------------------------------------------------------------------------------- /docs/struct_f_sprite.js: -------------------------------------------------------------------------------- 1 | var struct_f_sprite = 2 | [ 3 | [ "ToString", "struct_f_sprite.html#a58f57f3792dccc4dcdb7865ce348c0d7", null ], 4 | [ "UPROPERTY", "struct_f_sprite.html#a6fe2c8dd0679188caa2b7402ab0eb4c5", null ], 5 | [ "Anchors", "struct_f_sprite.html#a05cee273736dbe3caf0d273d6b402282", null ], 6 | [ "Position", "struct_f_sprite.html#a2c809693994e7587afb0a223bf361344", null ], 7 | [ "SpriteClass", "struct_f_sprite.html#ae692ae45e3b90c7afae286e41a1d6263", null ], 8 | [ "SpriteInfo", "struct_f_sprite.html#a58df0d12f88a507c9a672e8872cd12a8", null ] 9 | ]; -------------------------------------------------------------------------------- /docs/minus.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /docs/minusd.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /docs/search/variables_9.js: -------------------------------------------------------------------------------- 1 | var searchData= 2 | [ 3 | ['maxletterindex_0',['MaxLetterIndex',['../class_u_visual_text_block.html#a927d710c7d638af2f4302fcbc5cb7cf4',1,'UVisualTextBlock']]], 4 | ['mirrorscale_1',['MirrorScale',['../class_s_visual_image.html#aade76555cd8d1b8869048871e23b57f8',1,'SVisualImage::MirrorScale'],['../struct_f_visual_image_info.html#ae9dd9621ac11a3cd2e2dff62ebf84643',1,'FVisualImageInfo::MirrorScale'],['../class_u_visual_image.html#acff966245652515ef1ec12e2220186d6',1,'UVisualImage::MirrorScale']]], 5 | ['mode_2',['Mode',['../class_u_visual_controller.html#ac066da2cd71319b29a957843f24826fd',1,'UVisualController']]] 6 | ]; 7 | -------------------------------------------------------------------------------- /Source/VisualU/Public/VisualImageBase.h: -------------------------------------------------------------------------------- 1 | // Copyright (c) 2025 Evgeny Shustov 2 | 3 | #pragma once 4 | 5 | #include "CoreMinimal.h" 6 | #include "Components/Widget.h" 7 | #include "InfoAssignable.h" 8 | #include "VisualImageBase.generated.h" 9 | 10 | /** 11 | * Base class for UMG widgets that display slate brushes. 12 | * 13 | * @see IInfoAssignable 14 | */ 15 | UCLASS(abstract) 16 | class VISUALU_API UVisualImageBase : public UWidget, public IInfoAssignable 17 | { 18 | GENERATED_BODY() 19 | 20 | protected: 21 | /** 22 | * Abstract, cannot be instantiated. 23 | */ 24 | UVisualImageBase(const FObjectInitializer& ObjectInitializer); 25 | 26 | }; 27 | -------------------------------------------------------------------------------- /docs/search/functions_4.js: -------------------------------------------------------------------------------- 1 | var searchData= 2 | [ 3 | ['fbreakvisualtextblockdecorator_0',['FBreakVisualTextBlockDecorator',['../class_f_break_visual_text_block_decorator.html#aab0dcf6343afbad98793fdbf34454208',1,'FBreakVisualTextBlockDecorator']]], 4 | ['forcestoptransition_1',['ForceStopTransition',['../class_u_visual_renderer.html#a02b2a47d0b951889f81a14e6e2746819',1,'UVisualRenderer']]], 5 | ['forcetypewritetoend_2',['ForceTypewriteToEnd',['../class_u_visual_text_block.html#a7ccaca4376973c2709143c36db431be6',1,'UVisualTextBlock']]], 6 | ['foreachsprite_3',['ForEachSprite',['../class_u_visual_renderer.html#ab4d851f067c0bca04b4c0b477c80a954',1,'UVisualRenderer']]] 7 | ]; 8 | -------------------------------------------------------------------------------- /docs/class_u_visual_u_settings.js: -------------------------------------------------------------------------------- 1 | var class_u_visual_u_settings = 2 | [ 3 | [ "PostInitProperties", "class_u_visual_u_settings.html#ad57500a068574c11f418cab5bfe681fb", null ], 4 | [ "AParameterName", "class_u_visual_u_settings.html#ab3a4ac1a265201fa54b4e1b1bc7af876", null ], 5 | [ "BParameterName", "class_u_visual_u_settings.html#ad0809319b9846093ddf8e30df6882fdc", null ], 6 | [ "FirstDataTable", "class_u_visual_u_settings.html#a8cdc1e64076400180b071bf18baa8d1f", null ], 7 | [ "TransitionDuration", "class_u_visual_u_settings.html#a7fbed77e7808b3c971dd2a2898ce6f31", null ], 8 | [ "TransitionMPC", "class_u_visual_u_settings.html#a0797ca53cc101414db786f0d5cfb2085", null ] 9 | ]; -------------------------------------------------------------------------------- /Source/VisualUEditor/Private/VisualUSettingsCustomization.h: -------------------------------------------------------------------------------- 1 | // Copyright (c) 2025 Evgeny Shustov 2 | 3 | #pragma once 4 | 5 | #include "CoreMinimal.h" 6 | #include "IDetailCustomization.h" 7 | 8 | /** 9 | * Adds custom button to the Visual Settings. 10 | */ 11 | class FVisualUSettingsCustomization : public IDetailCustomization 12 | { 13 | public: 14 | FVisualUSettingsCustomization(); 15 | 16 | VISUALUEDITOR_API static TSharedRef MakeInstance(); 17 | 18 | /** 19 | * Adds custom button to the Visual Settings. 20 | * 21 | * @param DetailBuilder handle to perform customization 22 | */ 23 | virtual void CustomizeDetails(IDetailLayoutBuilder& DetailBuilder) override; 24 | }; 25 | -------------------------------------------------------------------------------- /Source/VisualUEditor/VisualUEditor.Build.cs: -------------------------------------------------------------------------------- 1 | // Copyright (c) 2025 Evgeny Shustov 2 | 3 | using UnrealBuildTool; 4 | 5 | public class VisualUEditor : ModuleRules 6 | { 7 | public VisualUEditor(ReadOnlyTargetRules Target) : base(Target) 8 | { 9 | PCHUsage = ModuleRules.PCHUsageMode.UseExplicitOrSharedPCHs; 10 | 11 | PublicDependencyModuleNames.AddRange( 12 | new string[] 13 | { 14 | "VisualU" 15 | } 16 | ); 17 | 18 | PrivateDependencyModuleNames.AddRange( 19 | new string[] 20 | { 21 | "Core", 22 | "CoreUObject", 23 | "Engine", 24 | "Slate", 25 | "SlateCore", 26 | "PropertyEditor" 27 | } 28 | ); 29 | 30 | } 31 | } 32 | -------------------------------------------------------------------------------- /docs/search/all_b.js: -------------------------------------------------------------------------------- 1 | var searchData= 2 | [ 3 | ['nativedestruct_0',['NativeDestruct',['../class_u_visual_renderer.html#a92aad92fbe9e0600c42922ad81fbae1d',1,'UVisualRenderer']]], 4 | ['nativeoninitialized_1',['NativeOnInitialized',['../class_u_visual_renderer.html#aa235aed796167a3087e03288a04c5b03',1,'UVisualRenderer']]], 5 | ['nextscenehandle_2',['NextSceneHandle',['../class_u_visual_controller.html#acdb1cd8fde61538d7c9819257455c459',1,'UVisualController']]], 6 | ['node_3',['Node',['../class_u_visual_controller.html#a0eed69a32e0d273d9c1dce4a707d6d54',1,'UVisualController']]], 7 | ['nodereferencekeeper_4',['NodeReferenceKeeper',['../class_u_visual_controller.html#a7d06e50e359b94c2f92128e6f3bc88ee',1,'UVisualController']]] 8 | ]; 9 | -------------------------------------------------------------------------------- /docs/class_u_background_visual_image.js: -------------------------------------------------------------------------------- 1 | var class_u_background_visual_image = 2 | [ 3 | [ "IsTransitioning", "class_u_background_visual_image.html#a573e1e49c3652720380586ef003edc70", null ], 4 | [ "PlayTransition", "class_u_background_visual_image.html#aecfe08d9e89bc1f8069445d20d17fb39", null ], 5 | [ "PlayTransition", "class_u_background_visual_image.html#a36a71c9f4aa7016e8bea36a51e1e4790", null ], 6 | [ "RebuildWidget", "class_u_background_visual_image.html#a139cd29b15e428b86ba9bba91a18157c", null ], 7 | [ "ReleaseSlateResources", "class_u_background_visual_image.html#a3dd805ae503a7ad6ee181813d2ff9b05", null ], 8 | [ "StopTransition", "class_u_background_visual_image.html#a63d9d6811128e7e91c81df14529d07fa", null ] 9 | ]; -------------------------------------------------------------------------------- /docs/plus.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | -------------------------------------------------------------------------------- /docs/plusd.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | -------------------------------------------------------------------------------- /docs/search/all_7.js: -------------------------------------------------------------------------------- 1 | var searchData= 2 | [ 3 | ['haschoice_0',['HasChoice',['../struct_f_scenario.html#a92e73e2d4004acd57beb35393dbc5369',1,'FScenario']]], 4 | ['hasmemberoftype_1',['HasMemberOfType',['../concept_has_member_of_type.html',1,'']]], 5 | ['hasmemberoftypeimpl_2',['HasMemberOfTypeImpl',['../class_has_member_of_type_impl.html',1,'']]], 6 | ['hastransition_3',['HasTransition',['../struct_f_scenario.html#a4c08bdf223c01bfc66dfbaa1f30d4b4c',1,'FScenario']]], 7 | ['hastypewriterfinished_4',['HasTypewriterFinished',['../class_u_visual_text_block.html#a462795416025b4ef44c3a127b5c90840',1,'UVisualTextBlock']]], 8 | ['head_5',['Head',['../class_u_visual_controller.html#aa3947b01d044fcdbb3266e5434ea3c59',1,'UVisualController']]] 9 | ]; 10 | -------------------------------------------------------------------------------- /docs/search/functions_b.js: -------------------------------------------------------------------------------- 1 | var searchData= 2 | [ 3 | ['onanimationfinished_5fimplementation_0',['OnAnimationFinished_Implementation',['../class_u_visual_renderer.html#a3232e562687f19dfe3c5d7757f011d34',1,'UVisualRenderer']]], 4 | ['onarrangechildren_1',['OnArrangeChildren',['../class_s_visual_socket.html#a90455861344db96645c36b9502bdbff4',1,'SVisualSocket']]], 5 | ['onpaint_2',['OnPaint',['../class_s_visual_image_base.html#a1e24ef9ab5c07fced51bcdd73a026e3f',1,'SVisualImageBase']]], 6 | ['onplayletter_3',['OnPlayLetter',['../class_u_visual_text_block.html#ac9a22631d929a4f4d86fa3579055cd13',1,'UVisualTextBlock']]], 7 | ['ontypewriterfinished_4',['OnTypewriterFinished',['../class_u_visual_text_block.html#aa47702ec6ff3baba9bce10bc3f199efc',1,'UVisualTextBlock']]] 8 | ]; 9 | -------------------------------------------------------------------------------- /docs/class_f_break_visual_text_block_decorator.js: -------------------------------------------------------------------------------- 1 | var class_f_break_visual_text_block_decorator = 2 | [ 3 | [ "FBreakVisualTextBlockDecorator", "class_f_break_visual_text_block_decorator.html#aab0dcf6343afbad98793fdbf34454208", null ], 4 | [ "CreateDecoratorText", "class_f_break_visual_text_block_decorator.html#ab8c4035592a0b88d181f7f763726cd33", null ], 5 | [ "Supports", "class_f_break_visual_text_block_decorator.html#a668190548c9959075e33602c36032207", null ], 6 | [ "BreakTimer", "class_f_break_visual_text_block_decorator.html#a0c6bfe7bab5c848dfd96f0ab24fc5f42", null ], 7 | [ "bTagDiscovered", "class_f_break_visual_text_block_decorator.html#a352f410a015f4e6cd9286676423f81db", null ], 8 | [ "TagPosition", "class_f_break_visual_text_block_decorator.html#aa11d94ef37b093a86e5abc43c72fb4f9", null ] 9 | ]; -------------------------------------------------------------------------------- /docs/class_s_visual_text_block.js: -------------------------------------------------------------------------------- 1 | var class_s_visual_text_block = 2 | [ 3 | [ "SVisualTextBlock", "class_s_visual_text_block.html#adbbcd0dbc3c0c7a8db21d52d4682da72", null ], 4 | [ "CacheDesiredSize", "class_s_visual_text_block.html#a4792fa9022afae48279e24c4598db4c3", null ], 5 | [ "ComputeDesiredSize", "class_s_visual_text_block.html#a9e5a4bd01868727c1a9d33f744e46f07", null ], 6 | [ "GetTextInternal", "class_s_visual_text_block.html#a19f11c754b530f1917c15c28d6c088e2", null ], 7 | [ "MakeTextAttribute", "class_s_visual_text_block.html#a5ddcf50c5cebfd40e9f4a70e2eec00eb", null ], 8 | [ "bIsComputingDesiredSize", "class_s_visual_text_block.html#a8650f0ed01317d592ae61ada87c75f9f", null ], 9 | [ "CachedDesiredSize", "class_s_visual_text_block.html#ae2aec7153dd4e0a71af780b154d91cdf", null ] 10 | ]; -------------------------------------------------------------------------------- /docs/search/all_12.js: -------------------------------------------------------------------------------- 1 | var searchData= 2 | [ 3 | ['versions_0',['Versions',['../class_u_visual_versioning_subsystem.html#a7aa92d508f06504e7271cc7c9d96e088',1,'UVisualVersioningSubsystem']]], 4 | ['visualimage_1',['VisualImage',['../class_s_visual_socket.html#a9e9795157e001d817e0e12bc8e1ff47f',1,'SVisualSocket']]], 5 | ['visualimageslate_2',['VisualImageSlate',['../class_u_visual_image.html#ab233653f890d0bdc7c20ff7685d96f8e',1,'UVisualImage']]], 6 | ['visualizetocomponent_3',['VisualizeToComponent',['../class_u_visual_controller.html#a527c78c99a1031647e0253b42bd3088e',1,'UVisualController']]], 7 | ['visualizetoscreen_4',['VisualizeToScreen',['../class_u_visual_controller.html#af51339139fe620c44248bb699e0aca12',1,'UVisualController']]], 8 | ['visualu_5',['VisualU',['../class_visual_u.html',1,'']]] 9 | ]; 10 | -------------------------------------------------------------------------------- /docs/search/all_3.js: -------------------------------------------------------------------------------- 1 | var searchData= 2 | [ 3 | ['debugscenehandles_0',['DebugSceneHandles',['../class_u_visual_controller.html#ab5c17e26799bd1034aa43c5e16d25c5f',1,'UVisualController']]], 4 | ['deinitialize_1',['Deinitialize',['../class_u_visual_versioning_subsystem.html#ab93f84faf0151f581bcc6fad29435b77',1,'UVisualVersioningSubsystem']]], 5 | ['desiredscale_2',['DesiredScale',['../struct_f_visual_image_info.html#a574b5d7c205477a5c42461e1f46f24d8',1,'FVisualImageInfo::DesiredScale'],['../class_u_visual_image.html#a0e3621c8bcf4486f90fcad4c29343915',1,'UVisualImage::DesiredScale']]], 6 | ['drawhandle_3',['DrawHandle',['../class_u_visual_renderer.html#a319f0976168ea69fd070aa02cf9b92a8',1,'UVisualRenderer']]], 7 | ['drawscene_4',['DrawScene',['../class_u_visual_renderer.html#ac9fdb53238e7e26929aabf31753744d9',1,'UVisualRenderer']]] 8 | ]; 9 | -------------------------------------------------------------------------------- /docs/search/variables_0.js: -------------------------------------------------------------------------------- 1 | var searchData= 2 | [ 3 | ['anchors_0',['Anchors',['../struct_f_sprite.html#a05cee273736dbe3caf0d273d6b402282',1,'FSprite']]], 4 | ['aparametername_1',['AParameterName',['../class_u_m_e___transition_parameter2_d.html#ad1b892ac4e671fe1ddc78fd17e8c2ab8',1,'UME_TransitionParameter2D::AParameterName'],['../class_u_visual_u_settings.html#ab3a4ac1a265201fa54b4e1b1bc7af876',1,'UVisualUSettings::AParameterName']]], 5 | ['author_2',['Author',['../struct_f_visual_scenario_info.html#a8cd0b66a7abbe5174da0b84394adf9cf',1,'FVisualScenarioInfo']]], 6 | ['automovedelay_3',['AutoMoveDelay',['../class_u_visual_controller.html#adbc480c4fcf508d55087fb1a96686c23',1,'UVisualController']]], 7 | ['automovehandle_4',['AutoMoveHandle',['../class_u_visual_controller.html#aa3578789a60bf274939c1ad02438beba',1,'UVisualController']]] 8 | ]; 9 | -------------------------------------------------------------------------------- /docs/search/all_9.js: -------------------------------------------------------------------------------- 1 | var searchData= 2 | [ 3 | ['letterplaytime_0',['LetterPlayTime',['../class_u_visual_text_block.html#ac11fbfd7f6f94270d3059cb30b915ec3',1,'UVisualTextBlock']]], 4 | ['lettertimer_1',['LetterTimer',['../class_u_visual_text_block.html#a443c1539f33a7a79be6872860064752c',1,'UVisualTextBlock']]], 5 | ['line_2',['Line',['../struct_f_visual_scenario_info.html#a46c00b31f03e76c8a9ffaee0fbf056d7',1,'FVisualScenarioInfo']]], 6 | ['loadscene_3',['LoadScene',['../class_u_visual_controller.html#af57409462cef6195928971101e6a884c',1,'UVisualController']]], 7 | ['loadsceneasync_4',['LoadSceneAsync',['../class_u_visual_controller.html#a38b41b254094fc786c99412d416d626e',1,'UVisualController']]], 8 | ['loadvisualu_5',['LoadVisualU',['../class_u_visual_u_blueprint_statics.html#a1adb505d36d6b9563abe2e04b8b9da19',1,'UVisualUBlueprintStatics']]] 9 | ]; 10 | -------------------------------------------------------------------------------- /docs/functions_dup.js: -------------------------------------------------------------------------------- 1 | var functions_dup = 2 | [ 3 | [ "a", "functions.html", null ], 4 | [ "b", "functions_b.html", null ], 5 | [ "c", "functions_c.html", null ], 6 | [ "d", "functions_d.html", null ], 7 | [ "e", "functions_e.html", null ], 8 | [ "f", "functions_f.html", null ], 9 | [ "g", "functions_g.html", null ], 10 | [ "h", "functions_h.html", null ], 11 | [ "i", "functions_i.html", null ], 12 | [ "l", "functions_l.html", null ], 13 | [ "m", "functions_m.html", null ], 14 | [ "n", "functions_n.html", null ], 15 | [ "o", "functions_o.html", null ], 16 | [ "p", "functions_p.html", null ], 17 | [ "r", "functions_r.html", null ], 18 | [ "s", "functions_s.html", null ], 19 | [ "t", "functions_t.html", null ], 20 | [ "u", "functions_u.html", null ], 21 | [ "v", "functions_v.html", null ] 22 | ]; -------------------------------------------------------------------------------- /docs/struct_f_visual_image_info.js: -------------------------------------------------------------------------------- 1 | var struct_f_visual_image_info = 2 | [ 3 | [ "Accept", "struct_f_visual_image_info.html#a76b8fefabbb8297d65470f2373caa35e", null ], 4 | [ "ToString", "struct_f_visual_image_info.html#a22384b4ec4c8d8685757624663116212", null ], 5 | [ "bAnimate", "struct_f_visual_image_info.html#a36f490704c6b20fb5ea881e8f7019053", null ], 6 | [ "ColorAndOpacity", "struct_f_visual_image_info.html#ade9016ed50378903d2ce419b368a706e", null ], 7 | [ "DesiredScale", "struct_f_visual_image_info.html#a574b5d7c205477a5c42461e1f46f24d8", null ], 8 | [ "Expression", "struct_f_visual_image_info.html#a892c3729d99eb50ed752220475020a4a", null ], 9 | [ "FrameIndex", "struct_f_visual_image_info.html#ad519ce6516a1b84ff031a5adc9c9d5a6", null ], 10 | [ "MirrorScale", "struct_f_visual_image_info.html#ae9dd9621ac11a3cd2e2dff62ebf84643", null ] 11 | ]; -------------------------------------------------------------------------------- /Source/VisualU/Public/VisualControllerInterface.h: -------------------------------------------------------------------------------- 1 | // Copyright (c) 2025 Evgeny Shustov 2 | 3 | #pragma once 4 | 5 | #include "CoreMinimal.h" 6 | #include "UObject/Interface.h" 7 | #include "VisualControllerInterface.generated.h" 8 | 9 | class UVisualController; 10 | 11 | UINTERFACE(MinimalAPI) 12 | class UVisualControllerInterface : public UInterface 13 | { 14 | GENERATED_BODY() 15 | }; 16 | 17 | /** 18 | * Indicates that the class has access to UVisualController. 19 | * 20 | * @see UVisualController 21 | */ 22 | class VISUALU_API IVisualControllerInterface 23 | { 24 | GENERATED_BODY() 25 | 26 | public: 27 | /** 28 | * @return UVisualController from the class that implements the interface. 29 | */ 30 | UFUNCTION(BlueprintCallable, BlueprintNativeEvent, Category = "Visual Controller Interface") 31 | UVisualController* GetVisualController() const; 32 | 33 | }; 34 | -------------------------------------------------------------------------------- /docs/struct_f_visual_scenario_info.js: -------------------------------------------------------------------------------- 1 | var struct_f_visual_scenario_info = 2 | [ 3 | [ "Accept", "struct_f_visual_scenario_info.html#ac5109f6581abdf3c264e527f9a2c0c92", null ], 4 | [ "ToString", "struct_f_visual_scenario_info.html#ae1e8cdefc9e8f40229c8d7c728b74f27", null ], 5 | [ "Author", "struct_f_visual_scenario_info.html#a8cd0b66a7abbe5174da0b84394adf9cf", null ], 6 | [ "Background", "struct_f_visual_scenario_info.html#a61a6874ebc0f4967e7715ead12c3deef", null ], 7 | [ "Flags", "struct_f_visual_scenario_info.html#ab3403c17a61f0486648df5c986feba00", null ], 8 | [ "Line", "struct_f_visual_scenario_info.html#a46c00b31f03e76c8a9ffaee0fbf056d7", null ], 9 | [ "Sound", "struct_f_visual_scenario_info.html#a25c785a0bb204c7a39d65c77570db8ab", null ], 10 | [ "SpritesParams", "struct_f_visual_scenario_info.html#a8d486437155c6c7130483716b538a0f0", null ] 11 | ]; -------------------------------------------------------------------------------- /Source/VisualUEditor/Private/SpriteStructCustomization.h: -------------------------------------------------------------------------------- 1 | // Copyright (c) 2025 Evgeny Shustov 2 | 3 | #pragma once 4 | 5 | #include "CoreMinimal.h" 6 | #include "IPropertyTypeCustomization.h" 7 | 8 | class FDetailWidgetRow; 9 | class IDetailChildrenBuilder; 10 | class IPropertyHandle; 11 | 12 | /** 13 | * Custom slate widget for FVisualAnchors. 14 | */ 15 | class FSpriteStructCustomization : public IPropertyTypeCustomization 16 | { 17 | public: 18 | VISUALUEDITOR_API static TSharedRef MakeInstance(); 19 | 20 | virtual void CustomizeHeader(TSharedRef PropertyHandle, FDetailWidgetRow& HeaderRow, IPropertyTypeCustomizationUtils& CustomizationUtils) override; 21 | 22 | virtual void CustomizeChildren(TSharedRef PropertyHandle, IDetailChildrenBuilder& ChildBuilder, IPropertyTypeCustomizationUtils& CustomizationUtils) override; 23 | }; 24 | -------------------------------------------------------------------------------- /docs/search/all_a.js: -------------------------------------------------------------------------------- 1 | var searchData= 2 | [ 3 | ['makecustomgeometry_0',['MakeCustomGeometry',['../class_s_visual_image.html#a5a6de8778f47541e84d76640b96e1baa',1,'SVisualImage::MakeCustomGeometry()'],['../class_s_visual_image_base.html#adbab3e3688c45b041e89da19ceb8709b',1,'SVisualImageBase::MakeCustomGeometry()']]], 4 | ['maxletterindex_1',['MaxLetterIndex',['../class_u_visual_text_block.html#a927d710c7d638af2f4302fcbc5cb7cf4',1,'UVisualTextBlock']]], 5 | ['mirrorscale_2',['MirrorScale',['../class_s_visual_image.html#aade76555cd8d1b8869048871e23b57f8',1,'SVisualImage::MirrorScale'],['../struct_f_visual_image_info.html#ae9dd9621ac11a3cd2e2dff62ebf84643',1,'FVisualImageInfo::MirrorScale'],['../class_u_visual_image.html#acff966245652515ef1ec12e2220186d6',1,'UVisualImage::MirrorScale']]], 6 | ['mode_3',['Mode',['../class_u_visual_controller.html#ac066da2cd71319b29a957843f24826fd',1,'UVisualController']]] 7 | ]; 8 | -------------------------------------------------------------------------------- /docs/functions_func.js: -------------------------------------------------------------------------------- 1 | var functions_func = 2 | [ 3 | [ "a", "functions_func.html", null ], 4 | [ "b", "functions_func_b.html", null ], 5 | [ "c", "functions_func_c.html", null ], 6 | [ "d", "functions_func_d.html", null ], 7 | [ "f", "functions_func_f.html", null ], 8 | [ "g", "functions_func_g.html", null ], 9 | [ "h", "functions_func_h.html", null ], 10 | [ "i", "functions_func_i.html", null ], 11 | [ "l", "functions_func_l.html", null ], 12 | [ "m", "functions_func_m.html", null ], 13 | [ "n", "functions_func_n.html", null ], 14 | [ "o", "functions_func_o.html", null ], 15 | [ "p", "functions_func_p.html", null ], 16 | [ "r", "functions_func_r.html", null ], 17 | [ "s", "functions_func_s.html", null ], 18 | [ "t", "functions_func_t.html", null ], 19 | [ "u", "functions_func_u.html", null ], 20 | [ "v", "functions_func_v.html", null ] 21 | ]; -------------------------------------------------------------------------------- /docs/search/mag.svg: -------------------------------------------------------------------------------- 1 | 2 | 4 | 12 | 14 | 20 | 24 | 25 | -------------------------------------------------------------------------------- /docs/search/mag_d.svg: -------------------------------------------------------------------------------- 1 | 2 | 4 | 12 | 14 | 20 | 24 | 25 | -------------------------------------------------------------------------------- /docs/struct_f_scenario.js: -------------------------------------------------------------------------------- 1 | var struct_f_scenario = 2 | [ 3 | [ "AssignScenarioVisualInfo", "struct_f_scenario.html#a646e5ad998c4fcf116ab6ba46fb3ef03", null ], 4 | [ "GetDataToLoad", "struct_f_scenario.html#acd65e06f861c7cc41313a8e52da622e0", null ], 5 | [ "GetDebugString", "struct_f_scenario.html#a79bf8b67f974c3ab9202c2354777f9e4", null ], 6 | [ "HasChoice", "struct_f_scenario.html#a92e73e2d4004acd57beb35393dbc5369", null ], 7 | [ "HasTransition", "struct_f_scenario.html#a4c08bdf223c01bfc66dfbaa1f30d4b4c", null ], 8 | [ "Intrude", "struct_f_scenario.html#a91958f538e550f1603d959b4a60c028d", null ], 9 | [ "ToString", "struct_f_scenario.html#a0d215a7d1a1e90ad53ccc902ae52d286", null ], 10 | [ "Index", "struct_f_scenario.html#ae32b136b41b749c0b575672066e1812b", null ], 11 | [ "Info", "struct_f_scenario.html#add30ca76b5404432c2e0ca01e03338ed", null ], 12 | [ "Owner", "struct_f_scenario.html#a8425bae5ad7a39eb027cc5b1b109dd0a", null ] 13 | ]; -------------------------------------------------------------------------------- /Source/VisualU/Public/VisualTemplates.h: -------------------------------------------------------------------------------- 1 | // Copyright (c) 2025 Evgeny Shustov 2 | 3 | #pragma once 4 | 5 | #include "CoreMinimal.h" 6 | 7 | /** 8 | * Checks if T has a member variable of type U 9 | */ 10 | template 11 | class VISUALU_API HasMemberOfTypeImpl { 12 | private: 13 | 14 | template 15 | static std::true_type test(decltype(static_cast(nullptr))*); 16 | 17 | template 18 | static std::false_type test(...); 19 | 20 | public: 21 | static constexpr bool value = decltype(test(nullptr))::value; 22 | }; 23 | 24 | /** 25 | * @see HasMemberOfTypeImpl 26 | */ 27 | template 28 | concept HasMemberOfType = HasMemberOfTypeImpl::value; 29 | 30 | /** 31 | * Assigns values, in order, to the member variables of the object. 32 | */ 33 | template 34 | inline void UpdateMembers(T* Obj, V T::*... Pointers, const V&... Values) 35 | { 36 | ((Obj->*Pointers = Values), ...); 37 | } 38 | -------------------------------------------------------------------------------- /docs/search/close.svg: -------------------------------------------------------------------------------- 1 | 2 | 4 | 12 | 14 | 18 | 19 | -------------------------------------------------------------------------------- /docs/class_s_visual_socket.js: -------------------------------------------------------------------------------- 1 | var class_s_visual_socket = 2 | [ 3 | [ "ComputeDesiredSize", "class_s_visual_socket.html#a9af049b8ab932af121712d245b0907d1", null ], 4 | [ "Construct", "class_s_visual_socket.html#a7317d52f381e52d6d7caad38040cb48e", null ], 5 | [ "OnArrangeChildren", "class_s_visual_socket.html#a90455861344db96645c36b9502bdbff4", null ], 6 | [ "SetImageDesiredPosition", "class_s_visual_socket.html#a1435c0d033739154e62d76c21684f89f", null ], 7 | [ "SetSocketOffset", "class_s_visual_socket.html#a124fe43926f1f7fc356d4c8e3b9bcfb2", null ], 8 | [ "SetVisualImage", "class_s_visual_socket.html#aead9c8d38b1bdc83218c1bb9684add79", null ], 9 | [ "ChildDesiredSize", "class_s_visual_socket.html#ac947bc4a5d5afc681b0d1922889ff1bb", null ], 10 | [ "ImageDesiredPosition", "class_s_visual_socket.html#a7896c1a1c1dbeffa8066fec4226cd006", null ], 11 | [ "SocketPosition", "class_s_visual_socket.html#a4401857ebc11ee91e234842790e8552e", null ], 12 | [ "VisualImage", "class_s_visual_socket.html#a9e9795157e001d817e0e12bc8e1ff47f", null ] 13 | ]; -------------------------------------------------------------------------------- /Source/VisualU/VisualU.Build.cs: -------------------------------------------------------------------------------- 1 | // Copyright (c) 2025 Evgeny Shustov 2 | 3 | using UnrealBuildTool; 4 | 5 | public class VisualU : ModuleRules 6 | { 7 | public VisualU(ReadOnlyTargetRules Target) : base(Target) 8 | { 9 | PCHUsage = ModuleRules.PCHUsageMode.UseExplicitOrSharedPCHs; 10 | CppStandard = CppStandardVersion.Cpp20; 11 | 12 | PublicDependencyModuleNames.AddRange( 13 | new string[] 14 | { 15 | "Paper2D", 16 | "Core", 17 | "CoreUObject", 18 | "Engine", 19 | "Slate", 20 | "SlateCore", 21 | "UMG", 22 | "AssetRegistry", 23 | "GameplayDebugger", 24 | "MovieScene", 25 | "MovieSceneTracks" 26 | // ... add other public dependencies that you statically link with here ... 27 | } 28 | ); 29 | 30 | if (Target.Type.Equals(TargetType.Editor)) 31 | { 32 | PublicDependencyModuleNames.Add("Settings"); 33 | } 34 | 35 | SetupGameplayDebuggerSupport(Target); 36 | 37 | } 38 | } 39 | -------------------------------------------------------------------------------- /docs/class_s_visual_image_base.js: -------------------------------------------------------------------------------- 1 | var class_s_visual_image_base = 2 | [ 3 | [ "SVisualImageBase", "class_s_visual_image_base.html#a850bdf62c093d1ecebff5eb639401ea5", null ], 4 | [ "ConvertToBrush", "class_s_visual_image_base.html#a61ff0f8ce68665113aa21f328431be7d", null ], 5 | [ "GetFinalColorAndOpacity", "class_s_visual_image_base.html#ad5756615ae9a0437e200f62c194e42dc", null ], 6 | [ "GetFinalResource", "class_s_visual_image_base.html#a5bf80a3b26ab4a8209202938cc73d6a4", null ], 7 | [ "GetImageSize", "class_s_visual_image_base.html#a35d3405bc0f5d2213c9bc38b02c6e490", null ], 8 | [ "IsResourceValid", "class_s_visual_image_base.html#a827a66ffd886cf66ddd835343b23f369", null ], 9 | [ "MakeCustomGeometry", "class_s_visual_image_base.html#adbab3e3688c45b041e89da19ceb8709b", null ], 10 | [ "OnPaint", "class_s_visual_image_base.html#a1e24ef9ab5c07fced51bcdd73a026e3f", null ], 11 | [ "PostSlateDrawElementExtension", "class_s_visual_image_base.html#a3a66a97364c6c1e9046d2ebb6c5bfd77", null ], 12 | [ "PreSlateDrawElementExtension", "class_s_visual_image_base.html#ace06885e33a507858a66a79b29d954ec", null ] 13 | ]; -------------------------------------------------------------------------------- /docs/search/mag_sel.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 5 | 13 | 15 | 21 | 26 | 31 | 32 | -------------------------------------------------------------------------------- /docs/search/mag_seld.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 5 | 13 | 15 | 21 | 26 | 31 | 32 | -------------------------------------------------------------------------------- /docs/search/variables_b.js: -------------------------------------------------------------------------------- 1 | var searchData= 2 | [ 3 | ['onautomoveend_0',['OnAutoMoveEnd',['../class_u_visual_controller.html#a022f7b250f77cb0f41ae53498c602ffd',1,'UVisualController']]], 4 | ['onautomovestart_1',['OnAutoMoveStart',['../class_u_visual_controller.html#a20c0018b08360ee068d0411f0cdb2518',1,'UVisualController']]], 5 | ['onfastmoveend_2',['OnFastMoveEnd',['../class_u_visual_controller.html#a6c2743363887474854ff4ce759ae19e2',1,'UVisualController']]], 6 | ['onfastmovestart_3',['OnFastMoveStart',['../class_u_visual_controller.html#ac5aa9e547c0ae26ebcb1f56afee3e7be',1,'UVisualController']]], 7 | ['onsceneend_4',['OnSceneEnd',['../class_u_visual_controller.html#a8cb81d4b67240e1bc5572658946f3a13',1,'UVisualController']]], 8 | ['onscenestart_5',['OnSceneStart',['../class_u_visual_controller.html#a44182b58d5d888f2b2e0b585a52664d6',1,'UVisualController']]], 9 | ['onspriteappear_6',['OnSpriteAppear',['../class_u_visual_sprite.html#af9798f6d6e1fa042623ee2e6fb27be11',1,'UVisualSprite']]], 10 | ['onspritedisappear_7',['OnSpriteDisappear',['../class_u_visual_sprite.html#a3606eae439eff9a6cc54b424d6c81d15',1,'UVisualSprite']]], 11 | ['owner_8',['Owner',['../struct_f_scenario.html#a8425bae5ad7a39eb027cc5b1b109dd0a',1,'FScenario']]] 12 | ]; 13 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Visual Studio 2015 user specific files 2 | .vs/ 3 | 4 | # Compiled Object files 5 | *.slo 6 | *.lo 7 | *.o 8 | *.obj 9 | 10 | # Precompiled Headers 11 | *.gch 12 | *.pch 13 | 14 | # Compiled Dynamic libraries 15 | *.so 16 | *.dylib 17 | *.dll 18 | 19 | # Fortran module files 20 | *.mod 21 | 22 | # Compiled Static libraries 23 | *.lai 24 | *.la 25 | *.a 26 | *.lib 27 | 28 | # Executables 29 | *.exe 30 | *.out 31 | *.app 32 | *.ipa 33 | 34 | # These project files can be generated by the engine 35 | *.xcodeproj 36 | *.xcworkspace 37 | *.sln 38 | *.suo 39 | *.opensdf 40 | *.sdf 41 | *.VC.db 42 | *.VC.opendb 43 | 44 | # Precompiled Assets 45 | SourceArt/**/*.png 46 | SourceArt/**/*.tga 47 | 48 | # Binary Files 49 | Binaries/* 50 | Plugins/*/Binaries/* 51 | 52 | # Builds 53 | Build/* 54 | 55 | # Whitelist PakBlacklist-.txt files 56 | !Build/*/ 57 | Build/*/** 58 | !Build/*/PakBlacklist*.txt 59 | 60 | # Don't ignore icon files in Build 61 | !Build/**/*.ico 62 | 63 | # Built data for maps 64 | *_BuiltData.uasset 65 | 66 | # Configuration files generated by the Editor 67 | Saved/* 68 | 69 | # Compiled source files for the engine to use 70 | Intermediate/* 71 | Plugins/*/Intermediate/* 72 | 73 | # Cache files for the editor to use 74 | DerivedDataCache/* 75 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # VisualU 2 | Plugin for Unreal Engine 5.7 that brings core functionality for a widget-based visual novel narrative. 3 | 4 | # Setup 5 | Build the plugin for the Unreal Engine 5.7.x project 6 | 7 | ## Build Plugin using Unreal Automation Tool (Windows) 8 | 1. Go to ```\Engine\Build\BatchFiles```. 9 | 2. Type ```powershell``` into File Explorer's address tab. 10 | 3. In the opened Powershell window, type the following command: ```./RunUAT.bat BuildPlugin -plugin="\VisualU.uplugin" -package="C:\Users\$Env:Username\Desktop\Package"``` 11 | 4. Packaged plugin can be saved to any other folder, Desktop is used for example purposes. 12 | 13 | ## Install Plugin for the project 14 | 1. Open project's directory for which you want to install the plugin. 15 | 2. Create ```Plugins``` folder, than another folder named ```VisualU``` inside of it. 16 | 3. Go to ```Desktop\Package``` or the folder that was during step 3 of build phase. 17 | 4. Copy everything and paste it to the newly created ```Plugins\VisualU``` folder inside project's directory. 18 | 19 | # Usage 20 | Check [API documentation!](https://razdvizh.github.io/VisualU/index.html) 21 | Check [VisualU Wiki!](https://github.com/Razdvizh/VisualU/wiki) 22 | Check [Discord Server!](https://discord.gg/9FcxEdgXP7) 23 | -------------------------------------------------------------------------------- /Source/VisualU/Public/VisualU.h: -------------------------------------------------------------------------------- 1 | // Copyright (c) 2025 Evgeny Shustov 2 | 3 | #pragma once 4 | 5 | #include "CoreMinimal.h" 6 | #include "Modules/ModuleManager.h" 7 | 8 | class ISettingsSection; 9 | class UVisualUSettings; 10 | 11 | /** 12 | * VisualU custom log category. 13 | */ 14 | DECLARE_LOG_CATEGORY_EXTERN(LogVisualU, Display, All); 15 | 16 | /** 17 | * VisualU plugin runtime module. 18 | */ 19 | class FVisualUModule : public IModuleInterface 20 | { 21 | public: 22 | /** 23 | * Registers UVisualUSettings and gameplay debugger category. 24 | */ 25 | virtual void StartupModule() override; 26 | 27 | /** 28 | * Unregisters UVisualUSettings and gameplay debugger category. 29 | */ 30 | virtual void ShutdownModule() override; 31 | 32 | #if WITH_EDITOR 33 | /** 34 | * Editor only. 35 | * 36 | * Getter for UVisualUSettings. 37 | * 38 | * @note might be invalid if called before the module is loaded 39 | * 40 | * @return VisualU plugin settings 41 | */ 42 | const UVisualUSettings* GetVisualSettings() const; 43 | 44 | private: 45 | /** 46 | * VisualU settings section in the project settings. 47 | * 48 | * @note located under 'Plugins' category 49 | */ 50 | TSharedPtr SettingsSection; 51 | #endif 52 | }; 53 | -------------------------------------------------------------------------------- /docs/search/variables_5.js: -------------------------------------------------------------------------------- 1 | var searchData= 2 | [ 3 | ['fastmovetask_0',['FastMoveTask',['../class_u_visual_controller.html#a000360e5021dd313048a84bd553b3c6c',1,'UVisualController']]], 4 | ['finalscene_1',['FinalScene',['../class_u_visual_renderer.html#a9c4b71f0e1f1eec92ce4ee49566fac85',1,'UVisualRenderer']]], 5 | ['firstdatatable_2',['FirstDataTable',['../class_u_visual_u_settings.html#a8cdc1e64076400180b071bf18baa8d1f',1,'UVisualUSettings']]], 6 | ['flags_3',['Flags',['../struct_f_visual_scenario_info.html#ab3403c17a61f0486648df5c986feba00',1,'FVisualScenarioInfo']]], 7 | ['flipbook_4',['Flipbook',['../class_s_visual_image.html#aa32532253622e0c326bc5fe1ca4ba3fb',1,'SVisualImage::Flipbook'],['../class_u_visual_image.html#ad9d66b01dee20695e36d0af6882582d4',1,'UVisualImage::Flipbook']]], 8 | ['flipbookdelegate_5',['FlipbookDelegate',['../class_u_visual_image.html#a36d31e55a1adc32828ed33b98988ec1e',1,'UVisualImage']]], 9 | ['flipbookhandle_6',['FlipbookHandle',['../class_u_visual_image.html#a1a4ebf5de4e731576b4b2c5afd35e418',1,'UVisualImage']]], 10 | ['frameindex_7',['FrameIndex',['../struct_f_visual_image_info.html#ad519ce6516a1b84ff031a5adc9c9d5a6',1,'FVisualImageInfo::FrameIndex'],['../class_u_visual_image.html#ab45c874fa35b2539fde66814a1f16d28',1,'UVisualImage::FrameIndex']]] 11 | ]; 12 | -------------------------------------------------------------------------------- /Source/VisualU/Private/VisualSprite.cpp: -------------------------------------------------------------------------------- 1 | // Copyright (c) 2025 Evgeny Shustov 2 | 3 | 4 | #include "VisualSprite.h" 5 | #include "Blueprint/WidgetTree.h" 6 | #include "VisualDefaults.h" 7 | #include "VisualImage.h" 8 | #include "PaperFlipbook.h" 9 | #include "Animation/WidgetAnimation.h" 10 | 11 | UVisualSprite::UVisualSprite(const FObjectInitializer& ObjectInitializer) : Super(ObjectInitializer) 12 | { 13 | } 14 | 15 | void UVisualSprite::ReleaseSlateResources(bool bReleaseChildren) 16 | { 17 | Super::ReleaseSlateResources(bReleaseChildren); 18 | } 19 | 20 | void UVisualSprite::AssignSpriteInfo(const TArray& InInfo) 21 | { 22 | if (!InInfo.IsEmpty()) 23 | { 24 | TArray ChildWidgets; 25 | WidgetTree->GetAllWidgets(ChildWidgets); 26 | 27 | int32 i, j; 28 | for (i = j = 0; i < ChildWidgets.Num(); i++) 29 | { 30 | UWidget* Child = ChildWidgets[i]; 31 | if (UVisualImage* ChildImage = Cast(Child)) 32 | { 33 | checkf(InInfo.IsValidIndex(j), TEXT("There was less SpriteInfo than the sprite widget requires. You must provide an info for each Visual Image in the sprite")); 34 | const FVisualImageInfo& VisualImageInfo = InInfo[j]; 35 | ChildImage->AssignVisualImageInfo(VisualImageInfo); 36 | j++; 37 | } 38 | } 39 | } 40 | } 41 | -------------------------------------------------------------------------------- /VisualU.uplugin: -------------------------------------------------------------------------------- 1 | { 2 | "FileVersion": 3, 3 | "Version": 1, 4 | "VersionName": "1.3.2", 5 | "FriendlyName": "VisualU", 6 | "Description": "Plugin for Unreal Engine 5 that brings core functionality for a widget-based visual novel narrative", 7 | "Category": "Other", 8 | "CreatedBy": "Evgeny Shustov", 9 | "CreatedByURL": "https://github.com/Razdvizh", 10 | "DocsURL": "https://razdvizh.github.io/VisualU/", 11 | "FabURL": "com.epicgames.launcher://ue/Fab/product/1954ce20-35b2-470e-b4b4-e968bd166d1f", 12 | "SupportURL": "https://discord.gg/9FcxEdgXP7", 13 | "EngineVersion": "5.7.0", 14 | "CanContainContent": true, 15 | "IsBetaVersion": false, 16 | "IsExperimentalVersion": false, 17 | "Installed": false, 18 | "Modules": [ 19 | { 20 | "Name": "VisualU", 21 | "Type": "Runtime", 22 | "LoadingPhase": "PreDefault", 23 | "PlatformAllowList": [ 24 | "Win64", 25 | "Linux", 26 | "LinuxArm64", 27 | "Mac", 28 | "Android" 29 | ] 30 | }, 31 | { 32 | "Name": "VisualUEditor", 33 | "Type": "Editor", 34 | "LoadingPhase": "PostEngineInit", 35 | "PlatformAllowList": [ 36 | "Win64", 37 | "Linux", 38 | "LinuxArm64", 39 | "Mac", 40 | "Android" 41 | ] 42 | } 43 | ], 44 | "Plugins": [ 45 | { 46 | "Name": "Paper2D", 47 | "Enabled": true 48 | } 49 | ] 50 | } 51 | -------------------------------------------------------------------------------- /docs/class_u_visual_socket.js: -------------------------------------------------------------------------------- 1 | var class_u_visual_socket = 2 | [ 3 | [ "GetImageDesiredPosition", "class_u_visual_socket.html#a1b43bf9b3f3238348fa214617dd00078", null ], 4 | [ "GetSocketOffset", "class_u_visual_socket.html#aa0e2693bc82bc17874cc02f66a3599c4", null ], 5 | [ "IsAutoPositioning", "class_u_visual_socket.html#aa2c41880947d8bdbe048683ddc541178", null ], 6 | [ "RebuildWidget", "class_u_visual_socket.html#a4acf7365f9ac63313cbaf70b2af6ec90", null ], 7 | [ "ReleaseSlateResources", "class_u_visual_socket.html#a31a664b6da4a161cf1af23b411d10895", null ], 8 | [ "SetAutoPositioning", "class_u_visual_socket.html#a1db9f594ca07396e6d870d59746e2101", null ], 9 | [ "SetImageDesiredPosition", "class_u_visual_socket.html#ad9ac2408650836ae3944336af0a6a6fb", null ], 10 | [ "SetSocketOffset", "class_u_visual_socket.html#a53d91700333dc9ff157fa5d4f0b4a32d", null ], 11 | [ "SynchronizeProperties", "class_u_visual_socket.html#a34c36d960c664acab9ba003741fae19a", null ], 12 | [ "bAutoPositioning", "class_u_visual_socket.html#a44a081a6541fff426271e3740713986a", null ], 13 | [ "ImageDesiredPosition", "class_u_visual_socket.html#a963208d8dfe3c4c594e088e81667d694", null ], 14 | [ "SlateVisualSocket", "class_u_visual_socket.html#a253a27eb0abea06241b47362139e8bcd", null ], 15 | [ "SocketOffset", "class_u_visual_socket.html#aefc9ede3b062d2e0f5855c9fa0d54bb1", null ] 16 | ]; -------------------------------------------------------------------------------- /docs/class_u_visual_versioning_subsystem.js: -------------------------------------------------------------------------------- 1 | var class_u_visual_versioning_subsystem = 2 | [ 3 | [ "FScenarioId", "struct_u_visual_versioning_subsystem_1_1_f_scenario_id.html", null ], 4 | [ "AlterDataTable", "class_u_visual_versioning_subsystem.html#ad395e78159bf71da7bff04aec6c9ccd3", null ], 5 | [ "AlterDataTable", "class_u_visual_versioning_subsystem.html#a41033457c89f8fcc98ce3c27b69ee497", null ], 6 | [ "AlterDataTable", "class_u_visual_versioning_subsystem.html#a20c5af58d8c5d0dcb0ae4182e5e73741", null ], 7 | [ "Checkout", "class_u_visual_versioning_subsystem.html#a3f1a05293e41cdfa58696dc244b53c25", null ], 8 | [ "CheckoutAll", "class_u_visual_versioning_subsystem.html#a384e7b9d43a72678bcbaac822cf1b79e", null ], 9 | [ "Deinitialize", "class_u_visual_versioning_subsystem.html#ab93f84faf0151f581bcc6fad29435b77", null ], 10 | [ "GetSceneChecked", "class_u_visual_versioning_subsystem.html#ab48893f3d2c041b5e9cd4bbfa9ce172f", null ], 11 | [ "GetSceneChecked", "class_u_visual_versioning_subsystem.html#a140ddba8f168898209b5bc2ff71004d6", null ], 12 | [ "Serialize", "class_u_visual_versioning_subsystem.html#a0eab6370fadee754da112b6afe0b6cfa", null ], 13 | [ "SerializeSubsystem", "class_u_visual_versioning_subsystem.html#a27c291345dd47570e5c55d45285c85d3", null ], 14 | [ "Versions", "class_u_visual_versioning_subsystem.html#a7aa92d508f06504e7271cc7c9d96e088", null ] 15 | ]; -------------------------------------------------------------------------------- /docs/search/classes_4.js: -------------------------------------------------------------------------------- 1 | var searchData= 2 | [ 3 | ['ubackgroundvisualimage_0',['UBackgroundVisualImage',['../class_u_background_visual_image.html',1,'']]], 4 | ['uinfoassignable_1',['UInfoAssignable',['../class_u_info_assignable.html',1,'']]], 5 | ['ume_5ftransitionparameter2d_2',['UME_TransitionParameter2D',['../class_u_m_e___transition_parameter2_d.html',1,'']]], 6 | ['uvisualcontroller_3',['UVisualController',['../class_u_visual_controller.html',1,'']]], 7 | ['uvisualcontrollerinterface_4',['UVisualControllerInterface',['../class_u_visual_controller_interface.html',1,'']]], 8 | ['uvisualimage_5',['UVisualImage',['../class_u_visual_image.html',1,'']]], 9 | ['uvisualimagebase_6',['UVisualImageBase',['../class_u_visual_image_base.html',1,'']]], 10 | ['uvisualrenderer_7',['UVisualRenderer',['../class_u_visual_renderer.html',1,'']]], 11 | ['uvisualsocket_8',['UVisualSocket',['../class_u_visual_socket.html',1,'']]], 12 | ['uvisualsprite_9',['UVisualSprite',['../class_u_visual_sprite.html',1,'']]], 13 | ['uvisualtextblock_10',['UVisualTextBlock',['../class_u_visual_text_block.html',1,'']]], 14 | ['uvisualublueprintstatics_11',['UVisualUBlueprintStatics',['../class_u_visual_u_blueprint_statics.html',1,'']]], 15 | ['uvisualusettings_12',['UVisualUSettings',['../class_u_visual_u_settings.html',1,'']]], 16 | ['uvisualversioningsubsystem_13',['UVisualVersioningSubsystem',['../class_u_visual_versioning_subsystem.html',1,'']]] 17 | ]; 18 | -------------------------------------------------------------------------------- /Source/VisualU/Private/GameplayDebuggerCategory_VisualU.h: -------------------------------------------------------------------------------- 1 | // Copyright (c) 2025 Evgeny Shustov 2 | 3 | #pragma once 4 | 5 | #include "CoreMinimal.h" 6 | #if WITH_GAMEPLAY_DEBUGGER_MENU 7 | #include "GameplayDebuggerCategory.h" 8 | 9 | class APlayerController; 10 | class AActor; 11 | 12 | /** 13 | * Debugger for VisualU that provides information on UVisualController. 14 | */ 15 | class FGameplayDebuggerCategory_VisualU final : public FGameplayDebuggerCategory 16 | { 17 | public: 18 | FGameplayDebuggerCategory_VisualU(); 19 | 20 | virtual void CollectData(APlayerController* OwnerPC, AActor* DebugActor) override; 21 | 22 | virtual void DrawData(APlayerController* OwnerPC, FGameplayDebuggerCanvasContext& CanvasContext) override; 23 | 24 | VISUALU_API static TSharedRef MakeInstance(); 25 | 26 | private: 27 | struct FRepData 28 | { 29 | FRepData(); 30 | 31 | FString ControllerName; 32 | uint8 RendererVisibility; 33 | uint8 ControllerMode; 34 | FString CurrentSceneName; 35 | FString CurrentNodeName; 36 | FString CurrentSceneDesc; 37 | FString ControllerHeadDesc; 38 | bool bIsControllerTransitioning; 39 | float ControllerAutoMoveDelay; 40 | bool bControllerPlaysSound; 41 | bool bControllerPlaysTransitions; 42 | int32 NumScenesToLoad; 43 | FString ExhaustedScenesDesc; 44 | FString AsyncQueueDesc; 45 | 46 | void Serialize(FArchive& Ar); 47 | }; 48 | 49 | FRepData RepData; 50 | }; 51 | 52 | #endif 53 | -------------------------------------------------------------------------------- /Source/VisualUEditor/Private/VisualUEditor.cpp: -------------------------------------------------------------------------------- 1 | // Copyright (c) 2025 Evgeny Shustov 2 | 3 | 4 | #include "VisualUEditor.h" 5 | #include "SpriteStructCustomization.h" 6 | #include "VisualUSettingsCustomization.h" 7 | #include "VisualUSettings.h" 8 | #include "PropertyEditorModule.h" 9 | 10 | IMPLEMENT_MODULE(FVisualUEditorModule, VisualUEditor); 11 | 12 | void FVisualUEditorModule::StartupModule() 13 | { 14 | FPropertyEditorModule& PropertyEditorModule = FModuleManager::LoadModuleChecked(TEXT("PropertyEditor")); 15 | PropertyEditorModule.RegisterCustomPropertyTypeLayout(TEXT("Sprite"), FOnGetPropertyTypeCustomizationInstance::CreateStatic(&FSpriteStructCustomization::MakeInstance)); 16 | PropertyEditorModule.RegisterCustomClassLayout(UVisualUSettings::StaticClass()->GetFName(), FOnGetDetailCustomizationInstance::CreateStatic(&FVisualUSettingsCustomization::MakeInstance)); 17 | PropertyEditorModule.NotifyCustomizationModuleChanged(); 18 | } 19 | 20 | void FVisualUEditorModule::ShutdownModule() 21 | { 22 | if (FModuleManager::Get().IsModuleLoaded(TEXT("PropertyEditor"))) 23 | { 24 | FPropertyEditorModule& PropertyEditorModule = FModuleManager::GetModuleChecked(TEXT("PropertyEditor")); 25 | PropertyEditorModule.UnregisterCustomPropertyTypeLayout(TEXT("Sprite")); 26 | PropertyEditorModule.UnregisterCustomClassLayout(UVisualUSettings::StaticClass()->GetFName()); 27 | PropertyEditorModule.NotifyCustomizationModuleChanged(); 28 | } 29 | } 30 | -------------------------------------------------------------------------------- /docs/doc.svg: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | -------------------------------------------------------------------------------- /docs/docd.svg: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | -------------------------------------------------------------------------------- /docs/class_u_visual_renderer.js: -------------------------------------------------------------------------------- 1 | var class_u_visual_renderer = 2 | [ 3 | [ "DrawScene", "class_u_visual_renderer.html#ac9fdb53238e7e26929aabf31753744d9", null ], 4 | [ "ForceStopTransition", "class_u_visual_renderer.html#a02b2a47d0b951889f81a14e6e2746819", null ], 5 | [ "ForEachSprite", "class_u_visual_renderer.html#ab4d851f067c0bca04b4c0b477c80a954", null ], 6 | [ "IsTransitionInProgress", "class_u_visual_renderer.html#aae2e52ce399d0f3056a2b0f5315cf2bb", null ], 7 | [ "NativeDestruct", "class_u_visual_renderer.html#a92aad92fbe9e0600c42922ad81fbae1d", null ], 8 | [ "NativeOnInitialized", "class_u_visual_renderer.html#aa235aed796167a3087e03288a04c5b03", null ], 9 | [ "OnAnimationFinished_Implementation", "class_u_visual_renderer.html#a3232e562687f19dfe3c5d7757f011d34", null ], 10 | [ "RebuildWidget", "class_u_visual_renderer.html#a423fa256a2bb9a2d2a7a268cee55dfef", null ], 11 | [ "TryDrawTransition", "class_u_visual_renderer.html#a1700f5e9a6c9bb4575651de19534ac22", null ], 12 | [ "Background", "class_u_visual_renderer.html#a9c14addab32fb644ff35a6b0635ee3d5", null ], 13 | [ "Canvas", "class_u_visual_renderer.html#a099cc1faa5e38d617bf709c20def1613", null ], 14 | [ "DrawHandle", "class_u_visual_renderer.html#a319f0976168ea69fd070aa02cf9b92a8", null ], 15 | [ "FinalScene", "class_u_visual_renderer.html#a9c4b71f0e1f1eec92ce4ee49566fac85", null ], 16 | [ "Transition", "class_u_visual_renderer.html#adc498138aadcc932bebd201fa166313d", null ], 17 | [ "TransitionHandle", "class_u_visual_renderer.html#a2a0819679ebad403d79c174381e53565", null ] 18 | ]; -------------------------------------------------------------------------------- /docs/search/variables_e.js: -------------------------------------------------------------------------------- 1 | var searchData= 2 | [ 3 | ['scenehandles_0',['SceneHandles',['../class_u_visual_controller.html#a861493c4e2807f5bdc5d3c016a545f39',1,'UVisualController']]], 4 | ['sceneindex_1',['SceneIndex',['../class_u_visual_controller.html#aac09be995351fcdce471b70ceff47e74',1,'UVisualController']]], 5 | ['scenestoload_2',['ScenesToLoad',['../class_u_visual_controller.html#a824dc0420ab29a81f773d371c013647b',1,'UVisualController']]], 6 | ['segments_3',['Segments',['../class_u_visual_text_block.html#a302380cfa0482d38fd42c40b9222dd89',1,'UVisualTextBlock']]], 7 | ['slatevisualsocket_4',['SlateVisualSocket',['../class_u_visual_socket.html#a253a27eb0abea06241b47362139e8bcd',1,'UVisualSocket']]], 8 | ['socketoffset_5',['SocketOffset',['../class_u_visual_socket.html#aefc9ede3b062d2e0f5855c9fa0d54bb1',1,'UVisualSocket']]], 9 | ['socketposition_6',['SocketPosition',['../class_s_visual_socket.html#a4401857ebc11ee91e234842790e8552e',1,'SVisualSocket']]], 10 | ['sound_7',['Sound',['../struct_f_visual_scenario_info.html#a25c785a0bb204c7a39d65c77570db8ab',1,'FVisualScenarioInfo']]], 11 | ['spriteclass_8',['SpriteClass',['../struct_f_sprite.html#ae692ae45e3b90c7afae286e41a1d6263',1,'FSprite']]], 12 | ['spriteindex_9',['SpriteIndex',['../class_s_visual_image.html#a9fc7e06068aa90dfec9c314251fc1b77',1,'SVisualImage']]], 13 | ['spriteinfo_10',['SpriteInfo',['../struct_f_sprite.html#a58df0d12f88a507c9a672e8872cd12a8',1,'FSprite']]], 14 | ['spritesparams_11',['SpritesParams',['../struct_f_visual_scenario_info.html#a8d486437155c6c7130483716b538a0f0',1,'FVisualScenarioInfo']]] 15 | ]; 16 | -------------------------------------------------------------------------------- /docs/search/classes_0.js: -------------------------------------------------------------------------------- 1 | var searchData= 2 | [ 3 | ['fbackground_0',['FBackground',['../struct_f_background.html',1,'']]], 4 | ['fbreakvisualtextblockdecorator_1',['FBreakVisualTextBlockDecorator',['../class_f_break_visual_text_block_decorator.html',1,'']]], 5 | ['fdialoguetextsegment_2',['FDialogueTextSegment',['../struct_f_dialogue_text_segment.html',1,'']]], 6 | ['ffastmoveasynctask_3',['FFastMoveAsyncTask',['../class_u_e_1_1_visual_u_1_1_private_1_1_f_fast_move_async_task.html',1,'UE::VisualU::Private']]], 7 | ['ffastmoveasyncworker_4',['FFastMoveAsyncWorker',['../class_u_e_1_1_visual_u_1_1_private_1_1_f_fast_move_async_worker.html',1,'UE::VisualU::Private']]], 8 | ['fscenario_5',['FScenario',['../struct_f_scenario.html',1,'']]], 9 | ['fscenarioid_6',['FScenarioId',['../struct_u_visual_versioning_subsystem_1_1_f_scenario_id.html',1,'UVisualVersioningSubsystem']]], 10 | ['fsprite_7',['FSprite',['../struct_f_sprite.html',1,'']]], 11 | ['fvisualanchors_8',['FVisualAnchors',['../struct_f_visual_anchors.html',1,'']]], 12 | ['fvisualimageinfo_9',['FVisualImageInfo',['../struct_f_visual_image_info.html',1,'']]], 13 | ['fvisualinfo_10',['FVisualInfo',['../struct_f_visual_info.html',1,'']]], 14 | ['fvisualmargin_11',['FVisualMargin',['../struct_f_visual_margin.html',1,'']]], 15 | ['fvisualscenarioinfo_12',['FVisualScenarioInfo',['../struct_f_visual_scenario_info.html',1,'']]], 16 | ['fvisualucustomversion_13',['FVisualUCustomVersion',['../struct_f_visual_u_custom_version.html',1,'']]], 17 | ['fvisualumodule_14',['FVisualUModule',['../class_f_visual_u_module.html',1,'']]] 18 | ]; 19 | -------------------------------------------------------------------------------- /docs/class_s_background_visual_image.js: -------------------------------------------------------------------------------- 1 | var class_s_background_visual_image = 2 | [ 3 | [ "AddReferencedObjects", "class_s_background_visual_image.html#a9c114521cee6c8e99fc73ced0b40b888", null ], 4 | [ "Construct", "class_s_background_visual_image.html#a6feb4f02ea49d0c380c8c7cb8f872ab6", null ], 5 | [ "GetFinalResource", "class_s_background_visual_image.html#a474d69398121b557cf0e378130df6b65", null ], 6 | [ "GetReferencerName", "class_s_background_visual_image.html#a1c310534a13968f1ad23b628d8bc09aa", null ], 7 | [ "GetTargetSprite", "class_s_background_visual_image.html#adfeef107fae8149a7dfe641de0dd9808", null ], 8 | [ "IsTransitioning", "class_s_background_visual_image.html#aa5f253fff43c3be1e804e51b3c82ea5b", null ], 9 | [ "StartTransition", "class_s_background_visual_image.html#a9fda6a3e67b756c4f08dee400e308c95", null ], 10 | [ "StartTransition", "class_s_background_visual_image.html#acf83a08f2461fa0c24dc0d8afad123fc", null ], 11 | [ "StopTransition", "class_s_background_visual_image.html#a4661aa1396be64136dc636ca5bd533f2", null ], 12 | [ "bIsTargetAnimated", "class_s_background_visual_image.html#a9ab97a04e8ba7e689c1506fd8bbdc9f2", null ], 13 | [ "bIsTransitioning", "class_s_background_visual_image.html#a2686d76c7b0ea870da55b267ad9e8376", null ], 14 | [ "Target", "class_s_background_visual_image.html#aec2277e2f9b7e932b70961d7cf820e57", null ], 15 | [ "TargetFrameIndex", "class_s_background_visual_image.html#ae53412188050c9d4a7b8994f68721ef1", null ], 16 | [ "Transition", "class_s_background_visual_image.html#a030e6488f721fbf836817445a1e150f8", null ] 17 | ]; -------------------------------------------------------------------------------- /docs/search/functions_f.js: -------------------------------------------------------------------------------- 1 | var searchData= 2 | [ 3 | ['toflipbook_0',['ToFlipbook',['../class_u_visual_image.html#a65aefccf789bac9a43c5667886240b63',1,'UVisualImage']]], 4 | ['tostring_1',['ToString',['../struct_f_sprite.html#a58f57f3792dccc4dcdb7865ce348c0d7',1,'FSprite::ToString()'],['../struct_f_background.html#ae8c64926c63e62ce38d1c42d724e4c4f',1,'FBackground::ToString()'],['../struct_f_visual_scenario_info.html#ae1e8cdefc9e8f40229c8d7c728b74f27',1,'FVisualScenarioInfo::ToString()'],['../struct_f_scenario.html#a0d215a7d1a1e90ad53ccc902ae52d286',1,'FScenario::ToString()'],['../struct_f_visual_anchors.html#ad8bfdc4f37a8022848c07f19b222949a',1,'FVisualAnchors::ToString()'],['../struct_f_visual_margin.html#a299d62f4fe58483a4ab0863c520c8fb4',1,'FVisualMargin::ToString()'],['../struct_f_visual_image_info.html#a22384b4ec4c8d8685757624663116212',1,'FVisualImageInfo::ToString()']]], 5 | ['trydrawtransition_2',['TryDrawTransition',['../class_u_visual_renderer.html#a1700f5e9a6c9bb4575651de19534ac22',1,'UVisualRenderer']]], 6 | ['trygetvisualversioningsubsystem_3',['TryGetVisualVersioningSubsystem',['../class_u_visual_controller.html#a9070227c05897d1083599735840d2276',1,'UVisualController']]], 7 | ['tryplayscenesound_4',['TryPlaySceneSound',['../class_u_visual_controller.html#a31d5c6ec38889b007552918ecfed6e3a',1,'UVisualController']]], 8 | ['tryplaytransition_5',['TryPlayTransition',['../class_u_visual_controller.html#a1889a5682e0f09726dfdc7a3e2e86295',1,'UVisualController']]], 9 | ['typewrite_6',['Typewrite',['../class_u_visual_text_block.html#a1d7824bd8ee504fa1930d2261e55c965',1,'UVisualTextBlock']]] 10 | ]; 11 | -------------------------------------------------------------------------------- /docs/search/variables_f.js: -------------------------------------------------------------------------------- 1 | var searchData= 2 | [ 3 | ['tagposition_0',['TagPosition',['../class_f_break_visual_text_block_decorator.html#aa11d94ef37b093a86e5abc43c72fb4f9',1,'FBreakVisualTextBlockDecorator']]], 4 | ['target_1',['Target',['../class_s_background_visual_image.html#aec2277e2f9b7e932b70961d7cf820e57',1,'SBackgroundVisualImage']]], 5 | ['targetframeindex_2',['TargetFrameIndex',['../class_s_background_visual_image.html#ae53412188050c9d4a7b8994f68721ef1',1,'SBackgroundVisualImage']]], 6 | ['textlayout_3',['TextLayout',['../class_u_visual_text_block.html#a24d6f3d88c8e0749933eb5a63c3d97e0',1,'UVisualTextBlock']]], 7 | ['textmarshaller_4',['TextMarshaller',['../class_u_visual_text_block.html#ad41bc127b7e3a093499aef3b1b99678d',1,'UVisualTextBlock']]], 8 | ['tostring_5',['ToString',['../struct_f_visual_info.html#a7325c2f51f9b2598526049bf5ec733c8',1,'FVisualInfo']]], 9 | ['transition_6',['Transition',['../class_s_background_visual_image.html#a030e6488f721fbf836817445a1e150f8',1,'SBackgroundVisualImage::Transition'],['../class_u_visual_renderer.html#adc498138aadcc932bebd201fa166313d',1,'UVisualRenderer::Transition']]], 10 | ['transitionduration_7',['TransitionDuration',['../class_u_visual_u_settings.html#a7fbed77e7808b3c971dd2a2898ce6f31',1,'UVisualUSettings']]], 11 | ['transitionhandle_8',['TransitionHandle',['../class_u_visual_renderer.html#a2a0819679ebad403d79c174381e53565',1,'UVisualRenderer']]], 12 | ['transitionmaterial_9',['TransitionMaterial',['../struct_f_background.html#a7d852002f7a301bc55257cf118ae8cc8',1,'FBackground']]], 13 | ['transitionmpc_10',['TransitionMPC',['../class_u_visual_u_settings.html#a0797ca53cc101414db786f0d5cfb2085',1,'UVisualUSettings']]] 14 | ]; 15 | -------------------------------------------------------------------------------- /Source/VisualUEditor/Private/VisualUSettingsCustomization.cpp: -------------------------------------------------------------------------------- 1 | // Copyright (c) 2025 Evgeny Shustov 2 | 3 | 4 | #include "VisualUSettingsCustomization.h" 5 | #include "VisualUSettings.h" 6 | #include "DetailLayoutBuilder.h" 7 | #include "DetailWidgetRow.h" 8 | #include "Widgets/Input/SButton.h" 9 | 10 | #define LOCTEXT_NAMESPACE "VisualUEditor" 11 | 12 | FVisualUSettingsCustomization::FVisualUSettingsCustomization() = default; 13 | 14 | VISUALUEDITOR_API TSharedRef FVisualUSettingsCustomization::MakeInstance() 15 | { 16 | return MakeShareable(new FVisualUSettingsCustomization()); 17 | } 18 | 19 | void FVisualUSettingsCustomization::CustomizeDetails(IDetailLayoutBuilder& DetailBuilder) 20 | { 21 | TArray> VisualUSettingsCustomized = DetailBuilder.GetObjectsOfTypeBeingCustomized(); 22 | check(!VisualUSettingsCustomized.IsEmpty()); 23 | 24 | TWeakObjectPtr WeakSettings = VisualUSettingsCustomized[0]; 25 | 26 | IDetailCategoryBuilder& EditorCategory = DetailBuilder.EditCategory("Editor"); 27 | 28 | EditorCategory.AddCustomRow(LOCTEXT("VisualUSettingsCustomizationRowFilter", "VisualUSettings")) 29 | .ValueContent() 30 | [ 31 | SNew(SButton) 32 | .Text(LOCTEXT("VisualUSettingsCustomizationResetOverridesText", "Reset Overrides")) 33 | .ToolTipText(LOCTEXT("VisualUSettingsCustomizationResetOverridesToolTip", "Resets name overrides of scenario flags to plugin's default values.")) 34 | .OnClicked_Lambda([WeakSettings] 35 | { 36 | if (WeakSettings.IsValid()) 37 | { 38 | WeakSettings->ResetOverrides(); 39 | } 40 | 41 | return FReply::Handled(); 42 | }) 43 | ]; 44 | } 45 | 46 | #undef LOCTEXT_NAMESPACE 47 | -------------------------------------------------------------------------------- /docs/search/variables_2.js: -------------------------------------------------------------------------------- 1 | var searchData= 2 | [ 3 | ['cachedletterindex_0',['CachedLetterIndex',['../class_u_visual_text_block.html#adb6132c856b790da36bb828ffc4a0895',1,'UVisualTextBlock']]], 4 | ['cachedsegmenttext_1',['CachedSegmentText',['../class_u_visual_text_block.html#a4eddd39b8650be3f464d248d704ee977',1,'UVisualTextBlock']]], 5 | ['canvas_2',['Canvas',['../class_u_visual_renderer.html#a099cc1faa5e38d617bf709c20def1613',1,'UVisualRenderer']]], 6 | ['childdesiredsize_3',['ChildDesiredSize',['../class_s_visual_socket.html#ac947bc4a5d5afc681b0d1922889ff1bb',1,'SVisualSocket']]], 7 | ['colorandopacity_4',['ColorAndOpacity',['../class_s_visual_image.html#aa2b5b4191d38b44f4ed7fb54712d40c3',1,'SVisualImage::ColorAndOpacity'],['../struct_f_visual_image_info.html#ade9016ed50378903d2ce419b368a706e',1,'FVisualImageInfo::ColorAndOpacity'],['../class_u_visual_image.html#a608a5a0dcec36f660fc09c29d4bf1396',1,'UVisualImage::ColorAndOpacity']]], 8 | ['colorandopacitydelegate_5',['ColorAndOpacityDelegate',['../class_u_visual_image.html#ab260f494159af5eb2c19d7c2d1469e7d',1,'UVisualImage']]], 9 | ['currentletterindex_6',['CurrentLetterIndex',['../class_u_visual_text_block.html#a8a691770383bee1f747a86d45050b665',1,'UVisualTextBlock']]], 10 | ['currentline_7',['CurrentLine',['../class_u_visual_text_block.html#a0a663d085a33213723e22a6d8b20bdd0',1,'UVisualTextBlock']]], 11 | ['currentsegmentindex_8',['CurrentSegmentIndex',['../class_u_visual_text_block.html#a322f605be17a193a6e5d98d89dee62bf',1,'UVisualTextBlock']]], 12 | ['curvesequence_9',['CurveSequence',['../class_s_visual_image.html#a56c9c8d50aabed9e229d9b9a34406fc3',1,'SVisualImage']]], 13 | ['customdesiredscale_10',['CustomDesiredScale',['../class_s_visual_image.html#ac2c943103fe2119df724f6b3c95413e2',1,'SVisualImage']]] 14 | ]; 15 | -------------------------------------------------------------------------------- /Source/VisualU/Private/ME_TransitionParameter2D.cpp: -------------------------------------------------------------------------------- 1 | // Copyright (c) 2025 Evgeny Shustov 2 | 3 | 4 | #include "ME_TransitionParameter2D.h" 5 | #include "Materials/MaterialInstanceDynamic.h" 6 | #include "VisualUSettings.h" 7 | 8 | UME_TransitionParameter2D::UME_TransitionParameter2D(const FObjectInitializer& ObjectInitializer) 9 | : Super(ObjectInitializer), 10 | bIsSecondTransition(false) 11 | { 12 | const UVisualUSettings* VisualSettings = GetDefault(); 13 | ParameterName = VisualSettings->AParameterName; 14 | AParameterName = VisualSettings->AParameterName; 15 | BParameterName = VisualSettings->BParameterName; 16 | SamplerSource = ESamplerSourceMode::SSM_Wrap_WorldGroupSettings; 17 | } 18 | 19 | UMaterialInstanceDynamic* UME_TransitionParameter2D::GetTransitionMaterial(UMaterialInstanceDynamic* MaterialToChange, const TMap& Params) 20 | { 21 | for (auto It = Params.CreateConstIterator(); It; ++It) 22 | { 23 | MaterialToChange->SetTextureParameterValue(It.Key(), It.Value()); 24 | } 25 | 26 | return MaterialToChange; 27 | } 28 | 29 | #if WITH_EDITOR 30 | void UME_TransitionParameter2D::GetCaption(TArray& OutCaptions) const 31 | { 32 | OutCaptions.Emplace(TEXT("Background Transition")); 33 | 34 | if (bIsSecondTransition) 35 | { 36 | OutCaptions.Emplace(BParameterName.ToString()); 37 | } 38 | else 39 | { 40 | OutCaptions.Emplace(AParameterName.ToString()); 41 | } 42 | } 43 | void UME_TransitionParameter2D::PostEditChangeProperty(FPropertyChangedEvent& PropertyChangedEvent) 44 | { 45 | if (bIsSecondTransition) 46 | { 47 | ParameterName = BParameterName; 48 | } 49 | else 50 | { 51 | ParameterName = AParameterName; 52 | } 53 | 54 | Super::PostEditChangeProperty(PropertyChangedEvent); 55 | } 56 | #endif 57 | -------------------------------------------------------------------------------- /docs/search/all_11.js: -------------------------------------------------------------------------------- 1 | var searchData= 2 | [ 3 | ['ubackgroundvisualimage_0',['UBackgroundVisualImage',['../class_u_background_visual_image.html',1,'']]], 4 | ['uinfoassignable_1',['UInfoAssignable',['../class_u_info_assignable.html',1,'']]], 5 | ['ume_5ftransitionparameter2d_2',['UME_TransitionParameter2D',['../class_u_m_e___transition_parameter2_d.html',1,'']]], 6 | ['updatesequence_3',['UpdateSequence',['../class_s_visual_image.html#ade6908c66fa0da03b2ab839689b7a080',1,'SVisualImage']]], 7 | ['uproperty_4',['UPROPERTY',['../struct_f_sprite.html#a6fe2c8dd0679188caa2b7402ab0eb4c5',1,'FSprite']]], 8 | ['uvisualcontroller_5',['UVisualController',['../class_u_visual_controller.html',1,'']]], 9 | ['uvisualcontrollerinterface_6',['UVisualControllerInterface',['../class_u_visual_controller_interface.html',1,'']]], 10 | ['uvisualimage_7',['UVisualImage',['../class_u_visual_image.html',1,'']]], 11 | ['uvisualimagebase_8',['UVisualImageBase',['../class_u_visual_image_base.html',1,'UVisualImageBase'],['../class_u_visual_image_base.html#af9cb3714f867095d34bcd4b4504ce35a',1,'UVisualImageBase::UVisualImageBase()']]], 12 | ['uvisualrenderer_9',['UVisualRenderer',['../class_u_visual_renderer.html',1,'']]], 13 | ['uvisualsocket_10',['UVisualSocket',['../class_u_visual_socket.html',1,'']]], 14 | ['uvisualsprite_11',['UVisualSprite',['../class_u_visual_sprite.html',1,'']]], 15 | ['uvisualtextblock_12',['UVisualTextBlock',['../class_u_visual_text_block.html',1,'']]], 16 | ['uvisualublueprintstatics_13',['UVisualUBlueprintStatics',['../class_u_visual_u_blueprint_statics.html',1,'']]], 17 | ['uvisualusettings_14',['UVisualUSettings',['../class_u_visual_u_settings.html',1,'']]], 18 | ['uvisualversioningsubsystem_15',['UVisualVersioningSubsystem',['../class_u_visual_versioning_subsystem.html',1,'']]] 19 | ]; 20 | -------------------------------------------------------------------------------- /Source/VisualU/Private/BackgroundVisualImage.cpp: -------------------------------------------------------------------------------- 1 | // Copyright (c) 2025 Evgeny Shustov 2 | 3 | 4 | #include "BackgroundVisualImage.h" 5 | #include "SBackgroundVisualImage.h" 6 | #include "Materials/MaterialInstanceDynamic.h" 7 | #include "Materials/MaterialInstance.h" 8 | #include "Materials/MaterialInterface.h" 9 | 10 | UBackgroundVisualImage::UBackgroundVisualImage(const FObjectInitializer& ObjectInitializer) 11 | : UVisualImage(ObjectInitializer) 12 | { 13 | } 14 | 15 | void UBackgroundVisualImage::ReleaseSlateResources(bool bReleaseChildren) 16 | { 17 | Super::ReleaseSlateResources(bReleaseChildren); 18 | } 19 | 20 | void UBackgroundVisualImage::StopTransition() 21 | { 22 | if (VisualImageSlate.IsValid()) 23 | { 24 | StaticCast(VisualImageSlate.Get())->StopTransition(); 25 | } 26 | } 27 | 28 | bool UBackgroundVisualImage::IsTransitioning() const 29 | { 30 | if (VisualImageSlate.IsValid()) 31 | { 32 | return StaticCast(VisualImageSlate.Get())->IsTransitioning(); 33 | } 34 | 35 | return false; 36 | } 37 | 38 | void UBackgroundVisualImage::PlayTransition(UPaperFlipbook* Target, UMaterialInstanceDynamic* Transition, bool bShouldAnimateTarget) 39 | { 40 | if (VisualImageSlate.IsValid()) 41 | { 42 | StaticCast(VisualImageSlate.Get())->StartTransition(Target, Transition, bShouldAnimateTarget); 43 | } 44 | } 45 | 46 | void UBackgroundVisualImage::PlayTransition(UPaperFlipbook* Target, UMaterialInstanceDynamic* Transition, int32 TargetFrameIndex) 47 | { 48 | if (VisualImageSlate.IsValid()) 49 | { 50 | StaticCast(VisualImageSlate.Get())->StartTransition(Target, Transition, TargetFrameIndex); 51 | } 52 | } 53 | 54 | TSharedRef UBackgroundVisualImage::RebuildWidget() 55 | { 56 | VisualImageSlate = SNew(SBackgroundVisualImage); 57 | 58 | return VisualImageSlate.ToSharedRef(); 59 | } 60 | -------------------------------------------------------------------------------- /docs/search/all_c.js: -------------------------------------------------------------------------------- 1 | var searchData= 2 | [ 3 | ['onanimationfinished_5fimplementation_0',['OnAnimationFinished_Implementation',['../class_u_visual_renderer.html#a3232e562687f19dfe3c5d7757f011d34',1,'UVisualRenderer']]], 4 | ['onarrangechildren_1',['OnArrangeChildren',['../class_s_visual_socket.html#a90455861344db96645c36b9502bdbff4',1,'SVisualSocket']]], 5 | ['onautomoveend_2',['OnAutoMoveEnd',['../class_u_visual_controller.html#a022f7b250f77cb0f41ae53498c602ffd',1,'UVisualController']]], 6 | ['onautomovestart_3',['OnAutoMoveStart',['../class_u_visual_controller.html#a20c0018b08360ee068d0411f0cdb2518',1,'UVisualController']]], 7 | ['onfastmoveend_4',['OnFastMoveEnd',['../class_u_visual_controller.html#a6c2743363887474854ff4ce759ae19e2',1,'UVisualController']]], 8 | ['onfastmovestart_5',['OnFastMoveStart',['../class_u_visual_controller.html#ac5aa9e547c0ae26ebcb1f56afee3e7be',1,'UVisualController']]], 9 | ['onpaint_6',['OnPaint',['../class_s_visual_image_base.html#a1e24ef9ab5c07fced51bcdd73a026e3f',1,'SVisualImageBase']]], 10 | ['onplayletter_7',['OnPlayLetter',['../class_u_visual_text_block.html#ac9a22631d929a4f4d86fa3579055cd13',1,'UVisualTextBlock']]], 11 | ['onsceneend_8',['OnSceneEnd',['../class_u_visual_controller.html#a8cb81d4b67240e1bc5572658946f3a13',1,'UVisualController']]], 12 | ['onscenestart_9',['OnSceneStart',['../class_u_visual_controller.html#a44182b58d5d888f2b2e0b585a52664d6',1,'UVisualController']]], 13 | ['onspriteappear_10',['OnSpriteAppear',['../class_u_visual_sprite.html#af9798f6d6e1fa042623ee2e6fb27be11',1,'UVisualSprite']]], 14 | ['onspritedisappear_11',['OnSpriteDisappear',['../class_u_visual_sprite.html#a3606eae439eff9a6cc54b424d6c81d15',1,'UVisualSprite']]], 15 | ['ontypewriterfinished_12',['OnTypewriterFinished',['../class_u_visual_text_block.html#aa47702ec6ff3baba9bce10bc3f199efc',1,'UVisualTextBlock']]], 16 | ['owner_13',['Owner',['../struct_f_scenario.html#a8425bae5ad7a39eb027cc5b1b109dd0a',1,'FScenario']]] 17 | ]; 18 | -------------------------------------------------------------------------------- /docs/search/functions_0.js: -------------------------------------------------------------------------------- 1 | var searchData= 2 | [ 3 | ['accept_0',['Accept',['../struct_f_visual_scenario_info.html#ac5109f6581abdf3c264e527f9a2c0c92',1,'FVisualScenarioInfo::Accept()'],['../struct_f_visual_image_info.html#a76b8fefabbb8297d65470f2373caa35e',1,'FVisualImageInfo::Accept()']]], 4 | ['addreferencedobjects_1',['AddReferencedObjects',['../class_s_background_visual_image.html#a9c114521cee6c8e99fc73ced0b40b888',1,'SBackgroundVisualImage::AddReferencedObjects()'],['../class_s_visual_image.html#a3b67ce9e04fee0e09c07cca00f356210',1,'SVisualImage::AddReferencedObjects()']]], 5 | ['alterdatatable_2',['AlterDataTable',['../class_u_visual_versioning_subsystem.html#ad395e78159bf71da7bff04aec6c9ccd3',1,'UVisualVersioningSubsystem::AlterDataTable(const UDataTable *DataTable, const FName &SceneName, const FVisualScenarioInfo &Version)'],['../class_u_visual_versioning_subsystem.html#a41033457c89f8fcc98ce3c27b69ee497',1,'UVisualVersioningSubsystem::AlterDataTable(const UDataTable *DataTable, const FName &SceneName, V T::*... Members, const V &... Values)'],['../class_u_visual_versioning_subsystem.html#a20c5af58d8c5d0dcb0ae4182e5e73741',1,'UVisualVersioningSubsystem::AlterDataTable(FScenario *Scene, V T::*... Members, const V &... Values)']]], 6 | ['assertnextsceneload_3',['AssertNextSceneLoad',['../class_u_visual_controller.html#aea158cdd8cf5efc7df3216317fab9751',1,'UVisualController']]], 7 | ['assignscenariovisualinfo_4',['AssignScenarioVisualInfo',['../struct_f_scenario.html#a646e5ad998c4fcf116ab6ba46fb3ef03',1,'FScenario']]], 8 | ['assignspriteinfo_5',['AssignSpriteInfo',['../class_u_visual_sprite.html#a0fa01c9d6eb5b9f12cb49715384bf07f',1,'UVisualSprite']]], 9 | ['assignvisualimageinfo_6',['AssignVisualImageInfo',['../class_u_visual_image.html#aff0d87016a2a8064ba64fd180d223fa8',1,'UVisualImage']]], 10 | ['asyncloadflipbook_7',['AsyncLoadFlipbook',['../class_u_visual_image.html#a3e0e60a6688375374a18ebafbc27df4f',1,'UVisualImage']]] 11 | ]; 12 | -------------------------------------------------------------------------------- /docs/folderclosed.svg: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /docs/folderclosedd.svg: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /Source/VisualU/Public/InfoAssignable.h: -------------------------------------------------------------------------------- 1 | // Copyright (c) 2025 Evgeny Shustov 2 | 3 | #pragma once 4 | 5 | #include "CoreMinimal.h" 6 | #include "UObject/Interface.h" 7 | #include "InfoAssignable.generated.h" 8 | 9 | struct FVisualImageInfo; 10 | struct FVisualScenarioInfo; 11 | 12 | UINTERFACE(MinimalAPI) 13 | class UInfoAssignable : public UInterface 14 | { 15 | GENERATED_BODY() 16 | }; 17 | 18 | /** 19 | * Interface that allows classes to take data from FVisualInfo structures. 20 | * Classes can assign data from multiple structures. 21 | * 22 | * Use UVisualImage::AssignVisualImageInfo() as an example 23 | * when adding function 24 | * for custom FVisualInfo struct. 25 | */ 26 | class IInfoAssignable 27 | { 28 | GENERATED_BODY() 29 | 30 | public: 31 | virtual void AssignVisualImageInfo(const FVisualImageInfo& Info) PURE_VIRTUAL(IInfoAssignable::AssignVisualImageInfo, ); 32 | 33 | virtual void AssignScenarioVisualInfo(const FVisualScenarioInfo& Info) PURE_VIRTUAL(IInfoAssignable::AssignScenarioVisualInfo, ); 34 | 35 | }; 36 | 37 | /** 38 | * Base struct for assignable info. 39 | * 40 | * Represents certain data which other classes can retrieve 41 | * through IInfoAssignable interface. 42 | * To create custom Visual Info struct: 43 | * -# Create a struct that inherits from {@code FVisualInfo} 44 | * -# Add desired fields 45 | * -# Override {@code Accept} function to implement Visitor pattern 46 | * -# Override {@code ToString} function if needed 47 | * 48 | * @see FVisualImageInfo 49 | */ 50 | USTRUCT(BlueprintInternalUseOnly) 51 | struct FVisualInfo 52 | { 53 | GENERATED_BODY() 54 | 55 | public: 56 | FVisualInfo(); 57 | 58 | virtual ~FVisualInfo(); 59 | 60 | /** 61 | * Entry for visitor. 62 | * 63 | * @see FVisualImageInfo::Accept() 64 | * 65 | * @param Visitor interface object to assign this info to 66 | */ 67 | virtual void Accept(IInfoAssignable* Visitor) const PURE_VIRTUAL(FVisualInfo::Accept, ); 68 | 69 | /** 70 | * @return String representation of this info 71 | */ 72 | virtual FString ToString() const PURE_VIRTUAL(FVisualInfo::ToString, return FString();); 73 | }; 74 | -------------------------------------------------------------------------------- /docs/cookie.js: -------------------------------------------------------------------------------- 1 | /*! 2 | Cookie helper functions 3 | Copyright (c) 2023 Dimitri van Heesch 4 | Released under MIT license. 5 | */ 6 | let Cookie = { 7 | cookie_namespace: 'doxygen_', 8 | 9 | readSetting(cookie,defVal) { 10 | if (window.chrome) { 11 | const val = localStorage.getItem(this.cookie_namespace+cookie) || 12 | sessionStorage.getItem(this.cookie_namespace+cookie); 13 | if (val) return val; 14 | } else { 15 | let myCookie = this.cookie_namespace+cookie+"="; 16 | if (document.cookie) { 17 | const index = document.cookie.indexOf(myCookie); 18 | if (index != -1) { 19 | const valStart = index + myCookie.length; 20 | let valEnd = document.cookie.indexOf(";", valStart); 21 | if (valEnd == -1) { 22 | valEnd = document.cookie.length; 23 | } 24 | return document.cookie.substring(valStart, valEnd); 25 | } 26 | } 27 | } 28 | return defVal; 29 | }, 30 | 31 | writeSetting(cookie,val,days=10*365) { // default days='forever', 0=session cookie, -1=delete 32 | if (window.chrome) { 33 | if (days==0) { 34 | sessionStorage.setItem(this.cookie_namespace+cookie,val); 35 | } else { 36 | localStorage.setItem(this.cookie_namespace+cookie,val); 37 | } 38 | } else { 39 | let date = new Date(); 40 | date.setTime(date.getTime()+(days*24*60*60*1000)); 41 | const expiration = days!=0 ? "expires="+date.toGMTString()+";" : ""; 42 | document.cookie = this.cookie_namespace + cookie + "=" + 43 | val + "; SameSite=Lax;" + expiration + "path=/"; 44 | } 45 | }, 46 | 47 | eraseSetting(cookie) { 48 | if (window.chrome) { 49 | if (localStorage.getItem(this.cookie_namespace+cookie)) { 50 | localStorage.removeItem(this.cookie_namespace+cookie); 51 | } else if (sessionStorage.getItem(this.cookie_namespace+cookie)) { 52 | sessionStorage.removeItem(this.cookie_namespace+cookie); 53 | } 54 | } else { 55 | this.writeSetting(cookie,'',-1); 56 | } 57 | }, 58 | } 59 | -------------------------------------------------------------------------------- /Source/VisualU/Private/SVisualSocket.cpp: -------------------------------------------------------------------------------- 1 | // Copyright (c) 2025 Evgeny Shustov 2 | 3 | 4 | #include "SVisualSocket.h" 5 | #include "VisualImage.h" 6 | #include "PaperSprite.h" 7 | #include "PaperFlipbook.h" 8 | 9 | void SVisualSocket::Construct(const FArguments& Args) 10 | { 11 | SScaleBox::Construct(Args); 12 | } 13 | 14 | int32 SVisualSocket::OnPaint(const FPaintArgs& Args, const FGeometry& AllottedGeometry, const FSlateRect& MyCullingRect, FSlateWindowElementList& OutDrawElements, int32 LayerId, const FWidgetStyle& InWidgetStyle, bool bParentEnabled) const 15 | { 16 | if (VisualImage && VisualImage->GetFlipbook()) 17 | { 18 | const FVector3d BoxSize = VisualImage->GetCurrentSprite()->GetRenderBounds().GetBox().GetSize(); 19 | const FVector2D ImageSize = FVector2D(BoxSize.X, BoxSize.Z); 20 | const FVector2D NewSocketOffset = FVector2D((ImageDesiredPosition.X - ImageSize.X / 2) / ImageSize.X, (ImageDesiredPosition.Y - ImageSize.Y / 2) / ImageSize.Y); 21 | SocketPosition = NewSocketOffset; 22 | } 23 | LayerId = SScaleBox::OnPaint(Args, AllottedGeometry, MyCullingRect, OutDrawElements, LayerId, InWidgetStyle, bParentEnabled); 24 | 25 | return LayerId; 26 | } 27 | 28 | FVector2D SVisualSocket::ComputeDesiredSize(float InScale) const 29 | { 30 | ChildDesiredSize = SScaleBox::ComputeDesiredSize(InScale); 31 | 32 | return FVector2D::ZeroVector; 33 | } 34 | 35 | void SVisualSocket::OnArrangeChildren(const FGeometry& AllottedGeometry, FArrangedChildren& ArrangedChildren) const 36 | { 37 | const FGeometry NewGeometry = AllottedGeometry.MakeChild(ChildDesiredSize, FSlateLayoutTransform(SocketPosition * ChildDesiredSize)); 38 | SScaleBox::OnArrangeChildren(NewGeometry, ArrangedChildren); 39 | } 40 | 41 | void SVisualSocket::SetSocketOffset(FVector2D InPosition) 42 | { 43 | SocketPosition = InPosition; 44 | 45 | Invalidate(EInvalidateWidget::Layout); 46 | } 47 | 48 | void SVisualSocket::SetVisualImage(UVisualImage* InVisualImage) 49 | { 50 | VisualImage = InVisualImage; 51 | } 52 | 53 | void SVisualSocket::SetImageDesiredPosition(FVector2D InPosition) 54 | { 55 | ImageDesiredPosition = InPosition; 56 | } -------------------------------------------------------------------------------- /Source/VisualU/Public/BreakVisualTextBlockDecorator.h: -------------------------------------------------------------------------------- 1 | // Copyright (c) 2025 Evgeny Shustov 2 | 3 | #pragma once 4 | 5 | #include "CoreMinimal.h" 6 | #include "Engine/TimerHandle.h" 7 | #include "Components/RichTextBlockDecorator.h" 8 | 9 | class UVisualTextBlock; 10 | class URichTextBlock; 11 | 12 | /** 13 | * Pauses typewriter when it hits break tag - {@code }. 14 | * Understands @code{.unparsed} *text**text* and *text**text*. @endcode 15 | * Only one tag per text is supported at this time. 16 | * 17 | * @note Only the last found break tag in the text will have an effect. 18 | */ 19 | class VISUALU_API FBreakVisualTextBlockDecorator : public FRichTextDecorator 20 | { 21 | 22 | typedef FRichTextDecorator Super; 23 | 24 | public: 25 | FBreakVisualTextBlockDecorator(UVisualTextBlock* InOwner); 26 | 27 | /** 28 | * Determines the tag that is supported by this decorator. 29 | * 30 | * @param RunParseResult contains data about parsed tags and its metadata 31 | * @param Text Content of Rich text block that has this decorator 32 | */ 33 | virtual bool Supports(const FTextRunParseResults& RunParseResult, const FString& Text) const override; 34 | 35 | protected: 36 | /** 37 | * Produces decorated result. 38 | * Responsible for pausing typewriter, leaves provided text style intact. 39 | * 40 | * @param RunInfo contains data about parsed tag and its metadata 41 | * @param InOutTextStyle text style to be decorated. Left as provided. 42 | * @param InOutString text to be modified. Left as provided. 43 | */ 44 | virtual void CreateDecoratorText(const FTextRunInfo& RunInfo, FTextBlockStyle& InOutTextStyle, FString& InOutString) const override; 45 | 46 | private: 47 | /** 48 | * Parent constructor is hidden because we want to construct only 49 | * from UVisualTextBlock 50 | */ 51 | FBreakVisualTextBlockDecorator(URichTextBlock* InOwner); 52 | 53 | /** 54 | * Timer to pause typewriter. 55 | */ 56 | mutable FTimerHandle BreakTimer; 57 | 58 | /** 59 | * Position of the break tag in the text. 60 | */ 61 | mutable int32 TagPosition; 62 | 63 | /** 64 | * Determines if at least one break tag were found. 65 | */ 66 | mutable uint32 bTagDiscovered : 1; 67 | }; 68 | -------------------------------------------------------------------------------- /Source/VisualU/Private/VisualUSettings.cpp: -------------------------------------------------------------------------------- 1 | // Copyright (c) 2025 Evgeny Shustov 2 | 3 | 4 | #include "VisualUSettings.h" 5 | #include "Scenario.h" 6 | 7 | // None, Character, Choice 8 | constexpr int32 CustomEnumOffset = 3; 9 | 10 | UVisualUSettings::UVisualUSettings(const FObjectInitializer& ObjectInitializer) 11 | : Super(ObjectInitializer), 12 | FirstDataTable(), 13 | TransitionMPC(), 14 | TransitionDuration(0.f), 15 | AParameterName(TEXT("Transition 1")), 16 | BParameterName(TEXT("Transition 2")) 17 | { 18 | #if WITH_EDITORONLY_DATA 19 | ScenarioFlagsNameOverrides = TArray(); 20 | #endif 21 | } 22 | 23 | void UVisualUSettings::PostInitProperties() 24 | { 25 | Super::PostInitProperties(); 26 | 27 | #if WITH_EDITOR 28 | ApplyOverrides(); 29 | #endif 30 | } 31 | 32 | #if WITH_EDITOR 33 | void UVisualUSettings::PostEditChangeProperty(FPropertyChangedEvent& PropertyChangedEvent) 34 | { 35 | Super::PostEditChangeProperty(PropertyChangedEvent); 36 | 37 | const FName PropertyName = PropertyChangedEvent.GetMemberPropertyName(); 38 | if (PropertyName == GET_MEMBER_NAME_CHECKED(UVisualUSettings, ScenarioFlagsNameOverrides)) 39 | { 40 | ApplyOverrides(); 41 | } 42 | } 43 | 44 | void UVisualUSettings::ApplyOverrides() 45 | { 46 | UEnum* ScenarioFlags = StaticEnum(); 47 | check(ScenarioFlags); 48 | 49 | for (int32 i = 0; i < ScenarioFlagsNameOverrides.Num(); i++) 50 | { 51 | const FString NameOverride = ScenarioFlagsNameOverrides[i]; 52 | ScenarioFlags->SetMetaData(TEXT("DisplayName"), *NameOverride, i + CustomEnumOffset); 53 | } 54 | } 55 | 56 | void UVisualUSettings::ResetOverrides() 57 | { 58 | UEnum* ScenarioFlags = StaticEnum(); 59 | check(ScenarioFlags); 60 | 61 | const int32 NumCustomEnums = 5; 62 | ScenarioFlagsNameOverrides.Empty(NumCustomEnums); 63 | 64 | for (int32 i = 0; i < NumCustomEnums; i++) 65 | { 66 | const FString DefaultCustomEnumName = ScenarioFlags->GetAuthoredNameStringByIndex(i + CustomEnumOffset) 67 | .Replace(TEXT("_"), TEXT(" ")); 68 | ScenarioFlagsNameOverrides.Add(DefaultCustomEnumName); 69 | ScenarioFlags->SetMetaData(TEXT("DisplayName"), *DefaultCustomEnumName, i + CustomEnumOffset); 70 | } 71 | 72 | TryUpdateDefaultConfigFile(); 73 | } 74 | #endif 75 | -------------------------------------------------------------------------------- /docs/search/functions_c.js: -------------------------------------------------------------------------------- 1 | var searchData= 2 | [ 3 | ['pause_0',['Pause',['../class_u_visual_text_block.html#a93a69baaea38fb8c0da572e53bf508ab',1,'UVisualTextBlock']]], 4 | ['playnextletter_1',['PlayNextLetter',['../class_u_visual_text_block.html#ae27b50310167d1b60419293ac88341e9',1,'UVisualTextBlock']]], 5 | ['playssound_2',['PlaysSound',['../class_u_visual_controller.html#a3d91c2a28168cdfc3b4600adb4997cad',1,'UVisualController']]], 6 | ['playstransitions_3',['PlaysTransitions',['../class_u_visual_controller.html#a8f7d9820069f6376b4678585c9cd3825',1,'UVisualController']]], 7 | ['playtransition_4',['PlayTransition',['../class_u_background_visual_image.html#aecfe08d9e89bc1f8069445d20d17fb39',1,'UBackgroundVisualImage::PlayTransition(UPaperFlipbook *Target, UMaterialInstanceDynamic *Transition, bool bShouldAnimateTarget)'],['../class_u_background_visual_image.html#a36a71c9f4aa7016e8bea36a51e1e4790',1,'UBackgroundVisualImage::PlayTransition(UPaperFlipbook *Target, UMaterialInstanceDynamic *Transition, int32 FrameIndex)']]], 8 | ['postinitproperties_5',['PostInitProperties',['../class_u_visual_controller.html#a032a80f2b56eaa74b3deff19528d6b5e',1,'UVisualController::PostInitProperties()'],['../class_u_visual_u_settings.html#ad57500a068574c11f418cab5bfe681fb',1,'UVisualUSettings::PostInitProperties()']]], 9 | ['postslatedrawelementextension_6',['PostSlateDrawElementExtension',['../class_s_visual_image.html#af9672ce74666debebbd2289f53136a42',1,'SVisualImage::PostSlateDrawElementExtension()'],['../class_s_visual_image_base.html#a3a66a97364c6c1e9046d2ebb6c5bfd77',1,'SVisualImageBase::PostSlateDrawElementExtension()']]], 10 | ['preparescenes_7',['PrepareScenes',['../class_u_visual_controller.html#afd8d96b2624b82a5b9cefc194f496f60',1,'UVisualController']]], 11 | ['presave_8',['PreSave',['../class_u_visual_controller.html#a489779e1396d8bc99494516482012456',1,'UVisualController']]], 12 | ['preslatedrawelementextension_9',['PreSlateDrawElementExtension',['../class_s_visual_image.html#a9affd4e583b9af30d71e296d5b28ab42',1,'SVisualImage::PreSlateDrawElementExtension()'],['../class_s_visual_image_base.html#ace06885e33a507858a66a79b29d954ec',1,'SVisualImageBase::PreSlateDrawElementExtension()']]], 13 | ['printscenesdata_10',['PrintScenesData',['../class_u_visual_u_blueprint_statics.html#acbf5645426855b08cbc7998ad5b999b9',1,'UVisualUBlueprintStatics']]] 14 | ]; 15 | -------------------------------------------------------------------------------- /docs/navtreedata.js: -------------------------------------------------------------------------------- 1 | /* 2 | @licstart The following is the entire license notice for the JavaScript code in this file. 3 | 4 | The MIT License (MIT) 5 | 6 | Copyright (C) 1997-2020 by Dimitri van Heesch 7 | 8 | Permission is hereby granted, free of charge, to any person obtaining a copy of this software 9 | and associated documentation files (the "Software"), to deal in the Software without restriction, 10 | including without limitation the rights to use, copy, modify, merge, publish, distribute, 11 | sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is 12 | furnished to do so, subject to the following conditions: 13 | 14 | The above copyright notice and this permission notice shall be included in all copies or 15 | substantial portions of the Software. 16 | 17 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING 18 | BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 19 | NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, 20 | DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 21 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 22 | 23 | @licend The above is the entire license notice for the JavaScript code in this file 24 | */ 25 | var NAVTREE = 26 | [ 27 | [ "VisualU", "index.html", [ 28 | [ "Namespaces", "namespaces.html", [ 29 | [ "Namespace List", "namespaces.html", "namespaces_dup" ] 30 | ] ], 31 | [ "Concepts", "concepts.html", "concepts" ], 32 | [ "Classes", "annotated.html", [ 33 | [ "Class List", "annotated.html", "annotated_dup" ], 34 | [ "Class Index", "classes.html", null ], 35 | [ "Class Hierarchy", "hierarchy.html", "hierarchy" ], 36 | [ "Class Members", "functions.html", [ 37 | [ "All", "functions.html", "functions_dup" ], 38 | [ "Functions", "functions_func.html", "functions_func" ], 39 | [ "Variables", "functions_vars.html", null ] 40 | ] ] 41 | ] ] 42 | ] ] 43 | ]; 44 | 45 | var NAVTREEINDEX = 46 | [ 47 | "annotated.html", 48 | "class_u_visual_socket.html#ad9ac2408650836ae3944336af0a6a6fb" 49 | ]; 50 | 51 | var SYNCONMSG = 'click to disable panel synchronisation'; 52 | var SYNCOFFMSG = 'click to enable panel synchronisation'; -------------------------------------------------------------------------------- /docs/search/variables_1.js: -------------------------------------------------------------------------------- 1 | var searchData= 2 | [ 3 | ['background_0',['Background',['../struct_f_visual_scenario_info.html#a61a6874ebc0f4967e7715ead12c3deef',1,'FVisualScenarioInfo::Background'],['../class_u_visual_renderer.html#a9c14addab32fb644ff35a6b0635ee3d5',1,'UVisualRenderer::Background']]], 4 | ['backgroundartinfo_1',['BackgroundArtInfo',['../struct_f_background.html#a24ae2bed9091b63c7e740ac6b1561072',1,'FBackground']]], 5 | ['banimate_2',['bAnimate',['../class_s_visual_image.html#ac5695dc7687d831599d6243da2c561f2',1,'SVisualImage::bAnimate'],['../struct_f_visual_image_info.html#a36f490704c6b20fb5ea881e8f7019053',1,'FVisualImageInfo::bAnimate'],['../class_u_visual_image.html#a485c07c3e1d7cf0e9ed63e8ce202e51c',1,'UVisualImage::bAnimate']]], 6 | ['bautopositioning_3',['bAutoPositioning',['../class_u_visual_socket.html#a44a081a6541fff426271e3740713986a',1,'UVisualSocket']]], 7 | ['bhasfinishedplaying_4',['bHasFinishedPlaying',['../class_u_visual_text_block.html#aa3e36d0115b873b9feaf9deb4eec728e',1,'UVisualTextBlock']]], 8 | ['bissecondtransition_5',['bIsSecondTransition',['../class_u_m_e___transition_parameter2_d.html#a9b33574aac624109d32317ef733ce85c',1,'UME_TransitionParameter2D']]], 9 | ['bistargetanimated_6',['bIsTargetAnimated',['../class_s_background_visual_image.html#a9ab97a04e8ba7e689c1506fd8bbdc9f2',1,'SBackgroundVisualImage']]], 10 | ['bistransitioning_7',['bIsTransitioning',['../class_s_background_visual_image.html#a2686d76c7b0ea870da55b267ad9e8376',1,'SBackgroundVisualImage']]], 11 | ['bparametername_8',['BParameterName',['../class_u_m_e___transition_parameter2_d.html#a3982eb0b445bd7001fdf39ab44f9dc63',1,'UME_TransitionParameter2D::BParameterName'],['../class_u_visual_u_settings.html#ad0809319b9846093ddf8e30df6882fdc',1,'UVisualUSettings::BParameterName']]], 12 | ['bplaysound_9',['bPlaySound',['../class_u_visual_controller.html#aec740c9612d3aa929191ba3d3f786b00',1,'UVisualController']]], 13 | ['bplaytransitions_10',['bPlayTransitions',['../class_u_visual_controller.html#a575eb1202c9cb864825ed807b09400d8',1,'UVisualController']]], 14 | ['breaktimer_11',['BreakTimer',['../class_f_break_visual_text_block_decorator.html#a0c6bfe7bab5c848dfd96f0ab24fc5f42',1,'FBreakVisualTextBlockDecorator']]], 15 | ['btagdiscovered_12',['bTagDiscovered',['../class_f_break_visual_text_block_decorator.html#a352f410a015f4e6cd9286676423f81db',1,'FBreakVisualTextBlockDecorator']]] 16 | ]; 17 | -------------------------------------------------------------------------------- /Source/VisualU/Public/BackgroundVisualImage.h: -------------------------------------------------------------------------------- 1 | // Copyright (c) 2025 Evgeny Shustov 2 | 3 | #pragma once 4 | 5 | #include "CoreMinimal.h" 6 | #include "VisualImage.h" 7 | #include "UObject/ObjectMacros.h" 8 | #include "InfoAssignable.h" 9 | #include "BackgroundVisualImage.generated.h" 10 | 11 | class SBackgroundVisualImage; 12 | class UMaterialInstanceDynamic; 13 | class UPaperFlipbook; 14 | class UTexture; 15 | 16 | /** 17 | * Visual image that supports transition effects through material. 18 | */ 19 | UCLASS() 20 | class UBackgroundVisualImage final : public UVisualImage 21 | { 22 | GENERATED_BODY() 23 | 24 | public: 25 | UBackgroundVisualImage(const FObjectInitializer& ObjectInitializer); 26 | 27 | /** 28 | * Releases memory allocated for slate widgets. 29 | * 30 | * @param bReleaseChildren should memory of child widgets be released 31 | */ 32 | virtual void ReleaseSlateResources(bool bReleaseChildren) override; 33 | 34 | /** 35 | * Stops ongoing transition. 36 | * Has no effect when called during stopped transition. 37 | */ 38 | void StopTransition(); 39 | 40 | /** 41 | * @return {@code false} when no transition is active. 42 | */ 43 | bool IsTransitioning() const; 44 | 45 | /** 46 | * Plays transition from UVisualImage::Flipbook to UBackgroundVisualImage::Target. 47 | * 48 | * @param Target New flipbook that would be displayed by this image after transition ends 49 | * @param Transition Material that serves as transition effect 50 | * @param bShouldAnimateTarget Whether or not UBackgroundVisualImage::Target 51 | * flipbook should be animated. 52 | * For not animated flipbooks, will display first frame 53 | * of the flipbook. 54 | */ 55 | void PlayTransition(UPaperFlipbook* Target, UMaterialInstanceDynamic* Transition, bool bShouldAnimateTarget); 56 | 57 | /** 58 | * Version for non-animated flipbooks. 59 | * 60 | * @see UBackgroundVisualImage::PlayTransition(UPaperFlipbook*, UMaterialInstanceDynamic*, bool) 61 | * 62 | * @param Target New flipbook that would be displayed by this image after transition ends 63 | * @param Transition Material that serves as transition effect 64 | * @param FrameIndex which frame to show after transition ends. 65 | */ 66 | void PlayTransition(UPaperFlipbook* Target, UMaterialInstanceDynamic* Transition, int32 FrameIndex); 67 | 68 | protected: 69 | /** 70 | * @return underlying slate widget 71 | */ 72 | virtual TSharedRef RebuildWidget() override; 73 | 74 | }; 75 | -------------------------------------------------------------------------------- /docs/search/all_d.js: -------------------------------------------------------------------------------- 1 | var searchData= 2 | [ 3 | ['pause_0',['Pause',['../class_u_visual_text_block.html#a93a69baaea38fb8c0da572e53bf508ab',1,'UVisualTextBlock']]], 4 | ['playnextletter_1',['PlayNextLetter',['../class_u_visual_text_block.html#ae27b50310167d1b60419293ac88341e9',1,'UVisualTextBlock']]], 5 | ['playssound_2',['PlaysSound',['../class_u_visual_controller.html#a3d91c2a28168cdfc3b4600adb4997cad',1,'UVisualController']]], 6 | ['playstransitions_3',['PlaysTransitions',['../class_u_visual_controller.html#a8f7d9820069f6376b4678585c9cd3825',1,'UVisualController']]], 7 | ['playtransition_4',['PlayTransition',['../class_u_background_visual_image.html#aecfe08d9e89bc1f8069445d20d17fb39',1,'UBackgroundVisualImage::PlayTransition(UPaperFlipbook *Target, UMaterialInstanceDynamic *Transition, bool bShouldAnimateTarget)'],['../class_u_background_visual_image.html#a36a71c9f4aa7016e8bea36a51e1e4790',1,'UBackgroundVisualImage::PlayTransition(UPaperFlipbook *Target, UMaterialInstanceDynamic *Transition, int32 FrameIndex)']]], 8 | ['position_5',['Position',['../struct_f_sprite.html#a2c809693994e7587afb0a223bf361344',1,'FSprite']]], 9 | ['postinitproperties_6',['PostInitProperties',['../class_u_visual_controller.html#a032a80f2b56eaa74b3deff19528d6b5e',1,'UVisualController::PostInitProperties()'],['../class_u_visual_u_settings.html#ad57500a068574c11f418cab5bfe681fb',1,'UVisualUSettings::PostInitProperties()']]], 10 | ['postslatedrawelementextension_7',['PostSlateDrawElementExtension',['../class_s_visual_image.html#af9672ce74666debebbd2289f53136a42',1,'SVisualImage::PostSlateDrawElementExtension()'],['../class_s_visual_image_base.html#a3a66a97364c6c1e9046d2ebb6c5bfd77',1,'SVisualImageBase::PostSlateDrawElementExtension()']]], 11 | ['preparescenes_8',['PrepareScenes',['../class_u_visual_controller.html#afd8d96b2624b82a5b9cefc194f496f60',1,'UVisualController']]], 12 | ['presave_9',['PreSave',['../class_u_visual_controller.html#a489779e1396d8bc99494516482012456',1,'UVisualController']]], 13 | ['preslatedrawelementextension_10',['PreSlateDrawElementExtension',['../class_s_visual_image.html#a9affd4e583b9af30d71e296d5b28ab42',1,'SVisualImage::PreSlateDrawElementExtension()'],['../class_s_visual_image_base.html#ace06885e33a507858a66a79b29d954ec',1,'SVisualImageBase::PreSlateDrawElementExtension()']]], 14 | ['printscenesdata_11',['PrintScenesData',['../class_u_visual_u_blueprint_statics.html#acbf5645426855b08cbc7998ad5b999b9',1,'UVisualUBlueprintStatics']]] 15 | ]; 16 | -------------------------------------------------------------------------------- /docs/search/functions_7.js: -------------------------------------------------------------------------------- 1 | var searchData= 2 | [ 3 | ['intrude_0',['Intrude',['../struct_f_scenario.html#a91958f538e550f1603d959b4a60c028d',1,'FScenario']]], 4 | ['isanimated_1',['IsAnimated',['../class_u_visual_image.html#acdd0ce9a1161c9e938e66580928aff61',1,'UVisualImage']]], 5 | ['isautomoving_2',['IsAutoMoving',['../class_u_visual_controller.html#aa44a2ea403f090ab1fb8bbb263eeb264',1,'UVisualController']]], 6 | ['isautopositioning_3',['IsAutoPositioning',['../class_u_visual_socket.html#aa2c41880947d8bdbe048683ddc541178',1,'UVisualSocket']]], 7 | ['iscurrentscenariohead_4',['IsCurrentScenarioHead',['../class_u_visual_controller.html#a35ebb8bc61449d9675907a875da2178e',1,'UVisualController']]], 8 | ['isfastmoving_5',['IsFastMoving',['../class_u_visual_controller.html#a878430bf9366601d6256fb55bb7825a6',1,'UVisualController']]], 9 | ['isflipbookloaded_6',['IsFlipbookLoaded',['../class_u_visual_image.html#a3feea8f44c5a859624dd725e454950b7',1,'UVisualImage']]], 10 | ['isflipbookloading_7',['IsFlipbookLoading',['../class_u_visual_image.html#a723a71a9790ff8658318097b0a7a55de',1,'UVisualImage']]], 11 | ['isidle_8',['IsIdle',['../class_u_visual_controller.html#a91a075f26af8bc923166b6b098c2a0cf',1,'UVisualController']]], 12 | ['isresourcevalid_9',['IsResourceValid',['../class_s_visual_image.html#aca243a2448edd8b15e81e9bb1526715a',1,'SVisualImage::IsResourceValid()'],['../class_s_visual_image_base.html#a827a66ffd886cf66ddd835343b23f369',1,'SVisualImageBase::IsResourceValid()']]], 13 | ['isscenarioexhausted_10',['IsScenarioExhausted',['../class_u_visual_controller.html#a21d21bb6af43afbcc3fdfbdd376b498b',1,'UVisualController']]], 14 | ['issceneexhausted_11',['IsSceneExhausted',['../class_u_visual_controller.html#a6c471e3e02a4d58be0c9e24e3f953b25',1,'UVisualController']]], 15 | ['istransitioning_12',['IsTransitioning',['../class_u_background_visual_image.html#a573e1e49c3652720380586ef003edc70',1,'UBackgroundVisualImage::IsTransitioning()'],['../class_s_background_visual_image.html#aa5f253fff43c3be1e804e51b3c82ea5b',1,'SBackgroundVisualImage::IsTransitioning()'],['../class_u_visual_controller.html#a1fa285c188bebb1d7d0825fcbdf51765',1,'UVisualController::IsTransitioning()']]], 16 | ['istransitioninprogress_13',['IsTransitionInProgress',['../class_u_visual_renderer.html#aae2e52ce399d0f3056a2b0f5315cf2bb',1,'UVisualRenderer']]], 17 | ['iswithchoice_14',['IsWithChoice',['../class_u_visual_controller.html#a90f1b7d7b6b1bd415be5ee7544e62cfc',1,'UVisualController']]] 18 | ]; 19 | -------------------------------------------------------------------------------- /Source/VisualU/Private/VisualU.cpp: -------------------------------------------------------------------------------- 1 | // Copyright (c) 2025 Evgeny Shustov 2 | 3 | #include "VisualU.h" 4 | #include "VisualUSettings.h" 5 | #if WITH_EDITOR 6 | #include "Developer/Settings/Public/ISettingsModule.h" 7 | #include "Developer/Settings/Public/ISettingsSection.h" 8 | #endif 9 | #if WITH_GAMEPLAY_DEBUGGER_CORE 10 | #include "GameplayDebugger.h" 11 | #endif 12 | #if WITH_GAMEPLAY_DEBUGGER 13 | #include "GameplayDebuggerCategory_VisualU.h" 14 | #endif 15 | 16 | #define LOCTEXT_NAMESPACE "VisualU" 17 | DEFINE_LOG_CATEGORY(LogVisualU); 18 | 19 | void FVisualUModule::StartupModule() 20 | { 21 | #if WITH_EDITOR 22 | if (ISettingsModule* SettingsModule = FModuleManager::GetModulePtr(TEXT("Settings"))) 23 | { 24 | SettingsSection = SettingsModule->RegisterSettings( 25 | TEXT("Project"), 26 | TEXT("Plugins"), 27 | TEXT("VisualUSettings"), 28 | LOCTEXT("VisualUSettingsName", "VisualU"), 29 | LOCTEXT("VisualUSettingsDescription", "Configure options for VisualU elements"), 30 | GetMutableDefault()); 31 | } 32 | #endif 33 | #if WITH_GAMEPLAY_DEBUGGER 34 | IGameplayDebugger& GameplayDebuggerModule = IGameplayDebugger::Get(); 35 | GameplayDebuggerModule.RegisterCategory(TEXT("VisualU"), IGameplayDebugger::FOnGetCategory::CreateStatic(&FGameplayDebuggerCategory_VisualU::MakeInstance)); 36 | GameplayDebuggerModule.NotifyCategoriesChanged(); 37 | #endif 38 | } 39 | 40 | void FVisualUModule::ShutdownModule() 41 | { 42 | #if WITH_EDITOR 43 | if (ISettingsModule* SettingsModule = FModuleManager::GetModulePtr(TEXT("Settings"))) 44 | { 45 | SettingsModule->UnregisterSettings(TEXT("Project"), TEXT("Plugins"), TEXT("VisualUSettings")); 46 | SettingsSection.Reset(); 47 | } 48 | #endif 49 | #if WITH_GAMEPLAY_DEBUGGER 50 | if (IGameplayDebugger::IsAvailable()) 51 | { 52 | IGameplayDebugger& GameplayDebuggerModule = IGameplayDebugger::Get(); 53 | GameplayDebuggerModule.UnregisterCategory(TEXT("VisualU")); 54 | GameplayDebuggerModule.NotifyCategoriesChanged(); 55 | } 56 | #endif 57 | } 58 | 59 | #if WITH_EDITOR 60 | const UVisualUSettings* FVisualUModule::GetVisualSettings() const 61 | { 62 | if (SettingsSection.IsValid()) 63 | { 64 | return StaticCast(SettingsSection->GetSettingsObject().Get()); 65 | } 66 | 67 | return nullptr; 68 | } 69 | #endif 70 | 71 | #undef LOCTEXT_NAMESPACE 72 | 73 | IMPLEMENT_MODULE(FVisualUModule, VisualU) 74 | -------------------------------------------------------------------------------- /Source/VisualU/Public/ME_TransitionParameter2D.h: -------------------------------------------------------------------------------- 1 | // Copyright (c) 2025 Evgeny Shustov 2 | 3 | #pragma once 4 | 5 | #include "CoreMinimal.h" 6 | #include "Materials/MaterialExpressionTextureSampleParameter2D.h" 7 | #include "ME_TransitionParameter2D.generated.h" 8 | 9 | class UMaterialInstanceDynamic; 10 | struct FPropertyChangedEvent; 11 | 12 | /** 13 | * Material node for transition materials. 14 | * Represents either first (currently rendered), or second (final target) 15 | * scene background in the material asset which serves as 16 | * transition effect. 17 | * Parameters are immutable in the node and can only be 18 | * switched by UME_TransitionParameter2D::bIsSecondTransition. 19 | * Parameter names, however can be changed in UVisualSettings 20 | * for all transition parameter nodes. 21 | */ 22 | UCLASS() 23 | class VISUALU_API UME_TransitionParameter2D : public UMaterialExpressionTextureSampleParameter2D 24 | { 25 | GENERATED_BODY() 26 | 27 | public: 28 | UME_TransitionParameter2D(const FObjectInitializer& ObjectInitializer = FObjectInitializer::Get()); 29 | 30 | /** 31 | * Applies given parameters to the provided dynamic material. 32 | * 33 | * @param MaterialToChange material that should render transition 34 | * @param Params parameters for the material instance 35 | * @return dynamic material instance with applied parameters 36 | */ 37 | static UMaterialInstanceDynamic* GetTransitionMaterial(UMaterialInstanceDynamic* MaterialToChange, const TMap& Params); 38 | 39 | /** 40 | * Whether or not this parameter node represents final sprite 41 | * that should be visualized after transition ends. 42 | */ 43 | UPROPERTY(EditAnywhere, Category = "VisualU") 44 | bool bIsSecondTransition; 45 | 46 | /** 47 | * Transition begins with this sprite. 48 | */ 49 | FName AParameterName; 50 | 51 | /** 52 | * Transition ends with this sprite. 53 | */ 54 | FName BParameterName; 55 | 56 | #if WITH_EDITOR 57 | /** 58 | * Changes captions of the node. 59 | * 60 | * @param OutCaptions Changed captions of the node 61 | */ 62 | virtual void GetCaption(TArray& OutCaptions) const override; 63 | 64 | /** 65 | * Parameter node can't be renamed. 66 | */ 67 | virtual bool CanRenameNode() const override { return false; } 68 | 69 | /** 70 | * Applies changes to the node made in editor. 71 | * 72 | * @param PropertyChangedEvent contains the changed property details 73 | */ 74 | virtual void PostEditChangeProperty(FPropertyChangedEvent& PropertyChangedEvent) override; 75 | #endif 76 | }; 77 | -------------------------------------------------------------------------------- /docs/search/all_1.js: -------------------------------------------------------------------------------- 1 | var searchData= 2 | [ 3 | ['background_0',['Background',['../struct_f_visual_scenario_info.html#a61a6874ebc0f4967e7715ead12c3deef',1,'FVisualScenarioInfo::Background'],['../class_u_visual_renderer.html#a9c14addab32fb644ff35a6b0635ee3d5',1,'UVisualRenderer::Background']]], 4 | ['backgroundartinfo_1',['BackgroundArtInfo',['../struct_f_background.html#a24ae2bed9091b63c7e740ac6b1561072',1,'FBackground']]], 5 | ['banimate_2',['bAnimate',['../class_s_visual_image.html#ac5695dc7687d831599d6243da2c561f2',1,'SVisualImage::bAnimate'],['../struct_f_visual_image_info.html#a36f490704c6b20fb5ea881e8f7019053',1,'FVisualImageInfo::bAnimate'],['../class_u_visual_image.html#a485c07c3e1d7cf0e9ed63e8ce202e51c',1,'UVisualImage::bAnimate']]], 6 | ['bautopositioning_3',['bAutoPositioning',['../class_u_visual_socket.html#a44a081a6541fff426271e3740713986a',1,'UVisualSocket']]], 7 | ['begindestroy_4',['BeginDestroy',['../class_u_visual_controller.html#a4c5d53d4cdb84d15bd6a0257fc52bb20',1,'UVisualController']]], 8 | ['bhasfinishedplaying_5',['bHasFinishedPlaying',['../class_u_visual_text_block.html#aa3e36d0115b873b9feaf9deb4eec728e',1,'UVisualTextBlock']]], 9 | ['bissecondtransition_6',['bIsSecondTransition',['../class_u_m_e___transition_parameter2_d.html#a9b33574aac624109d32317ef733ce85c',1,'UME_TransitionParameter2D']]], 10 | ['bistargetanimated_7',['bIsTargetAnimated',['../class_s_background_visual_image.html#a9ab97a04e8ba7e689c1506fd8bbdc9f2',1,'SBackgroundVisualImage']]], 11 | ['bistransitioning_8',['bIsTransitioning',['../class_s_background_visual_image.html#a2686d76c7b0ea870da55b267ad9e8376',1,'SBackgroundVisualImage']]], 12 | ['bparametername_9',['BParameterName',['../class_u_m_e___transition_parameter2_d.html#a3982eb0b445bd7001fdf39ab44f9dc63',1,'UME_TransitionParameter2D::BParameterName'],['../class_u_visual_u_settings.html#ad0809319b9846093ddf8e30df6882fdc',1,'UVisualUSettings::BParameterName']]], 13 | ['bplaysound_10',['bPlaySound',['../class_u_visual_controller.html#aec740c9612d3aa929191ba3d3f786b00',1,'UVisualController']]], 14 | ['bplaytransitions_11',['bPlayTransitions',['../class_u_visual_controller.html#a575eb1202c9cb864825ed807b09400d8',1,'UVisualController']]], 15 | ['breaktimer_12',['BreakTimer',['../class_f_break_visual_text_block_decorator.html#a0c6bfe7bab5c848dfd96f0ab24fc5f42',1,'FBreakVisualTextBlockDecorator']]], 16 | ['btagdiscovered_13',['bTagDiscovered',['../class_f_break_visual_text_block_decorator.html#a352f410a015f4e6cd9286676423f81db',1,'FBreakVisualTextBlockDecorator']]] 17 | ]; 18 | -------------------------------------------------------------------------------- /docs/class_u_visual_text_block.js: -------------------------------------------------------------------------------- 1 | var class_u_visual_text_block = 2 | [ 3 | [ "CalculateSegments", "class_u_visual_text_block.html#a2ad98392fa7123df66934ed128621ed5", null ], 4 | [ "CalculateWrappedString", "class_u_visual_text_block.html#adab83af85c94e1df80b56095ce21215e", null ], 5 | [ "ForceTypewriteToEnd", "class_u_visual_text_block.html#a7ccaca4376973c2709143c36db431be6", null ], 6 | [ "HasTypewriterFinished", "class_u_visual_text_block.html#a462795416025b4ef44c3a127b5c90840", null ], 7 | [ "OnPlayLetter", "class_u_visual_text_block.html#ac9a22631d929a4f4d86fa3579055cd13", null ], 8 | [ "OnTypewriterFinished", "class_u_visual_text_block.html#aa47702ec6ff3baba9bce10bc3f199efc", null ], 9 | [ "Pause", "class_u_visual_text_block.html#a93a69baaea38fb8c0da572e53bf508ab", null ], 10 | [ "PlayNextLetter", "class_u_visual_text_block.html#ae27b50310167d1b60419293ac88341e9", null ], 11 | [ "RebuildWidget", "class_u_visual_text_block.html#a4ae9828d207915c9d141e77b59cbdbdf", null ], 12 | [ "Resume", "class_u_visual_text_block.html#a4e12727305db12180acb729dfbcb0eab", null ], 13 | [ "Typewrite", "class_u_visual_text_block.html#a1d7824bd8ee504fa1930d2261e55c965", null ], 14 | [ "bHasFinishedPlaying", "class_u_visual_text_block.html#aa3e36d0115b873b9feaf9deb4eec728e", null ], 15 | [ "CachedLetterIndex", "class_u_visual_text_block.html#adb6132c856b790da36bb828ffc4a0895", null ], 16 | [ "CachedSegmentText", "class_u_visual_text_block.html#a4eddd39b8650be3f464d248d704ee977", null ], 17 | [ "CurrentLetterIndex", "class_u_visual_text_block.html#a8a691770383bee1f747a86d45050b665", null ], 18 | [ "CurrentLine", "class_u_visual_text_block.html#a0a663d085a33213723e22a6d8b20bdd0", null ], 19 | [ "CurrentSegmentIndex", "class_u_visual_text_block.html#a322f605be17a193a6e5d98d89dee62bf", null ], 20 | [ "EndHoldTime", "class_u_visual_text_block.html#a848f39c0004a6199772727fe61fb8518", null ], 21 | [ "LetterPlayTime", "class_u_visual_text_block.html#ac11fbfd7f6f94270d3059cb30b915ec3", null ], 22 | [ "LetterTimer", "class_u_visual_text_block.html#a443c1539f33a7a79be6872860064752c", null ], 23 | [ "MaxLetterIndex", "class_u_visual_text_block.html#a927d710c7d638af2f4302fcbc5cb7cf4", null ], 24 | [ "Segments", "class_u_visual_text_block.html#a302380cfa0482d38fd42c40b9222dd89", null ], 25 | [ "TextLayout", "class_u_visual_text_block.html#a24d6f3d88c8e0749933eb5a63c3d97e0", null ], 26 | [ "TextMarshaller", "class_u_visual_text_block.html#ad41bc127b7e3a093499aef3b1b99678d", null ] 27 | ]; -------------------------------------------------------------------------------- /Source/VisualU/Private/VisualSocket.cpp: -------------------------------------------------------------------------------- 1 | // Copyright (c) 2025 Evgeny Shustov 2 | 3 | 4 | #include "VisualSocket.h" 5 | #include "Components/PanelSlot.h" 6 | #include "SVisualSocket.h" 7 | #include "Components/ScaleBoxSlot.h" 8 | #include "Components/Image.h" 9 | #include "Components/WidgetSwitcher.h" 10 | #include "VisualImage.h" 11 | #include "PaperSprite.h" 12 | #include "PaperFlipbook.h" 13 | 14 | #define LOCTEXT_NAMESPACE "VisualU" 15 | 16 | UVisualSocket::UVisualSocket(const FObjectInitializer& ObjectInitializer) 17 | : Super(ObjectInitializer), 18 | SocketOffset(ForceInitToZero), 19 | bAutoPositioning(false), 20 | ImageDesiredPosition(ForceInitToZero), 21 | SlateVisualSocket(nullptr) 22 | { 23 | SetStretch(EStretch::Fill); 24 | } 25 | 26 | void UVisualSocket::SetSocketOffset(FVector2D InSocketPosition) 27 | { 28 | SocketOffset = InSocketPosition; 29 | } 30 | 31 | void UVisualSocket::SetAutoPositioning(bool ShouldAutoPosition) 32 | { 33 | bAutoPositioning = ShouldAutoPosition; 34 | } 35 | 36 | void UVisualSocket::SetImageDesiredPosition(FVector2D Position) 37 | { 38 | ImageDesiredPosition = Position; 39 | } 40 | 41 | #if WITH_EDITOR 42 | const FText UVisualSocket::GetPaletteCategory() 43 | { 44 | return LOCTEXT("VisualSocketCategory", "VisualU"); 45 | } 46 | #endif 47 | 48 | void UVisualSocket::SynchronizeProperties() 49 | { 50 | Super::SynchronizeProperties(); 51 | 52 | if (bAutoPositioning && GetChildrenCount() > 0) 53 | { 54 | UWidget* ChildWidget = GetChildAt(0); 55 | 56 | if (ChildWidget->IsA()) 57 | { 58 | UVisualImage* ChildImage = Cast(ChildWidget); 59 | if (SlateVisualSocket.IsValid()) 60 | { 61 | SlateVisualSocket->SetVisualImage(ChildImage); 62 | SlateVisualSocket->SetImageDesiredPosition(ImageDesiredPosition); 63 | } 64 | } 65 | } 66 | 67 | if (SlateVisualSocket.IsValid()) 68 | { 69 | SlateVisualSocket->SetSocketOffset(SocketOffset); 70 | } 71 | } 72 | 73 | void UVisualSocket::ReleaseSlateResources(bool bReleaseChildren) 74 | { 75 | Super::ReleaseSlateResources(bReleaseChildren); 76 | 77 | SlateVisualSocket.Reset(); 78 | } 79 | 80 | TSharedRef UVisualSocket::RebuildWidget() 81 | { 82 | SlateVisualSocket = SNew(SVisualSocket); 83 | MyScaleBox = SlateVisualSocket; 84 | 85 | if (GetChildrenCount() > 0) 86 | { 87 | Cast(GetContentSlot())->BuildSlot(MyScaleBox.ToSharedRef()); 88 | } 89 | 90 | return MyScaleBox.ToSharedRef(); 91 | } 92 | 93 | #undef LOCTEXT_NAMESPACE -------------------------------------------------------------------------------- /Source/VisualU/Public/VisualSprite.h: -------------------------------------------------------------------------------- 1 | // Copyright (c) 2025 Evgeny Shustov 2 | 3 | #pragma once 4 | 5 | #include "CoreMinimal.h" 6 | #include "Blueprint/UserWidget.h" 7 | #include "VisualImage.h" 8 | #include "VisualSprite.generated.h" 9 | 10 | class UWidgetBlueprintGeneratedClass; 11 | 12 | DECLARE_DYNAMIC_MULTICAST_DELEGATE(FOnSpriteDisappear); 13 | 14 | DECLARE_DYNAMIC_MULTICAST_DELEGATE(FOnSpriteAppear); 15 | 16 | /** 17 | * Class that represents a sprite that will be visualized by UVisualRenderer. 18 | * Sprite in VisualU is a widget which appearance is governed by UVisualImage 19 | * and lifetime is bound to the lifetime of the FScenario that is currently 20 | * active in UVisualController. It is represented by FSprite struct 21 | * in scene visual info. Visual sprite can contain scripts of a normal widget 22 | * and can be extended as some specific kind of sprite. 23 | */ 24 | UCLASS(meta = (ToolTip = "Class that represents a sprite that will be visualized by visual renderer.")) 25 | class VISUALU_API UVisualSprite : public UUserWidget 26 | { 27 | GENERATED_BODY() 28 | 29 | public: 30 | UVisualSprite(const FObjectInitializer& ObjectInitializer); 31 | 32 | /** 33 | * Releases memory allocated for slate widgets. 34 | * 35 | * @param bReleaseChildren should memory of child widgets be released 36 | */ 37 | virtual void ReleaseSlateResources(bool bReleaseChildren) override; 38 | 39 | /** 40 | * Assigns provided information to visual images of this sprite. 41 | * Default implementation will assign first image info 42 | * to the first visual image, which is the one closest 43 | * to the root of the {@code Widget tree}. 44 | * (In Widget designer, the top most visual image will be the first, 45 | * the down most will be the last). It will continue assigning fields 46 | * in this manner until there is no visual images left in the tree. 47 | * Any extra image info will be ignored. 48 | * \image html AssignVisualInfo_default.png 49 | */ 50 | UFUNCTION(BlueprintCallable, Category = "Visual Sprite", meta = (ToolTip = "Assigns provided information to visual images of this sprite.")) 51 | virtual void AssignSpriteInfo(const TArray& InInfo); 52 | 53 | /** 54 | * Called when sprite is removed from canvas in the renderer. 55 | */ 56 | UPROPERTY(BlueprintAssignable, Category = "Visual Sprite|Events") 57 | FOnSpriteDisappear OnSpriteDisappear; 58 | 59 | /** 60 | * Called when sprite is being drawn by the renderer. 61 | */ 62 | UPROPERTY(BlueprintAssignable, Category = "Visual Sprite|Events") 63 | FOnSpriteAppear OnSpriteAppear; 64 | }; 65 | -------------------------------------------------------------------------------- /docs/search/functions_2.js: -------------------------------------------------------------------------------- 1 | var searchData= 2 | [ 3 | ['calculatesegments_0',['CalculateSegments',['../class_u_visual_text_block.html#a2ad98392fa7123df66934ed128621ed5',1,'UVisualTextBlock']]], 4 | ['calculatewrappedstring_1',['CalculateWrappedString',['../class_u_visual_text_block.html#adab83af85c94e1df80b56095ce21215e',1,'UVisualTextBlock']]], 5 | ['canadvancescene_2',['CanAdvanceScene',['../class_u_visual_controller.html#ad656f490fa7a73ff8e5d696b7712e101',1,'UVisualController']]], 6 | ['cancelasyncload_3',['CancelAsyncLoad',['../class_u_visual_image.html#aff2c18c582102ae219d1416446d1d2e4',1,'UVisualImage']]], 7 | ['cancelautomove_4',['CancelAutoMove',['../class_u_visual_controller.html#ac8d92022ab7b43e4abaaa668787ebc73',1,'UVisualController']]], 8 | ['cancelfastmove_5',['CancelFastMove',['../class_u_visual_controller.html#ab2d433ee9f71f94b84692ed1df48a04e',1,'UVisualController']]], 9 | ['cancelnextscene_6',['CancelNextScene',['../class_u_visual_controller.html#a6248f4e4e67bbecdd768ac4d0cbda3ad',1,'UVisualController']]], 10 | ['canretractscene_7',['CanRetractScene',['../class_u_visual_controller.html#ae50c6bd8b92d44f0b049dd3bcaa43e45',1,'UVisualController']]], 11 | ['checkout_8',['Checkout',['../class_u_visual_versioning_subsystem.html#a3f1a05293e41cdfa58696dc244b53c25',1,'UVisualVersioningSubsystem']]], 12 | ['checkoutall_9',['CheckoutAll',['../class_u_visual_versioning_subsystem.html#a384e7b9d43a72678bcbaac822cf1b79e',1,'UVisualVersioningSubsystem']]], 13 | ['choose_10',['Choose',['../class_u_visual_u_blueprint_statics.html#a1a83455c4379d454f42d2fecf46a7816',1,'UVisualUBlueprintStatics']]], 14 | ['computedesiredsize_11',['ComputeDesiredSize',['../class_s_visual_image.html#a19e795e98177ac11103576c943d92c9f',1,'SVisualImage::ComputeDesiredSize()'],['../class_s_visual_socket.html#a9af049b8ab932af121712d245b0907d1',1,'SVisualSocket::ComputeDesiredSize()']]], 15 | ['computevolatility_12',['ComputeVolatility',['../class_s_visual_image.html#aac8ba105ff77a961f8bbf450c5b2d253',1,'SVisualImage']]], 16 | ['construct_13',['Construct',['../class_s_background_visual_image.html#a6feb4f02ea49d0c380c8c7cb8f872ab6',1,'SBackgroundVisualImage::Construct()'],['../class_s_visual_image.html#aff38174920096e31a3e83aad1ed25b9c',1,'SVisualImage::Construct()'],['../class_s_visual_socket.html#a7317d52f381e52d6d7caad38040cb48e',1,'SVisualSocket::Construct()']]], 17 | ['converttobrush_14',['ConvertToBrush',['../class_s_visual_image_base.html#a61ff0f8ce68665113aa21f328431be7d',1,'SVisualImageBase']]], 18 | ['createdecoratortext_15',['CreateDecoratorText',['../class_f_break_visual_text_block_decorator.html#ab8c4035592a0b88d181f7f763726cd33',1,'FBreakVisualTextBlockDecorator']]] 19 | ]; 20 | -------------------------------------------------------------------------------- /docs/search/all_0.js: -------------------------------------------------------------------------------- 1 | var searchData= 2 | [ 3 | ['accept_0',['Accept',['../struct_f_visual_scenario_info.html#ac5109f6581abdf3c264e527f9a2c0c92',1,'FVisualScenarioInfo::Accept()'],['../struct_f_visual_image_info.html#a76b8fefabbb8297d65470f2373caa35e',1,'FVisualImageInfo::Accept()']]], 4 | ['addreferencedobjects_1',['AddReferencedObjects',['../class_s_background_visual_image.html#a9c114521cee6c8e99fc73ced0b40b888',1,'SBackgroundVisualImage::AddReferencedObjects()'],['../class_s_visual_image.html#a3b67ce9e04fee0e09c07cca00f356210',1,'SVisualImage::AddReferencedObjects()']]], 5 | ['alterdatatable_2',['AlterDataTable',['../class_u_visual_versioning_subsystem.html#ad395e78159bf71da7bff04aec6c9ccd3',1,'UVisualVersioningSubsystem::AlterDataTable(const UDataTable *DataTable, const FName &SceneName, const FVisualScenarioInfo &Version)'],['../class_u_visual_versioning_subsystem.html#a41033457c89f8fcc98ce3c27b69ee497',1,'UVisualVersioningSubsystem::AlterDataTable(const UDataTable *DataTable, const FName &SceneName, V T::*... Members, const V &... Values)'],['../class_u_visual_versioning_subsystem.html#a20c5af58d8c5d0dcb0ae4182e5e73741',1,'UVisualVersioningSubsystem::AlterDataTable(FScenario *Scene, V T::*... Members, const V &... Values)']]], 6 | ['anchors_3',['Anchors',['../struct_f_sprite.html#a05cee273736dbe3caf0d273d6b402282',1,'FSprite']]], 7 | ['aparametername_4',['AParameterName',['../class_u_m_e___transition_parameter2_d.html#ad1b892ac4e671fe1ddc78fd17e8c2ab8',1,'UME_TransitionParameter2D::AParameterName'],['../class_u_visual_u_settings.html#ab3a4ac1a265201fa54b4e1b1bc7af876',1,'UVisualUSettings::AParameterName']]], 8 | ['assertnextsceneload_5',['AssertNextSceneLoad',['../class_u_visual_controller.html#aea158cdd8cf5efc7df3216317fab9751',1,'UVisualController']]], 9 | ['assignscenariovisualinfo_6',['AssignScenarioVisualInfo',['../struct_f_scenario.html#a646e5ad998c4fcf116ab6ba46fb3ef03',1,'FScenario']]], 10 | ['assignspriteinfo_7',['AssignSpriteInfo',['../class_u_visual_sprite.html#a0fa01c9d6eb5b9f12cb49715384bf07f',1,'UVisualSprite']]], 11 | ['assignvisualimageinfo_8',['AssignVisualImageInfo',['../class_u_visual_image.html#aff0d87016a2a8064ba64fd180d223fa8',1,'UVisualImage']]], 12 | ['asyncloadflipbook_9',['AsyncLoadFlipbook',['../class_u_visual_image.html#a3e0e60a6688375374a18ebafbc27df4f',1,'UVisualImage']]], 13 | ['author_10',['Author',['../struct_f_visual_scenario_info.html#a8cd0b66a7abbe5174da0b84394adf9cf',1,'FVisualScenarioInfo']]], 14 | ['automovedelay_11',['AutoMoveDelay',['../class_u_visual_controller.html#adbc480c4fcf508d55087fb1a96686c23',1,'UVisualController']]], 15 | ['automovehandle_12',['AutoMoveHandle',['../class_u_visual_controller.html#aa3578789a60bf274939c1ad02438beba',1,'UVisualController']]] 16 | ]; 17 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2024 Evgeny Shustov 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | 23 | ------------------------------------------------------------------------------------ 24 | 25 | ATTRIBUTIONS: 26 | 27 | Some code in the following files is licensed under the MIT License by Sam Bloomberg (@redxdev): https://github.com/redxdev/UnrealRichTextDialogueBox 28 | 29 | Source/VisualU/Public/VisualTextBlock.h 30 | Source/VisualU/Private/VisualTextBlock.cpp 31 | 32 | MIT License 33 | 34 | Copyright(c) 2021 Sam Bloomberg 35 | 36 | Permission is hereby granted, free of charge, to any person obtaining a copy 37 | of this software and associated documentation files(the "Software"), to deal 38 | in the Software without restriction, including without limitation the rights 39 | to use, copy, modify, merge, publish, distribute, sublicense, and /or sell 40 | copies of the Software, and to permit persons to whom the Software is 41 | furnished to do so, subject to the following conditions : 42 | 43 | The above copyright notice and this permission notice shall be included in all 44 | copies or substantial portions of the Software. 45 | 46 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 47 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 48 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.IN NO EVENT SHALL THE 49 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 50 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 51 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 52 | SOFTWARE. 53 | 54 | ------------------------------------------------------------------------------------ 55 | -------------------------------------------------------------------------------- /docs/search/functions_d.js: -------------------------------------------------------------------------------- 1 | var searchData= 2 | [ 3 | ['rebuildwidget_0',['RebuildWidget',['../class_u_background_visual_image.html#a139cd29b15e428b86ba9bba91a18157c',1,'UBackgroundVisualImage::RebuildWidget()'],['../class_u_visual_image.html#afe6c8bf95c7337a088ac903b36e42536',1,'UVisualImage::RebuildWidget()'],['../class_u_visual_renderer.html#a423fa256a2bb9a2d2a7a268cee55dfef',1,'UVisualRenderer::RebuildWidget()'],['../class_u_visual_socket.html#a4acf7365f9ac63313cbaf70b2af6ec90',1,'UVisualSocket::RebuildWidget()'],['../class_u_visual_text_block.html#a4ae9828d207915c9d141e77b59cbdbdf',1,'UVisualTextBlock::RebuildWidget()']]], 4 | ['releaseslateresources_1',['ReleaseSlateResources',['../class_u_background_visual_image.html#a3dd805ae503a7ad6ee181813d2ff9b05',1,'UBackgroundVisualImage::ReleaseSlateResources()'],['../class_u_visual_image.html#a9dd44871f750cd252615cd50637811a5',1,'UVisualImage::ReleaseSlateResources()'],['../class_u_visual_socket.html#a31a664b6da4a161cf1af23b411d10895',1,'UVisualSocket::ReleaseSlateResources()'],['../class_u_visual_sprite.html#a966c751cfaee68607ce703a8c775cc50',1,'UVisualSprite::ReleaseSlateResources()']]], 5 | ['removefromscreen_2',['RemoveFromScreen',['../class_u_visual_controller.html#a63fbf2e1faf4e5bb27291d289ed9e7c0',1,'UVisualController']]], 6 | ['requestadjacentscene_3',['RequestAdjacentScene',['../class_u_visual_controller.html#ae67fe03b885249bb7415aca40598b87f',1,'UVisualController']]], 7 | ['requestautomove_4',['RequestAutoMove',['../class_u_visual_controller.html#aedb6df536c5cf265e0f7cf3187f753ef',1,'UVisualController']]], 8 | ['requestfastmove_5',['RequestFastMove',['../class_u_visual_controller.html#adda59ec2daea21657f1f8a242f97a44a',1,'UVisualController']]], 9 | ['requestnextscene_6',['RequestNextScene',['../class_u_visual_controller.html#a4aaaeac531eac3f43758068a1466f6fa',1,'UVisualController']]], 10 | ['requestnode_7',['RequestNode',['../class_u_visual_controller.html#a3e1471d14ceb3108c7832a4c1ae7a1c0',1,'UVisualController']]], 11 | ['requestpreviousscene_8',['RequestPreviousScene',['../class_u_visual_controller.html#a2ff83c6c5a2be08d8e60e9bb44b4f5f0',1,'UVisualController']]], 12 | ['requestscenario_9',['RequestScenario',['../class_u_visual_controller.html#a2e543b6dfa6f2a1576160df04e4da292',1,'UVisualController']]], 13 | ['requestscene_10',['RequestScene',['../class_u_visual_controller.html#aa77ce6e5729d58afe299547bb262198e',1,'UVisualController']]], 14 | ['resolvescene_11',['ResolveScene',['../struct_f_scenario.html#ac5cf72e26607ea3ee7c55b506d123ef1',1,'FScenario']]], 15 | ['resume_12',['Resume',['../class_u_visual_text_block.html#a4e12727305db12180acb729dfbcb0eab',1,'UVisualTextBlock']]], 16 | ['rollbackto_13',['RollbackTo',['../class_u_visual_controller.html#a603f5c4c5c620453164ad29e03f508c2',1,'UVisualController']]] 17 | ]; 18 | -------------------------------------------------------------------------------- /docs/search/all_e.js: -------------------------------------------------------------------------------- 1 | var searchData= 2 | [ 3 | ['rebuildwidget_0',['RebuildWidget',['../class_u_background_visual_image.html#a139cd29b15e428b86ba9bba91a18157c',1,'UBackgroundVisualImage::RebuildWidget()'],['../class_u_visual_image.html#afe6c8bf95c7337a088ac903b36e42536',1,'UVisualImage::RebuildWidget()'],['../class_u_visual_renderer.html#a423fa256a2bb9a2d2a7a268cee55dfef',1,'UVisualRenderer::RebuildWidget()'],['../class_u_visual_socket.html#a4acf7365f9ac63313cbaf70b2af6ec90',1,'UVisualSocket::RebuildWidget()'],['../class_u_visual_text_block.html#a4ae9828d207915c9d141e77b59cbdbdf',1,'UVisualTextBlock::RebuildWidget()']]], 4 | ['releaseslateresources_1',['ReleaseSlateResources',['../class_u_background_visual_image.html#a3dd805ae503a7ad6ee181813d2ff9b05',1,'UBackgroundVisualImage::ReleaseSlateResources()'],['../class_u_visual_image.html#a9dd44871f750cd252615cd50637811a5',1,'UVisualImage::ReleaseSlateResources()'],['../class_u_visual_socket.html#a31a664b6da4a161cf1af23b411d10895',1,'UVisualSocket::ReleaseSlateResources()'],['../class_u_visual_sprite.html#a966c751cfaee68607ce703a8c775cc50',1,'UVisualSprite::ReleaseSlateResources()']]], 5 | ['removefromscreen_2',['RemoveFromScreen',['../class_u_visual_controller.html#a63fbf2e1faf4e5bb27291d289ed9e7c0',1,'UVisualController']]], 6 | ['renderer_3',['Renderer',['../class_u_visual_controller.html#a094c02bc723bce8a93e8cf785f195314',1,'UVisualController']]], 7 | ['requestadjacentscene_4',['RequestAdjacentScene',['../class_u_visual_controller.html#ae67fe03b885249bb7415aca40598b87f',1,'UVisualController']]], 8 | ['requestautomove_5',['RequestAutoMove',['../class_u_visual_controller.html#aedb6df536c5cf265e0f7cf3187f753ef',1,'UVisualController']]], 9 | ['requestfastmove_6',['RequestFastMove',['../class_u_visual_controller.html#adda59ec2daea21657f1f8a242f97a44a',1,'UVisualController']]], 10 | ['requestnextscene_7',['RequestNextScene',['../class_u_visual_controller.html#a4aaaeac531eac3f43758068a1466f6fa',1,'UVisualController']]], 11 | ['requestnode_8',['RequestNode',['../class_u_visual_controller.html#a3e1471d14ceb3108c7832a4c1ae7a1c0',1,'UVisualController']]], 12 | ['requestpreviousscene_9',['RequestPreviousScene',['../class_u_visual_controller.html#a2ff83c6c5a2be08d8e60e9bb44b4f5f0',1,'UVisualController']]], 13 | ['requestscenario_10',['RequestScenario',['../class_u_visual_controller.html#a2e543b6dfa6f2a1576160df04e4da292',1,'UVisualController']]], 14 | ['requestscene_11',['RequestScene',['../class_u_visual_controller.html#aa77ce6e5729d58afe299547bb262198e',1,'UVisualController']]], 15 | ['resolvescene_12',['ResolveScene',['../struct_f_scenario.html#ac5cf72e26607ea3ee7c55b506d123ef1',1,'FScenario']]], 16 | ['resume_13',['Resume',['../class_u_visual_text_block.html#a4e12727305db12180acb729dfbcb0eab',1,'UVisualTextBlock']]], 17 | ['rollbackto_14',['RollbackTo',['../class_u_visual_controller.html#a603f5c4c5c620453164ad29e03f508c2',1,'UVisualController']]] 18 | ]; 19 | -------------------------------------------------------------------------------- /docs/navtree.css: -------------------------------------------------------------------------------- 1 | #nav-tree .children_ul { 2 | margin:0; 3 | padding:4px; 4 | } 5 | 6 | #nav-tree ul { 7 | list-style:none outside none; 8 | margin:0px; 9 | padding:0px; 10 | } 11 | 12 | #nav-tree li { 13 | white-space:nowrap; 14 | margin:0px; 15 | padding:0px; 16 | } 17 | 18 | #nav-tree .plus { 19 | margin:0px; 20 | } 21 | 22 | #nav-tree .selected { 23 | background-image: url('tab_a.png'); 24 | background-repeat:repeat-x; 25 | color: var(--nav-text-active-color); 26 | text-shadow: var(--nav-text-active-shadow); 27 | } 28 | 29 | #nav-tree .selected .arrow { 30 | color: var(--nav-arrow-selected-color); 31 | text-shadow: none; 32 | } 33 | 34 | #nav-tree img { 35 | margin:0px; 36 | padding:0px; 37 | border:0px; 38 | vertical-align: middle; 39 | } 40 | 41 | #nav-tree a { 42 | text-decoration:none; 43 | padding:0px; 44 | margin:0px; 45 | } 46 | 47 | #nav-tree .label { 48 | margin:0px; 49 | padding:0px; 50 | font: 12px var(--font-family-nav); 51 | } 52 | 53 | #nav-tree .label a { 54 | padding:2px; 55 | } 56 | 57 | #nav-tree .selected a { 58 | text-decoration:none; 59 | color:var(--nav-text-active-color); 60 | } 61 | 62 | #nav-tree .children_ul { 63 | margin:0px; 64 | padding:0px; 65 | } 66 | 67 | #nav-tree .item { 68 | margin:0px; 69 | padding:0px; 70 | } 71 | 72 | #nav-tree { 73 | padding: 0px 0px; 74 | font-size:14px; 75 | overflow:auto; 76 | } 77 | 78 | #doc-content { 79 | overflow:auto; 80 | display:block; 81 | padding:0px; 82 | margin:0px; 83 | -webkit-overflow-scrolling : touch; /* iOS 5+ */ 84 | } 85 | 86 | #side-nav { 87 | padding:0 6px 0 0; 88 | margin: 0px; 89 | display:block; 90 | position: absolute; 91 | left: 0px; 92 | width: $width; 93 | overflow : hidden; 94 | } 95 | 96 | .ui-resizable .ui-resizable-handle { 97 | display:block; 98 | } 99 | 100 | .ui-resizable-e { 101 | background-image:var(--nav-splitbar-image); 102 | background-size:100%; 103 | background-repeat:repeat-y; 104 | background-attachment: scroll; 105 | cursor:ew-resize; 106 | height:100%; 107 | right:0; 108 | top:0; 109 | width:6px; 110 | } 111 | 112 | .ui-resizable-handle { 113 | display:none; 114 | font-size:0.1px; 115 | position:absolute; 116 | z-index:1; 117 | } 118 | 119 | #nav-tree-contents { 120 | margin: 6px 0px 0px 0px; 121 | } 122 | 123 | #nav-tree { 124 | background-repeat:repeat-x; 125 | background-color: var(--nav-background-color); 126 | -webkit-overflow-scrolling : touch; /* iOS 5+ */ 127 | } 128 | 129 | #nav-sync { 130 | position:absolute; 131 | top:5px; 132 | right:24px; 133 | z-index:0; 134 | } 135 | 136 | #nav-sync img { 137 | opacity:0.3; 138 | } 139 | 140 | #nav-sync img:hover { 141 | opacity:0.9; 142 | } 143 | 144 | @media print 145 | { 146 | #nav-tree { display: none; } 147 | div.ui-resizable-handle { display: none; position: relative; } 148 | } 149 | 150 | -------------------------------------------------------------------------------- /Source/VisualU/Private/BreakVisualTextBlockDecorator.cpp: -------------------------------------------------------------------------------- 1 | // Copyright (c) 2025 Evgeny Shustov 2 | 3 | 4 | #include "BreakVisualTextBlockDecorator.h" 5 | #include "Components/RichTextBlock.h" 6 | #include "Styling/SlateTypes.h" 7 | #include "VisualTextBlock.h" 8 | #include "TimerManager.h" 9 | 10 | FBreakVisualTextBlockDecorator::FBreakVisualTextBlockDecorator(UVisualTextBlock* InOwner) 11 | : Super(InOwner), 12 | BreakTimer(), 13 | TagPosition(0), 14 | bTagDiscovered(false) 15 | { 16 | } 17 | 18 | bool FBreakVisualTextBlockDecorator::Supports(const FTextRunParseResults& RunParseResult, const FString& Text) const 19 | { 20 | if (RunParseResult.Name == TEXT("b")) 21 | { 22 | int32 TagCharsCnt = 0; 23 | int32 CurrentIndex = RunParseResult.OriginalRange.BeginIndex; 24 | while ((CurrentIndex = Text.Find(TEXT("/>"), ESearchCase::IgnoreCase, ESearchDir::FromEnd, CurrentIndex)) != INDEX_NONE) 25 | { 26 | int32 NumChars = 0; 27 | int32 TagStartIndex = Text.Find(TEXT("<"), ESearchCase::IgnoreCase, ESearchDir::FromEnd, CurrentIndex); 28 | 29 | const bool bIsEnclosingTag = TagStartIndex + 1 == CurrentIndex; 30 | if (bIsEnclosingTag) 31 | { 32 | const int32 StyleTagEnd = Text.Find(TEXT(">"), ESearchCase::IgnoreCase, ESearchDir::FromEnd, TagStartIndex); 33 | TagStartIndex = Text.Find(TEXT("<"), ESearchCase::IgnoreCase, ESearchDir::FromEnd, StyleTagEnd); 34 | //four is the number of metacharacters 35 | NumChars = (StyleTagEnd - TagStartIndex) + 4; 36 | } 37 | else 38 | { 39 | //two is the number of metacharacters 40 | NumChars = (CurrentIndex - TagStartIndex) + 2; 41 | } 42 | 43 | //Found metadata which means tag is replaced with something, consider it a character 44 | if (Text.Find(TEXT("=\""), ESearchCase::IgnoreCase, ESearchDir::FromStart, TagStartIndex) != INDEX_NONE) 45 | { 46 | NumChars--; 47 | } 48 | 49 | check(NumChars >= 0); 50 | TagCharsCnt += NumChars; 51 | CurrentIndex -= 2; 52 | } 53 | TagPosition = RunParseResult.OriginalRange.BeginIndex - TagCharsCnt + 1; 54 | return true; 55 | } 56 | 57 | return false; 58 | } 59 | 60 | void FBreakVisualTextBlockDecorator::CreateDecoratorText(const FTextRunInfo& RunInfo, FTextBlockStyle& InOutTextStyle, FString& InOutString) const 61 | { 62 | if (ensure(TagPosition > 0)) 63 | { 64 | UVisualTextBlock* VisualTextBlock = ExactCast(Owner); 65 | check(VisualTextBlock); 66 | 67 | UWorld* World = VisualTextBlock->GetWorld(); 68 | check(World); 69 | 70 | FTimerManager& TimerManager = World->GetTimerManager(); 71 | 72 | if (!bTagDiscovered) 73 | { 74 | const float BreakDelay = TagPosition * VisualTextBlock->LetterPlayTime; 75 | TimerManager.SetTimer(BreakTimer, FTimerDelegate::CreateUObject(VisualTextBlock, &UVisualTextBlock::Pause), BreakDelay, /*InbLoop*/false); 76 | bTagDiscovered = true; 77 | } 78 | } 79 | } 80 | 81 | FBreakVisualTextBlockDecorator::FBreakVisualTextBlockDecorator(URichTextBlock* InOwner) 82 | : Super(InOwner), 83 | BreakTimer(), 84 | TagPosition(0), 85 | bTagDiscovered(false) 86 | { 87 | } -------------------------------------------------------------------------------- /docs/search/all_8.js: -------------------------------------------------------------------------------- 1 | var searchData= 2 | [ 3 | ['iinfoassignable_0',['IInfoAssignable',['../class_i_info_assignable.html',1,'']]], 4 | ['imagedesiredposition_1',['ImageDesiredPosition',['../class_s_visual_socket.html#a7896c1a1c1dbeffa8066fec4226cd006',1,'SVisualSocket::ImageDesiredPosition'],['../class_u_visual_socket.html#a963208d8dfe3c4c594e088e81667d694',1,'UVisualSocket::ImageDesiredPosition']]], 5 | ['index_2',['Index',['../struct_f_scenario.html#ae32b136b41b749c0b575672066e1812b',1,'FScenario']]], 6 | ['info_3',['Info',['../struct_f_scenario.html#add30ca76b5404432c2e0ca01e03338ed',1,'FScenario']]], 7 | ['intrude_4',['Intrude',['../struct_f_scenario.html#a91958f538e550f1603d959b4a60c028d',1,'FScenario']]], 8 | ['isanimated_5',['IsAnimated',['../class_u_visual_image.html#acdd0ce9a1161c9e938e66580928aff61',1,'UVisualImage']]], 9 | ['isautomoving_6',['IsAutoMoving',['../class_u_visual_controller.html#aa44a2ea403f090ab1fb8bbb263eeb264',1,'UVisualController']]], 10 | ['isautopositioning_7',['IsAutoPositioning',['../class_u_visual_socket.html#aa2c41880947d8bdbe048683ddc541178',1,'UVisualSocket']]], 11 | ['iscurrentscenariohead_8',['IsCurrentScenarioHead',['../class_u_visual_controller.html#a35ebb8bc61449d9675907a875da2178e',1,'UVisualController']]], 12 | ['isfastmoving_9',['IsFastMoving',['../class_u_visual_controller.html#a878430bf9366601d6256fb55bb7825a6',1,'UVisualController']]], 13 | ['isflipbookloaded_10',['IsFlipbookLoaded',['../class_u_visual_image.html#a3feea8f44c5a859624dd725e454950b7',1,'UVisualImage']]], 14 | ['isflipbookloading_11',['IsFlipbookLoading',['../class_u_visual_image.html#a723a71a9790ff8658318097b0a7a55de',1,'UVisualImage']]], 15 | ['isidle_12',['IsIdle',['../class_u_visual_controller.html#a91a075f26af8bc923166b6b098c2a0cf',1,'UVisualController']]], 16 | ['isresourcevalid_13',['IsResourceValid',['../class_s_visual_image.html#aca243a2448edd8b15e81e9bb1526715a',1,'SVisualImage::IsResourceValid()'],['../class_s_visual_image_base.html#a827a66ffd886cf66ddd835343b23f369',1,'SVisualImageBase::IsResourceValid()']]], 17 | ['isscenarioexhausted_14',['IsScenarioExhausted',['../class_u_visual_controller.html#a21d21bb6af43afbcc3fdfbdd376b498b',1,'UVisualController']]], 18 | ['issceneexhausted_15',['IsSceneExhausted',['../class_u_visual_controller.html#a6c471e3e02a4d58be0c9e24e3f953b25',1,'UVisualController']]], 19 | ['istransitioning_16',['IsTransitioning',['../class_u_background_visual_image.html#a573e1e49c3652720380586ef003edc70',1,'UBackgroundVisualImage::IsTransitioning()'],['../class_s_background_visual_image.html#aa5f253fff43c3be1e804e51b3c82ea5b',1,'SBackgroundVisualImage::IsTransitioning()'],['../class_u_visual_controller.html#a1fa285c188bebb1d7d0825fcbdf51765',1,'UVisualController::IsTransitioning()']]], 20 | ['istransitioninprogress_17',['IsTransitionInProgress',['../class_u_visual_renderer.html#aae2e52ce399d0f3056a2b0f5315cf2bb',1,'UVisualRenderer']]], 21 | ['iswithchoice_18',['IsWithChoice',['../class_u_visual_controller.html#a90f1b7d7b6b1bd415be5ee7544e62cfc',1,'UVisualController']]], 22 | ['ivisualcontrollerinterface_19',['IVisualControllerInterface',['../class_i_visual_controller_interface.html',1,'']]] 23 | ]; 24 | -------------------------------------------------------------------------------- /docs/folderopend.svg: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | -------------------------------------------------------------------------------- /docs/search/all_10.js: -------------------------------------------------------------------------------- 1 | var searchData= 2 | [ 3 | ['tagposition_0',['TagPosition',['../class_f_break_visual_text_block_decorator.html#aa11d94ef37b093a86e5abc43c72fb4f9',1,'FBreakVisualTextBlockDecorator']]], 4 | ['target_1',['Target',['../class_s_background_visual_image.html#aec2277e2f9b7e932b70961d7cf820e57',1,'SBackgroundVisualImage']]], 5 | ['targetframeindex_2',['TargetFrameIndex',['../class_s_background_visual_image.html#ae53412188050c9d4a7b8994f68721ef1',1,'SBackgroundVisualImage']]], 6 | ['textlayout_3',['TextLayout',['../class_u_visual_text_block.html#a24d6f3d88c8e0749933eb5a63c3d97e0',1,'UVisualTextBlock']]], 7 | ['textmarshaller_4',['TextMarshaller',['../class_u_visual_text_block.html#ad41bc127b7e3a093499aef3b1b99678d',1,'UVisualTextBlock']]], 8 | ['toflipbook_5',['ToFlipbook',['../class_u_visual_image.html#a65aefccf789bac9a43c5667886240b63',1,'UVisualImage']]], 9 | ['tostring_6',['ToString',['../struct_f_visual_info.html#a7325c2f51f9b2598526049bf5ec733c8',1,'FVisualInfo::ToString'],['../struct_f_sprite.html#a58f57f3792dccc4dcdb7865ce348c0d7',1,'FSprite::ToString()'],['../struct_f_background.html#ae8c64926c63e62ce38d1c42d724e4c4f',1,'FBackground::ToString()'],['../struct_f_visual_scenario_info.html#ae1e8cdefc9e8f40229c8d7c728b74f27',1,'FVisualScenarioInfo::ToString()'],['../struct_f_scenario.html#a0d215a7d1a1e90ad53ccc902ae52d286',1,'FScenario::ToString()'],['../struct_f_visual_anchors.html#ad8bfdc4f37a8022848c07f19b222949a',1,'FVisualAnchors::ToString()'],['../struct_f_visual_margin.html#a299d62f4fe58483a4ab0863c520c8fb4',1,'FVisualMargin::ToString()'],['../struct_f_visual_image_info.html#a22384b4ec4c8d8685757624663116212',1,'FVisualImageInfo::ToString()']]], 10 | ['transition_7',['Transition',['../class_s_background_visual_image.html#a030e6488f721fbf836817445a1e150f8',1,'SBackgroundVisualImage::Transition'],['../class_u_visual_renderer.html#adc498138aadcc932bebd201fa166313d',1,'UVisualRenderer::Transition']]], 11 | ['transitionduration_8',['TransitionDuration',['../class_u_visual_u_settings.html#a7fbed77e7808b3c971dd2a2898ce6f31',1,'UVisualUSettings']]], 12 | ['transitionhandle_9',['TransitionHandle',['../class_u_visual_renderer.html#a2a0819679ebad403d79c174381e53565',1,'UVisualRenderer']]], 13 | ['transitionmaterial_10',['TransitionMaterial',['../struct_f_background.html#a7d852002f7a301bc55257cf118ae8cc8',1,'FBackground']]], 14 | ['transitionmpc_11',['TransitionMPC',['../class_u_visual_u_settings.html#a0797ca53cc101414db786f0d5cfb2085',1,'UVisualUSettings']]], 15 | ['trydrawtransition_12',['TryDrawTransition',['../class_u_visual_renderer.html#a1700f5e9a6c9bb4575651de19534ac22',1,'UVisualRenderer']]], 16 | ['trygetvisualversioningsubsystem_13',['TryGetVisualVersioningSubsystem',['../class_u_visual_controller.html#a9070227c05897d1083599735840d2276',1,'UVisualController']]], 17 | ['tryplayscenesound_14',['TryPlaySceneSound',['../class_u_visual_controller.html#a31d5c6ec38889b007552918ecfed6e3a',1,'UVisualController']]], 18 | ['tryplaytransition_15',['TryPlayTransition',['../class_u_visual_controller.html#a1889a5682e0f09726dfdc7a3e2e86295',1,'UVisualController']]], 19 | ['typewrite_16',['Typewrite',['../class_u_visual_text_block.html#a1d7824bd8ee504fa1930d2261e55c965',1,'UVisualTextBlock']]] 20 | ]; 21 | -------------------------------------------------------------------------------- /docs/clipboard.js: -------------------------------------------------------------------------------- 1 | /** 2 | 3 | The code below is based on the Doxygen Awesome project, see 4 | https://github.com/jothepro/doxygen-awesome-css 5 | 6 | MIT License 7 | 8 | Copyright (c) 2021 - 2022 jothepro 9 | 10 | Permission is hereby granted, free of charge, to any person obtaining a copy 11 | of this software and associated documentation files (the "Software"), to deal 12 | in the Software without restriction, including without limitation the rights 13 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 14 | copies of the Software, and to permit persons to whom the Software is 15 | furnished to do so, subject to the following conditions: 16 | 17 | The above copyright notice and this permission notice shall be included in all 18 | copies or substantial portions of the Software. 19 | 20 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 21 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 22 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 23 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 24 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 25 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 26 | SOFTWARE. 27 | 28 | */ 29 | 30 | let clipboard_title = "Copy to clipboard" 31 | let clipboard_icon = `` 32 | let clipboard_successIcon = `` 33 | let clipboard_successDuration = 1000 34 | 35 | $(function() { 36 | if(navigator.clipboard) { 37 | const fragments = document.getElementsByClassName("fragment") 38 | for(const fragment of fragments) { 39 | const clipboard_div = document.createElement("div") 40 | clipboard_div.classList.add("clipboard") 41 | clipboard_div.innerHTML = clipboard_icon 42 | clipboard_div.title = clipboard_title 43 | $(clipboard_div).click(function() { 44 | const content = this.parentNode.cloneNode(true) 45 | // filter out line number and folded fragments from file listings 46 | content.querySelectorAll(".lineno, .ttc, .foldclosed").forEach((node) => { node.remove() }) 47 | let text = content.textContent 48 | // remove trailing newlines and trailing spaces from empty lines 49 | text = text.replace(/^\s*\n/gm,'\n').replace(/\n*$/,'') 50 | navigator.clipboard.writeText(text); 51 | this.classList.add("success") 52 | this.innerHTML = clipboard_successIcon 53 | window.setTimeout(() => { // switch back to normal icon after timeout 54 | this.classList.remove("success") 55 | this.innerHTML = clipboard_icon 56 | }, clipboard_successDuration); 57 | }) 58 | fragment.insertBefore(clipboard_div, fragment.firstChild) 59 | } 60 | } 61 | }) 62 | -------------------------------------------------------------------------------- /docs/folderopen.svg: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 6 | 9 | 10 | 11 | 16 | 17 | 18 | -------------------------------------------------------------------------------- /docs/class_u_visual_image.js: -------------------------------------------------------------------------------- 1 | var class_u_visual_image = 2 | [ 3 | [ "AssignVisualImageInfo", "class_u_visual_image.html#aff0d87016a2a8064ba64fd180d223fa8", null ], 4 | [ "AsyncLoadFlipbook", "class_u_visual_image.html#a3e0e60a6688375374a18ebafbc27df4f", null ], 5 | [ "CancelAsyncLoad", "class_u_visual_image.html#aff2c18c582102ae219d1416446d1d2e4", null ], 6 | [ "GetColorAndOpacity", "class_u_visual_image.html#a922a46f495a6118ffd4a721fb039bc9f", null ], 7 | [ "GetCurrentSprite", "class_u_visual_image.html#af00874e90a3f303f82dae8b157d8c154", null ], 8 | [ "GetDesiredScale", "class_u_visual_image.html#ad24c4e693b59df57b500f3810bf4e9e6", null ], 9 | [ "GetFlipbook", "class_u_visual_image.html#af52ec54ef834f6d24c0e9fa0acbd5661", null ], 10 | [ "GetFrameIndex", "class_u_visual_image.html#a5cf3139ba963f696604e2edb12b1df3e", null ], 11 | [ "GetMirrorScale", "class_u_visual_image.html#a5ff702bc2aab4b0403fd4cc37447b8a1", null ], 12 | [ "IsAnimated", "class_u_visual_image.html#acdd0ce9a1161c9e938e66580928aff61", null ], 13 | [ "IsFlipbookLoaded", "class_u_visual_image.html#a3feea8f44c5a859624dd725e454950b7", null ], 14 | [ "IsFlipbookLoading", "class_u_visual_image.html#a723a71a9790ff8658318097b0a7a55de", null ], 15 | [ "RebuildWidget", "class_u_visual_image.html#afe6c8bf95c7337a088ac903b36e42536", null ], 16 | [ "ReleaseSlateResources", "class_u_visual_image.html#a9dd44871f750cd252615cd50637811a5", null ], 17 | [ "SetAnimate", "class_u_visual_image.html#af4e2b1c4b2537ea19a3e3e1b1f37958a", null ], 18 | [ "SetColorAndOpacity", "class_u_visual_image.html#ae3c537e486cf55f29feea337c101399c", null ], 19 | [ "SetDesiredScale", "class_u_visual_image.html#a395c92e9a42a1fc1d9ad2f3b6069e464", null ], 20 | [ "SetFlipbook", "class_u_visual_image.html#ad9b9a540b8335cfa0b0d9a7d79357238", null ], 21 | [ "SetFlipbookAsync", "class_u_visual_image.html#ab521042e57ee30ae475cfe999a9831f6", null ], 22 | [ "SetFrameIndex", "class_u_visual_image.html#af84e9da43734226a3542cb0e447fe99d", null ], 23 | [ "SetMirrorScale", "class_u_visual_image.html#a4fb5ca0a805ae2d85d5c7190b08c2f57", null ], 24 | [ "SynchronizeProperties", "class_u_visual_image.html#abd42e6a8936ca5bb6fcd9907036b80bc", null ], 25 | [ "ToFlipbook", "class_u_visual_image.html#a65aefccf789bac9a43c5667886240b63", null ], 26 | [ "bAnimate", "class_u_visual_image.html#a485c07c3e1d7cf0e9ed63e8ce202e51c", null ], 27 | [ "ColorAndOpacity", "class_u_visual_image.html#a608a5a0dcec36f660fc09c29d4bf1396", null ], 28 | [ "ColorAndOpacityDelegate", "class_u_visual_image.html#ab260f494159af5eb2c19d7c2d1469e7d", null ], 29 | [ "DesiredScale", "class_u_visual_image.html#a0e3621c8bcf4486f90fcad4c29343915", null ], 30 | [ "Flipbook", "class_u_visual_image.html#ad9d66b01dee20695e36d0af6882582d4", null ], 31 | [ "FlipbookDelegate", "class_u_visual_image.html#a36d31e55a1adc32828ed33b98988ec1e", null ], 32 | [ "FlipbookHandle", "class_u_visual_image.html#a1a4ebf5de4e731576b4b2c5afd35e418", null ], 33 | [ "FrameIndex", "class_u_visual_image.html#ab45c874fa35b2539fde66814a1f16d28", null ], 34 | [ "MirrorScale", "class_u_visual_image.html#acff966245652515ef1ec12e2220186d6", null ], 35 | [ "VisualImageSlate", "class_u_visual_image.html#ab233653f890d0bdc7c20ff7685d96f8e", null ] 36 | ]; -------------------------------------------------------------------------------- /Source/VisualU/Public/SBackgroundVisualImage.h: -------------------------------------------------------------------------------- 1 | // Copyright (c) 2025 Evgeny Shustov 2 | 3 | #pragma once 4 | 5 | #include "CoreMinimal.h" 6 | #include "SVisualImage.h" 7 | 8 | class UMaterialInstanceDynamic; 9 | class UPaperFlipbook; 10 | class UPaperSprite; 11 | class UTexture; 12 | 13 | /** 14 | * Slate visual image that supports transition effects through material. 15 | */ 16 | class VISUALU_API SBackgroundVisualImage final : public SVisualImage 17 | { 18 | 19 | SLATE_DECLARE_WIDGET(SBackgroundVisualImage, SVisualImage) 20 | 21 | SLATE_BEGIN_ARGS(SBackgroundVisualImage) : _IsTransitioning(false), _IsTargetAnimated(false), _TargetFrameIndex(0) {} 22 | 23 | SLATE_ARGUMENT(bool, IsTransitioning) 24 | 25 | SLATE_ARGUMENT(bool, IsTargetAnimated) 26 | 27 | SLATE_ARGUMENT(int32, TargetFrameIndex) 28 | 29 | SLATE_ATTRIBUTE(UMaterialInstanceDynamic*, Transition) 30 | 31 | SLATE_ATTRIBUTE(UPaperFlipbook*, Target) 32 | 33 | SLATE_END_ARGS() 34 | 35 | public: 36 | SBackgroundVisualImage(); 37 | 38 | /** 39 | * Constructor call for slate declarative syntax. 40 | * 41 | * @param Args slate arguments 42 | */ 43 | void Construct(const FArguments& Args); 44 | 45 | /** 46 | * @see UBackgroundVisualImage::StartTransition(UPaperFlipbook*, UMaterialInstanceDynamic*, bool) 47 | */ 48 | void StartTransition(UPaperFlipbook* TargetFlipbook, UMaterialInstanceDynamic* TransitionMaterial, bool bShouldAnimateTarget); 49 | 50 | /** 51 | * @see UBackgroundVisualImage::StartTransition(UPaperFlipbook*, UMaterialInstanceDynamic*, int32) 52 | */ 53 | void StartTransition(UPaperFlipbook* TargetFlipbook, UMaterialInstanceDynamic* TransitionMaterial, int32 FrameIndex); 54 | 55 | /** 56 | * @see UBackgroundVisualImage::StopTransition() 57 | */ 58 | void StopTransition(); 59 | 60 | /** 61 | * @see UBackgroundVisualImage::IsTransitioning() 62 | */ 63 | FORCEINLINE bool IsTransitioning() const { return bIsTransitioning; } 64 | 65 | protected: 66 | /** 67 | * @see SVisualImage::AddReferencedObjects() 68 | */ 69 | virtual void AddReferencedObjects(FReferenceCollector& Collector) override; 70 | 71 | /** 72 | * @see SVisualImage::GetReferencerName() 73 | */ 74 | virtual FString GetReferencerName() const override; 75 | 76 | private: 77 | /** 78 | * @see SVisualImageBase::GetFinalResource() 79 | */ 80 | virtual UObject* GetFinalResource() const override; 81 | 82 | /** 83 | * Retrieves sprite from SBackgroundVisualImage::Target. 84 | */ 85 | UPaperSprite* GetTargetSprite() const; 86 | 87 | private: 88 | /** 89 | * Material instance to be rendered as transition. 90 | */ 91 | TSlateAttribute Transition; 92 | 93 | /** 94 | * Sprite that will be rendered after transition ends. 95 | */ 96 | TSlateAttribute Target; 97 | 98 | /** 99 | * @see UBackgroundVisualImage::IsTransitioning() 100 | */ 101 | bool bIsTransitioning; 102 | 103 | /** 104 | * @see UBackgroundVisualImage::StartTransition(UPaperFlipbook*, UMaterialInstanceDynamic*, bool) 105 | */ 106 | bool bIsTargetAnimated; 107 | 108 | /** 109 | * @see UBackgroundVisualImage::StartTransition(UPaperFlipbook*, UMaterialInstanceDynamic*, int32) 110 | */ 111 | int32 TargetFrameIndex; 112 | }; 113 | -------------------------------------------------------------------------------- /Source/VisualU/Public/SVisualSocket.h: -------------------------------------------------------------------------------- 1 | // Copyright (c) 2025 Evgeny Shustov 2 | 3 | #pragma once 4 | 5 | #include "CoreMinimal.h" 6 | #include "Animation/CurveSequence.h" 7 | #include "Widgets/Layout/SScaleBox.h" 8 | 9 | class UVisualImage; 10 | 11 | /** 12 | * Slate widget that acts as a socket for the child widget 13 | * with additional features for UVisualImage. 14 | * 15 | * @see UVisualSocket 16 | */ 17 | class VISUALU_API SVisualSocket : public SScaleBox 18 | { 19 | 20 | public: 21 | /** 22 | * Constructor call for slate declarative syntax. 23 | * 24 | * @param Args slate arguments 25 | */ 26 | void Construct(const FArguments& Args); 27 | 28 | /* 29 | * Offsets position of the UVisualImage when it is a child, 30 | * otherwise paints without changes. 31 | * 32 | * @note currently does not work for the SVisualImage 33 | * 34 | * @param Args contains information about paint of this widget 35 | * @param AllotedGeometry base geometry for this widget 36 | * @param MyCullingRect culling bounds of this widget 37 | * @param OutDrawElements elements to draw in the slate window 38 | * @param LayerId layer on which elements should be drawn 39 | * @param InWidgetStyle base widget appearance info 40 | * @param bParentEnabled is parent widget enabled 41 | */ 42 | virtual int32 OnPaint(const FPaintArgs& Args, const FGeometry& AllottedGeometry, const FSlateRect& MyCullingRect, FSlateWindowElementList& OutDrawElements, int32 LayerId, const FWidgetStyle& InWidgetStyle, bool bParentEnabled) const override; 43 | 44 | /** 45 | * Calculates desire size. 46 | * SVisualSocket has zero size. 47 | * 48 | * @return computed desired size of this widget 49 | */ 50 | virtual FVector2D ComputeDesiredSize(float) const override; 51 | 52 | /** 53 | * Handles geometry for child widgets. 54 | * Offsets by SVisualSocket::SocketPosition 55 | * and SVisualSocket::ChildDesiredSize. 56 | * 57 | * @param AllottedGeometry base geometry for this widget 58 | * @param ArrangedChildren result of this children arrangement 59 | */ 60 | virtual void OnArrangeChildren(const FGeometry& AllottedGeometry, FArrangedChildren& ArrangedChildren) const override; 61 | 62 | /** 63 | * Setter for SVisualSocket::SocketPosition. 64 | * Invalidates layout of this widget. 65 | * 66 | * @param InPosition new socket offset 67 | */ 68 | void SetSocketOffset(FVector2D InPosition); 69 | 70 | /** 71 | * Setter for SVisualSocket::VisualImage. 72 | * 73 | * @param InVisualImage child visual image 74 | */ 75 | void SetVisualImage(UVisualImage* InVisualImage); 76 | 77 | /** 78 | * Setter for SVisualSocket::ImageDesiredPosition. 79 | * 80 | * @param InPosition new image position 81 | */ 82 | void SetImageDesiredPosition(FVector2D InPosition); 83 | 84 | private: 85 | /** 86 | * Desired size of the child. 87 | * It is affected by the scale applied to the SVisualSocket. 88 | */ 89 | mutable FVector2D ChildDesiredSize; 90 | 91 | /** 92 | * Optional child visual image. 93 | */ 94 | UVisualImage* VisualImage; 95 | 96 | /** 97 | * Offset to apply to the child widget. 98 | */ 99 | mutable FVector2D SocketPosition; 100 | 101 | /** 102 | * Desired position of the child visual image. 103 | */ 104 | FVector2D ImageDesiredPosition; 105 | }; 106 | -------------------------------------------------------------------------------- /docs/search/all_5.js: -------------------------------------------------------------------------------- 1 | var searchData= 2 | [ 3 | ['fastmovetask_0',['FastMoveTask',['../class_u_visual_controller.html#a000360e5021dd313048a84bd553b3c6c',1,'UVisualController']]], 4 | ['fbackground_1',['FBackground',['../struct_f_background.html',1,'']]], 5 | ['fbreakvisualtextblockdecorator_2',['FBreakVisualTextBlockDecorator',['../class_f_break_visual_text_block_decorator.html',1,'FBreakVisualTextBlockDecorator'],['../class_f_break_visual_text_block_decorator.html#aab0dcf6343afbad98793fdbf34454208',1,'FBreakVisualTextBlockDecorator::FBreakVisualTextBlockDecorator()']]], 6 | ['fdialoguetextsegment_3',['FDialogueTextSegment',['../struct_f_dialogue_text_segment.html',1,'']]], 7 | ['ffastmoveasynctask_4',['FFastMoveAsyncTask',['../class_u_e_1_1_visual_u_1_1_private_1_1_f_fast_move_async_task.html',1,'UE::VisualU::Private']]], 8 | ['ffastmoveasyncworker_5',['FFastMoveAsyncWorker',['../class_u_e_1_1_visual_u_1_1_private_1_1_f_fast_move_async_worker.html',1,'UE::VisualU::Private']]], 9 | ['finalscene_6',['FinalScene',['../class_u_visual_renderer.html#a9c4b71f0e1f1eec92ce4ee49566fac85',1,'UVisualRenderer']]], 10 | ['firstdatatable_7',['FirstDataTable',['../class_u_visual_u_settings.html#a8cdc1e64076400180b071bf18baa8d1f',1,'UVisualUSettings']]], 11 | ['flags_8',['Flags',['../struct_f_visual_scenario_info.html#ab3403c17a61f0486648df5c986feba00',1,'FVisualScenarioInfo']]], 12 | ['flipbook_9',['Flipbook',['../class_s_visual_image.html#aa32532253622e0c326bc5fe1ca4ba3fb',1,'SVisualImage::Flipbook'],['../class_u_visual_image.html#ad9d66b01dee20695e36d0af6882582d4',1,'UVisualImage::Flipbook']]], 13 | ['flipbookdelegate_10',['FlipbookDelegate',['../class_u_visual_image.html#a36d31e55a1adc32828ed33b98988ec1e',1,'UVisualImage']]], 14 | ['flipbookhandle_11',['FlipbookHandle',['../class_u_visual_image.html#a1a4ebf5de4e731576b4b2c5afd35e418',1,'UVisualImage']]], 15 | ['forcestoptransition_12',['ForceStopTransition',['../class_u_visual_renderer.html#a02b2a47d0b951889f81a14e6e2746819',1,'UVisualRenderer']]], 16 | ['forcetypewritetoend_13',['ForceTypewriteToEnd',['../class_u_visual_text_block.html#a7ccaca4376973c2709143c36db431be6',1,'UVisualTextBlock']]], 17 | ['foreachsprite_14',['ForEachSprite',['../class_u_visual_renderer.html#ab4d851f067c0bca04b4c0b477c80a954',1,'UVisualRenderer']]], 18 | ['frameindex_15',['FrameIndex',['../struct_f_visual_image_info.html#ad519ce6516a1b84ff031a5adc9c9d5a6',1,'FVisualImageInfo::FrameIndex'],['../class_u_visual_image.html#ab45c874fa35b2539fde66814a1f16d28',1,'UVisualImage::FrameIndex']]], 19 | ['fscenario_16',['FScenario',['../struct_f_scenario.html',1,'']]], 20 | ['fscenarioid_17',['FScenarioId',['../struct_u_visual_versioning_subsystem_1_1_f_scenario_id.html',1,'UVisualVersioningSubsystem']]], 21 | ['fsprite_18',['FSprite',['../struct_f_sprite.html',1,'']]], 22 | ['fvisualanchors_19',['FVisualAnchors',['../struct_f_visual_anchors.html',1,'']]], 23 | ['fvisualimageinfo_20',['FVisualImageInfo',['../struct_f_visual_image_info.html',1,'']]], 24 | ['fvisualinfo_21',['FVisualInfo',['../struct_f_visual_info.html',1,'']]], 25 | ['fvisualmargin_22',['FVisualMargin',['../struct_f_visual_margin.html',1,'']]], 26 | ['fvisualscenarioinfo_23',['FVisualScenarioInfo',['../struct_f_visual_scenario_info.html',1,'']]], 27 | ['fvisualucustomversion_24',['FVisualUCustomVersion',['../struct_f_visual_u_custom_version.html',1,'']]], 28 | ['fvisualumodule_25',['FVisualUModule',['../class_f_visual_u_module.html',1,'']]] 29 | ]; 30 | -------------------------------------------------------------------------------- /docs/annotated_dup.js: -------------------------------------------------------------------------------- 1 | var annotated_dup = 2 | [ 3 | [ "UE", null, [ 4 | [ "VisualU", null, [ 5 | [ "Private", null, [ 6 | [ "FFastMoveAsyncTask", "class_u_e_1_1_visual_u_1_1_private_1_1_f_fast_move_async_task.html", null ], 7 | [ "FFastMoveAsyncWorker", "class_u_e_1_1_visual_u_1_1_private_1_1_f_fast_move_async_worker.html", null ] 8 | ] ] 9 | ] ] 10 | ] ], 11 | [ "FBackground", "struct_f_background.html", "struct_f_background" ], 12 | [ "FBreakVisualTextBlockDecorator", "class_f_break_visual_text_block_decorator.html", "class_f_break_visual_text_block_decorator" ], 13 | [ "FDialogueTextSegment", "struct_f_dialogue_text_segment.html", null ], 14 | [ "FScenario", "struct_f_scenario.html", "struct_f_scenario" ], 15 | [ "FSprite", "struct_f_sprite.html", "struct_f_sprite" ], 16 | [ "FVisualAnchors", "struct_f_visual_anchors.html", "struct_f_visual_anchors" ], 17 | [ "FVisualImageInfo", "struct_f_visual_image_info.html", "struct_f_visual_image_info" ], 18 | [ "FVisualInfo", "struct_f_visual_info.html", "struct_f_visual_info" ], 19 | [ "FVisualMargin", "struct_f_visual_margin.html", "struct_f_visual_margin" ], 20 | [ "FVisualScenarioInfo", "struct_f_visual_scenario_info.html", "struct_f_visual_scenario_info" ], 21 | [ "FVisualUCustomVersion", "struct_f_visual_u_custom_version.html", null ], 22 | [ "FVisualUModule", "class_f_visual_u_module.html", "class_f_visual_u_module" ], 23 | [ "HasMemberOfTypeImpl", "class_has_member_of_type_impl.html", null ], 24 | [ "IInfoAssignable", "class_i_info_assignable.html", null ], 25 | [ "IVisualControllerInterface", "class_i_visual_controller_interface.html", "class_i_visual_controller_interface" ], 26 | [ "SBackgroundVisualImage", "class_s_background_visual_image.html", "class_s_background_visual_image" ], 27 | [ "SVisualImage", "class_s_visual_image.html", "class_s_visual_image" ], 28 | [ "SVisualImageBase", "class_s_visual_image_base.html", "class_s_visual_image_base" ], 29 | [ "SVisualSocket", "class_s_visual_socket.html", "class_s_visual_socket" ], 30 | [ "UBackgroundVisualImage", "class_u_background_visual_image.html", "class_u_background_visual_image" ], 31 | [ "UInfoAssignable", "class_u_info_assignable.html", null ], 32 | [ "UME_TransitionParameter2D", "class_u_m_e___transition_parameter2_d.html", "class_u_m_e___transition_parameter2_d" ], 33 | [ "UVisualController", "class_u_visual_controller.html", "class_u_visual_controller" ], 34 | [ "UVisualControllerInterface", "class_u_visual_controller_interface.html", null ], 35 | [ "UVisualImage", "class_u_visual_image.html", "class_u_visual_image" ], 36 | [ "UVisualImageBase", "class_u_visual_image_base.html", "class_u_visual_image_base" ], 37 | [ "UVisualRenderer", "class_u_visual_renderer.html", "class_u_visual_renderer" ], 38 | [ "UVisualSocket", "class_u_visual_socket.html", "class_u_visual_socket" ], 39 | [ "UVisualSprite", "class_u_visual_sprite.html", "class_u_visual_sprite" ], 40 | [ "UVisualTextBlock", "class_u_visual_text_block.html", "class_u_visual_text_block" ], 41 | [ "UVisualUBlueprintStatics", "class_u_visual_u_blueprint_statics.html", null ], 42 | [ "UVisualUSettings", "class_u_visual_u_settings.html", "class_u_visual_u_settings" ], 43 | [ "UVisualVersioningSubsystem", "class_u_visual_versioning_subsystem.html", "class_u_visual_versioning_subsystem" ], 44 | [ "VisualU", "class_visual_u.html", null ] 45 | ]; -------------------------------------------------------------------------------- /Source/VisualU/Public/VisualUSettings.h: -------------------------------------------------------------------------------- 1 | // Copyright (c) 2025 Evgeny Shustov 2 | 3 | #pragma once 4 | 5 | #include "CoreMinimal.h" 6 | #include "VisualUSettings.generated.h" 7 | 8 | class UDataTable; 9 | class UMaterialParameterCollection; 10 | 11 | /** 12 | * Global plugin settings. 13 | * Can be found under 'Plugins' category in project settings. 14 | * VisualU settings are written to the 'DefaultPlugins.ini' config file. 15 | * 16 | * @see FVisualUModule for registration details 17 | */ 18 | UCLASS(config = "Plugins", defaultconfig, meta = (DisplayName = "VisualU")) 19 | class VISUALU_API UVisualUSettings : public UObject 20 | { 21 | GENERATED_BODY() 22 | 23 | public: 24 | UVisualUSettings(const FObjectInitializer& ObjectInitializer); 25 | 26 | /** 27 | * Applies scenario flags name overrides after config is loaded. 28 | * 29 | * @see UVisualUSettings::ApplyOverrides 30 | */ 31 | virtual void PostInitProperties() override; 32 | 33 | #if WITH_EDITOR 34 | /** 35 | * Editor only. 36 | * 37 | * Applies scenario flags name overrides when array of names is changed. 38 | * 39 | * @see UVisualUSettings::ApplyOverrides 40 | * 41 | * @param PropertyChangedEvent data regarding property change event. 42 | */ 43 | virtual void PostEditChangeProperty(FPropertyChangedEvent& PropertyChangedEvent) override; 44 | 45 | /** 46 | * Editor only. 47 | * 48 | * Applies scenario meta flags name overrides. 49 | * Only affects metadata. 50 | * 51 | * @see UVisualUSettings::ScenarioFlagsNameOverrides 52 | */ 53 | void ApplyOverrides(); 54 | 55 | /** 56 | * Editor only. 57 | * 58 | * Resets name overrides of scenario flags to plugin default values. 59 | */ 60 | void ResetOverrides(); 61 | #endif 62 | 63 | /** 64 | * Fist node of UVisualController. 65 | * Must be valid for proper initialization of the controller. 66 | */ 67 | UPROPERTY(Config, EditAnywhere, BlueprintReadOnly, Category = "Visual Controller", meta = (ToolTip = "Data Table that contains the first scene")) 68 | TSoftObjectPtr FirstDataTable; 69 | 70 | /** 71 | * Material parameter collection used for transition material. 72 | * First scalar parameter from this collection will be used 73 | * to indicate progress of transition for materials. 74 | * 75 | * @see UME_TransitionParameter2D 76 | */ 77 | UPROPERTY(Config, EditAnywhere, BlueprintReadOnly, Category = "Visual Controller|Transition", meta = (DisplayName = "Transition Material Parameter Collection", ToolTip = "First scalar parameter from this collection will be used to indicate progress of transition for materials")) 78 | TSoftObjectPtr TransitionMPC; 79 | 80 | /** 81 | * Duration, in seconds, of the transition between scenes 82 | * 83 | * @see UVisualRenderer::Transition 84 | */ 85 | UPROPERTY(Config, EditAnywhere, BlueprintReadOnly, Category = "Visual Controller|Transition", meta = (UIMin = 0.f, ClampMin = 0.f, UIMax = 5.f, ClampMax = 5.f, ToolTip = "Duration, in seconds, of the transition between scenes")) 86 | float TransitionDuration; 87 | 88 | /** 89 | * First parameter name for UME_TransitionParameter2D node. 90 | */ 91 | UPROPERTY(Config, EditAnywhere, BlueprintReadOnly, Category = "Visual Controller|Transition") 92 | FName AParameterName; 93 | 94 | /** 95 | * Second parameter name for UME_TransitionParameter2D node. 96 | */ 97 | UPROPERTY(Config, EditAnywhere, BlueprintReadOnly, Category = "Visual Controller|Transition") 98 | FName BParameterName; 99 | 100 | #if WITH_EDITORONLY_DATA 101 | private: 102 | /** 103 | * Defines user names for scenario meta flags custom enums. 104 | * Only affects enum metadata. 105 | */ 106 | UPROPERTY(Config, EditAnywhere, BlueprintReadOnly, EditFixedSize, Category = "Editor", meta = (EditFixedOrder, AllowPrivateAccess = true)) 107 | TArray ScenarioFlagsNameOverrides; 108 | #endif 109 | 110 | }; 111 | -------------------------------------------------------------------------------- /docs/class_s_visual_image.js: -------------------------------------------------------------------------------- 1 | var class_s_visual_image = 2 | [ 3 | [ "AddReferencedObjects", "class_s_visual_image.html#a3b67ce9e04fee0e09c07cca00f356210", null ], 4 | [ "ComputeDesiredSize", "class_s_visual_image.html#a19e795e98177ac11103576c943d92c9f", null ], 5 | [ "ComputeVolatility", "class_s_visual_image.html#aac8ba105ff77a961f8bbf450c5b2d253", null ], 6 | [ "Construct", "class_s_visual_image.html#aff38174920096e31a3e83aad1ed25b9c", null ], 7 | [ "GetAnimate", "class_s_visual_image.html#a6fc318eba0c1668b2442518bb510236f", null ], 8 | [ "GetColorAndOpacity", "class_s_visual_image.html#a465f3609fb893e890a1814fe769c36cb", null ], 9 | [ "GetCurrentSprite", "class_s_visual_image.html#a7ebb1062a8770189485012453b190e6f", null ], 10 | [ "GetCurveSequence", "class_s_visual_image.html#a11ccce24a0c04af01938b53800450edf", null ], 11 | [ "GetDesiredScale", "class_s_visual_image.html#aedaf5330c9dca0e8bb145eac1429f090", null ], 12 | [ "GetFinalColorAndOpacity", "class_s_visual_image.html#a143303cc099713f10eb4556c65629cd7", null ], 13 | [ "GetFinalResource", "class_s_visual_image.html#ac192ec384b71e9c026cee6f7860ed6af", null ], 14 | [ "GetFlipbook", "class_s_visual_image.html#a0ce1dc6f8c3c9d0077f671a4e8e6de2f", null ], 15 | [ "GetImageSize", "class_s_visual_image.html#a3076e26d7fa7f22468e2815793338036", null ], 16 | [ "GetMirrorScale", "class_s_visual_image.html#ae6d02dbbcfa5b03ba26a7bf2a70288bd", null ], 17 | [ "GetReferencerName", "class_s_visual_image.html#addee9a5942d1c87ce2b197c450392160", null ], 18 | [ "GetSpriteIndex", "class_s_visual_image.html#a9a01ce6620849850b4e5e42971751903", null ], 19 | [ "IsResourceValid", "class_s_visual_image.html#aca243a2448edd8b15e81e9bb1526715a", null ], 20 | [ "MakeCustomGeometry", "class_s_visual_image.html#a5a6de8778f47541e84d76640b96e1baa", null ], 21 | [ "PostSlateDrawElementExtension", "class_s_visual_image.html#af9672ce74666debebbd2289f53136a42", null ], 22 | [ "PreSlateDrawElementExtension", "class_s_visual_image.html#a9affd4e583b9af30d71e296d5b28ab42", null ], 23 | [ "SetAnimate", "class_s_visual_image.html#aeb08ae4db9575570ec4d120fcc3fb355", null ], 24 | [ "SetColorAndOpacity", "class_s_visual_image.html#a46c1921ce40c0d8bfc566160f9d438fc", null ], 25 | [ "SetColorAndOpacity", "class_s_visual_image.html#ad4d4504e6589284c96bb49e35aa8fec8", null ], 26 | [ "SetColorAndOpacity", "class_s_visual_image.html#a175b292a114e3503abbd33670cfd419d", null ], 27 | [ "SetDesiredScale", "class_s_visual_image.html#a862d0756f40e74117e4a09c12bc978c6", null ], 28 | [ "SetDesiredScale", "class_s_visual_image.html#a33caf00cc6350e8d1c157dbeba2cea6b", null ], 29 | [ "SetDesiredScale", "class_s_visual_image.html#a2550b39d0d4e1aee0b9053ade18e9712", null ], 30 | [ "SetFlipbook", "class_s_visual_image.html#a724aca83f913414d4985ea05f674f3ad", null ], 31 | [ "SetFlipbook", "class_s_visual_image.html#a803dde7b662d15c2ed6c34a6b0ff926a", null ], 32 | [ "SetMirrorScale", "class_s_visual_image.html#a5b16679b42e7e975f652d68c98eb06bc", null ], 33 | [ "SetMirrorScale", "class_s_visual_image.html#a07596e2e8f54524ea8963bcf9aa0a2bb", null ], 34 | [ "SetMirrorScale", "class_s_visual_image.html#af7037ef144eecf56bf2d232b1e576404", null ], 35 | [ "SetSpriteIndex", "class_s_visual_image.html#afce33d41ede87802e56cb6fb0bf08b1c", null ], 36 | [ "UpdateSequence", "class_s_visual_image.html#ade6908c66fa0da03b2ab839689b7a080", null ], 37 | [ "bAnimate", "class_s_visual_image.html#ac5695dc7687d831599d6243da2c561f2", null ], 38 | [ "ColorAndOpacity", "class_s_visual_image.html#aa2b5b4191d38b44f4ed7fb54712d40c3", null ], 39 | [ "CurveSequence", "class_s_visual_image.html#a56c9c8d50aabed9e229d9b9a34406fc3", null ], 40 | [ "CustomDesiredScale", "class_s_visual_image.html#ac2c943103fe2119df724f6b3c95413e2", null ], 41 | [ "Flipbook", "class_s_visual_image.html#aa32532253622e0c326bc5fe1ca4ba3fb", null ], 42 | [ "MirrorScale", "class_s_visual_image.html#aade76555cd8d1b8869048871e23b57f8", null ], 43 | [ "SpriteIndex", "class_s_visual_image.html#a9fc7e06068aa90dfec9c314251fc1b77", null ] 44 | ]; -------------------------------------------------------------------------------- /Source/VisualU/Public/VisualDefaults.h: -------------------------------------------------------------------------------- 1 | // Copyright (c) 2025 Evgeny Shustov 2 | 3 | #pragma once 4 | 5 | #include "CoreMinimal.h" 6 | #include "Blueprint/UserWidget.h" 7 | #include "VisualDefaults.generated.h" 8 | 9 | struct FAnchors; 10 | struct FMargin; 11 | 12 | /** 13 | * Extends [FAnchors](https://docs.unrealengine.com/5.4/en-US/API/Runtime/Slate/Widgets/Layout/FAnchors/) 14 | * with human-friendly constants for all possible anchors' positions. 15 | */ 16 | USTRUCT(BlueprintType) 17 | struct FVisualAnchors : public FAnchors 18 | { 19 | GENERATED_BODY() 20 | 21 | public: 22 | FVisualAnchors() : Super() {} 23 | FVisualAnchors(float UniformAnchors) : Super(UniformAnchors) {} 24 | FVisualAnchors(float Horizontal, float Vertical) : Super(Horizontal, Vertical) {} 25 | FVisualAnchors(float MinX, float MinY, float MaxX, float MaxY) : Super(MinX, MinY, MaxX, MaxY) {} 26 | FVisualAnchors(const FAnchors& Other) { Minimum = Other.Minimum; Maximum = Other.Maximum; } 27 | 28 | inline static const FAnchors Default = FAnchors(); 29 | inline static const FAnchors FullScreen = FAnchors(0, 0, 1, 1); 30 | inline static const FAnchors BottomLeft = FAnchors(0, 1, 0, 1); 31 | inline static const FAnchors MiddleLeft = FAnchors(0, 0.5, 0, 0.5); 32 | inline static const FAnchors TopLeft = FAnchors(0, 0, 0, 0); 33 | inline static const FAnchors BottomRight = FAnchors(1, 1, 1, 1); 34 | inline static const FAnchors MiddleRight = FAnchors(1, 0.5, 1, 0.5); 35 | inline static const FAnchors TopRight = FAnchors(1, 0, 1, 0); 36 | inline static const FAnchors BottomCenter = FAnchors(0.5, 1, 0.5, 1); 37 | inline static const FAnchors Center = FAnchors(0.5, 0.5, 0.5, 0.5); 38 | inline static const FAnchors TopCenter = FAnchors(0.5, 0, 0.5, 0); 39 | inline static const FAnchors BottomHorizontal = FAnchors(0, 1, 1, 1); 40 | inline static const FAnchors MiddleHorizontal = FAnchors(0, 0.5, 1, 0.5); 41 | inline static const FAnchors TopHorizontal = FAnchors(0, 0, 1, 0); 42 | inline static const FAnchors LeftVertical = FAnchors(0, 0, 0, 1); 43 | inline static const FAnchors CenterVertical = FAnchors(0.5, 0, 0.5, 1); 44 | inline static const FAnchors RightVertical = FAnchors(1, 0, 1, 1); 45 | 46 | FORCEINLINE friend FArchive& operator<< (FArchive& Ar, FVisualAnchors& Anchors) 47 | { 48 | return Ar << Anchors.Minimum << Anchors.Maximum; 49 | } 50 | 51 | /** 52 | * String representation of this anchor. 53 | * 54 | * @return string of minimum and maximum components 55 | */ 56 | FString ToString() const 57 | { 58 | return FString::Printf(TEXT("Minimum: %s, Maximum: %s"), *Minimum.ToString(), *Maximum.ToString()); 59 | } 60 | }; 61 | 62 | /** 63 | * Extends [FMargin](https://docs.unrealengine.com/5.4/en-US/API/Runtime/SlateCore/Layout/FMargin/) 64 | * with additional constants, functions and serialization. 65 | */ 66 | USTRUCT(BlueprintType) 67 | struct FVisualMargin : public FMargin 68 | { 69 | GENERATED_BODY() 70 | 71 | public: 72 | FVisualMargin() : Super() {} 73 | FVisualMargin(float UniformMargin) : Super(UniformMargin) {} 74 | FVisualMargin(float Horizontal, float Vertical) : Super(Horizontal, Vertical) {} 75 | FVisualMargin(const FVector2D& InVector) : Super(InVector) {} 76 | FVisualMargin(float InLeft, float InTop, float InRight, float InBottom) : Super(InLeft, InTop, InRight, InBottom) {} 77 | FVisualMargin(const FVector4& InVector) : Super(InVector) {} 78 | 79 | inline static const FMargin Zero = FMargin(0, 0); 80 | 81 | FORCEINLINE friend FArchive& operator<< (FArchive& Ar, FVisualMargin& Margin) 82 | { 83 | Ar << Margin.Left 84 | << Margin.Top 85 | << Margin.Right 86 | << Margin.Bottom; 87 | 88 | return Ar; 89 | } 90 | 91 | /** 92 | * String representation of this margin. 93 | * 94 | * @return string of all margins 95 | */ 96 | FString ToString() const 97 | { 98 | return FString::Printf(TEXT("Left: %f, Top: %f, Right: %f, Bottom: %f"), Left, Top, Right, Bottom); 99 | } 100 | }; 101 | --------------------------------------------------------------------------------