From 3a942fc05063724d4e54bc1528701ad2e911d407 Mon Sep 17 00:00:00 2001 From: Jonasz Bigda Date: Sat, 15 Feb 2025 10:46:27 +0100 Subject: [PATCH] Initial commit --- .gitattributes | 2 + .gitignore | 74 ++ Conceptor.uplugin | 26 + Config/FilterPlugin.ini | 8 + Content/Conceptor.uasset | Bin 0 -> 652102 bytes Content/Data/CharacterPoseGuided.json | 187 +++++ Content/Data/DepthGuided.json | 122 ++++ Content/Data/Img2Img_Simple.json | 91 +++ Content/E_OverlayState.uasset | Bin 0 -> 2687 bytes Content/UserSettingsSave.uasset | Bin 0 -> 14444 bytes Content/W_ConceptorViewport.uasset | Bin 0 -> 24733 bytes LICENSE | 674 ++++++++++++++++++ README.md | 2 + Resources/Icon128.png | Bin 0 -> 12699 bytes Source/Conceptor/Conceptor.Build.cs | 72 ++ Source/Conceptor/Private/Conceptor.cpp | 20 + .../Conceptor/Private/ConceptorWidgetBase.cpp | 434 +++++++++++ Source/Conceptor/Public/Conceptor.h | 15 + Source/Conceptor/Public/ConceptorWidgetBase.h | 165 +++++ 19 files changed, 1892 insertions(+) create mode 100644 .gitattributes create mode 100644 .gitignore create mode 100644 Conceptor.uplugin create mode 100644 Config/FilterPlugin.ini create mode 100644 Content/Conceptor.uasset create mode 100644 Content/Data/CharacterPoseGuided.json create mode 100644 Content/Data/DepthGuided.json create mode 100644 Content/Data/Img2Img_Simple.json create mode 100644 Content/E_OverlayState.uasset create mode 100644 Content/UserSettingsSave.uasset create mode 100644 Content/W_ConceptorViewport.uasset create mode 100644 LICENSE create mode 100644 README.md create mode 100644 Resources/Icon128.png create mode 100644 Source/Conceptor/Conceptor.Build.cs create mode 100644 Source/Conceptor/Private/Conceptor.cpp create mode 100644 Source/Conceptor/Private/ConceptorWidgetBase.cpp create mode 100644 Source/Conceptor/Public/Conceptor.h create mode 100644 Source/Conceptor/Public/ConceptorWidgetBase.h diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 0000000..dfe0770 --- /dev/null +++ b/.gitattributes @@ -0,0 +1,2 @@ +# Auto detect text files and perform LF normalization +* text=auto diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..6582eaf --- /dev/null +++ b/.gitignore @@ -0,0 +1,74 @@ +# Visual Studio 2015 user specific files +.vs/ + +# Compiled Object files +*.slo +*.lo +*.o +*.obj + +# Precompiled Headers +*.gch +*.pch + +# Compiled Dynamic libraries +*.so +*.dylib +*.dll + +# Fortran module files +*.mod + +# Compiled Static libraries +*.lai +*.la +*.a +*.lib + +# Executables +*.exe +*.out +*.app +*.ipa + +# These project files can be generated by the engine +*.xcodeproj +*.xcworkspace +*.sln +*.suo +*.opensdf +*.sdf +*.VC.db +*.VC.opendb + +# Precompiled Assets +SourceArt/**/*.png +SourceArt/**/*.tga + +# Binary Files +Binaries/* +Plugins/*/Binaries/* + +# Builds +Build/* + +# Whitelist PakBlacklist-.txt files +!Build/*/ +Build/*/** +!Build/*/PakBlacklist*.txt + +# Don't ignore icon files in Build +!Build/**/*.ico + +# Built data for maps +*_BuiltData.uasset + +# Configuration files generated by the Editor +Saved/* + +# Compiled source files for the engine to use +Intermediate/* +Plugins/*/Intermediate/* + +# Cache files for the editor to use +DerivedDataCache/* diff --git a/Conceptor.uplugin b/Conceptor.uplugin new file mode 100644 index 0000000..b166fdb --- /dev/null +++ b/Conceptor.uplugin @@ -0,0 +1,26 @@ +{ + "FileVersion": 3, + "Version": 1, + "VersionName": "1.0", + "FriendlyName": "Conceptor", + "Description": "Unreal Engine ComfyUI integration.", + "Category": "StableDiffusion", + "CreatedBy": "Bankai Software", + "CreatedByURL": "", + "FabURL": "com.epicgames.launcher://ue/Fab/95ef6753-63af-4883-8998-aea345e32fe5/", + "DocsURL": "", + "MarketplaceURL": "", + "SupportURL": "", + "CanContainContent": true, + "IsBetaVersion": false, + "IsExperimentalVersion": false, + "Installed": false, + "Modules": [ + { + "Name": "Conceptor", + "Type": "Editor", + "LoadingPhase": "Default", + "AllowListPlatforms": [ "Win64" ] + } + ] +} \ No newline at end of file diff --git a/Config/FilterPlugin.ini b/Config/FilterPlugin.ini new file mode 100644 index 0000000..ccebca2 --- /dev/null +++ b/Config/FilterPlugin.ini @@ -0,0 +1,8 @@ +[FilterPlugin] +; This section lists additional files which will be packaged along with your plugin. Paths should be listed relative to the root plugin directory, and +; may include "...", "*", and "?" wildcards to match directories, files, and individual characters respectively. +; +; Examples: +; /README.txt +; /Extras/... +; /Binaries/ThirdParty/*.dll diff --git a/Content/Conceptor.uasset b/Content/Conceptor.uasset new file mode 100644 index 0000000000000000000000000000000000000000..98bcfdcb3ac96cfdbda37bf665c4bc5570b4fd0c GIT binary patch literal 652102 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

pO56!Jn! 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

F89)hbBFx_vi%ZB$&N&QUot!PPGrPS1 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 Q9sl`xTi5nCdKu;aKmTDkUH||9 literal 0 HcmV?d00001 diff --git a/Content/Data/CharacterPoseGuided.json b/Content/Data/CharacterPoseGuided.json new file mode 100644 index 0000000..dd57828 --- /dev/null +++ b/Content/Data/CharacterPoseGuided.json @@ -0,0 +1,187 @@ +{ + "3": { + "inputs": { + "seed": 149575965170234, + "steps": 20, + "cfg": 6, + "sampler_name": "dpmpp_sde", + "scheduler": "karras", + "denoise": 1, + "model": [ + "4", + 0 + ], + "positive": [ + "23", + 0 + ], + "negative": [ + "23", + 1 + ], + "latent_image": [ + "27", + 0 + ] + }, + "class_type": "KSampler", + "_meta": { + "title": "KSampler" + } + }, + "4": { + "inputs": { + "ckpt_name": "dreamshaper_8.safetensors" + }, + "class_type": "CheckpointLoaderSimple", + "_meta": { + "title": "Load Checkpoint" + } + }, + "6": { + "inputs": { + "text": "negativeprompt", + "clip": [ + "4", + 1 + ] + }, + "class_type": "CLIPTextEncode", + "_meta": { + "title": "CLIP Text Encode (Prompt)" + } + }, + "7": { + "inputs": { + "text": "positiveprompt", + "clip": [ + "4", + 1 + ] + }, + "class_type": "CLIPTextEncode", + "_meta": { + "title": "CLIP Text Encode (Prompt)" + } + }, + "8": { + "inputs": { + "samples": [ + "3", + 0 + ], + "vae": [ + "4", + 2 + ] + }, + "class_type": "VAEDecode", + "_meta": { + "title": "VAE Decode" + } + }, + "9": { + "inputs": { + "filename_prefix": "ComfyUI", + "images": [ + "8", + 0 + ] + }, + "class_type": "SaveImage", + "_meta": { + "title": "Save Image" + } + }, + "14": { + "inputs": { + "control_net_name": "control_v11p_sd15_openpose.safetensors" + }, + "class_type": "ControlNetLoader", + "_meta": { + "title": "Load ControlNet Model" + } + }, + "23": { + "inputs": { + "strength": 1, + "start_percent": 0, + "end_percent": 1, + "positive": [ + "7", + 0 + ], + "negative": [ + "6", + 0 + ], + "control_net": [ + "14", + 0 + ], + "image": [ + "45", + 0 + ] + }, + "class_type": "ControlNetApplyAdvanced", + "_meta": { + "title": "Apply ControlNet" + } + }, + "24": { + "inputs": { + "image": "D:\\WORK\\ConceptSD\\Saved\\Screenshots\\screenshot.png" + }, + "class_type": "LoadImageFromPath", + "_meta": { + "title": "Load Image From Path" + } + }, + "27": { + "inputs": { + "pixels": [ + "24", + 0 + ], + "vae": [ + "4", + 2 + ] + }, + "class_type": "VAEEncode", + "_meta": { + "title": "VAE Encode" + } + }, + "45": { + "inputs": { + "detect_hand": "enable", + "detect_body": "enable", + "detect_face": "disable", + "resolution": 512, + "scale_stick_for_xinsr_cn": "disable", + "image": [ + "46", + 0 + ] + }, + "class_type": "OpenposePreprocessor", + "_meta": { + "title": "OpenPose Pose" + } + }, + "46": { + "inputs": { + "resolution": 512, + "image": [ + "24", + 0 + ] + }, + "class_type": "Zoe-DepthMapPreprocessor", + "_meta": { + "title": "Zoe Depth Map" + } + } +} \ No newline at end of file diff --git a/Content/Data/DepthGuided.json b/Content/Data/DepthGuided.json new file mode 100644 index 0000000..ab8adf6 --- /dev/null +++ b/Content/Data/DepthGuided.json @@ -0,0 +1,122 @@ +{ + "3": { + "inputs": { + "seed": 701662395817332, + "steps": 5, + "cfg": 2, + "sampler_name": "dpmpp_sde", + "scheduler": "karras", + "denoise": 1, + "model": ["4", 0], + "positive": ["23", 0], + "negative": ["23", 1], + "latent_image": ["27", 0] + }, + "class_type": "KSampler", + "_meta": { + "title": "KSampler" + } + }, + "4": { + "inputs": { + "ckpt_name": "dreamshaperXLTurbo.safetensors" + }, + "class_type": "CheckpointLoaderSimple", + "_meta": { + "title": "Load Checkpoint" + } + }, + "6": { + "inputs": { + "text": "negativeprompt", + "clip": ["4", 1] + }, + "class_type": "CLIPTextEncode", + "_meta": { + "title": "CLIP Text Encode (Prompt)" + } + }, + "7": { + "inputs": { + "text": "positiveprompt", + "clip": ["4", 1] + }, + "class_type": "CLIPTextEncode", + "_meta": { + "title": "CLIP Text Encode (Prompt)" + } + }, + "8": { + "inputs": { + "samples": ["3", 0], + "vae": ["4", 2] + }, + "class_type": "VAEDecode", + "_meta": { + "title": "VAE Decode" + } + }, + "9": { + "inputs": { + "filename_prefix": "ComfyUI", + "images": ["8", 0] + }, + "class_type": "SaveImage", + "_meta": { + "title": "Save Image" + } + }, + "14": { + "inputs": { + "control_net_name": "diffusion_pytorch_model.fp16.safetensors" + }, + "class_type": "ControlNetLoader", + "_meta": { + "title": "Load ControlNet Model" + } + }, + "21": { + "inputs": { + "resolution": 512, + "image": ["24", 0] + }, + "class_type": "Zoe-DepthMapPreprocessor", + "_meta": { + "title": "Zoe Depth Map" + } + }, + "23": { + "inputs": { + "strength": 1, + "start_percent": 0, + "end_percent": 1, + "positive": ["7", 0], + "negative": ["6", 0], + "control_net": ["14", 0], + "image": ["21", 0] + }, + "class_type": "ControlNetApplyAdvanced", + "_meta": { + "title": "Apply ControlNet" + } + }, + "24": { + "inputs": { + "image": "imagepath" + }, + "class_type": "LoadImageFromPath", + "_meta": { + "title": "Load Image From Path" + } + }, + "27": { + "inputs": { + "pixels": ["24", 0], + "vae": ["4", 2] + }, + "class_type": "VAEEncode", + "_meta": { + "title": "VAE Encode" + } + } +} diff --git a/Content/Data/Img2Img_Simple.json b/Content/Data/Img2Img_Simple.json new file mode 100644 index 0000000..b995683 --- /dev/null +++ b/Content/Data/Img2Img_Simple.json @@ -0,0 +1,91 @@ +{ + "clientId": 0, + "prompt": { + "1": { + "inputs": { + "image": "imagepath" + }, + "class_type": "LoadImageFromPath", + "_meta": { + "title": "Load Image From Path" + } + }, + "2": { + "inputs": { + "ckpt_name": "modelname" + }, + "class_type": "CheckpointLoaderSimple", + "_meta": { + "title": "Load Checkpoint" + } + }, + "3": { + "inputs": { + "pixels": ["1", 0], + "vae": ["2", 2] + }, + "class_type": "VAEEncode", + "_meta": { + "title": "VAE Encode" + } + }, + "4": { + "inputs": { + "seed": 0, + "steps": "stepsnum", + "cfg": "cfgnum", + "sampler_name": "euler", + "scheduler": "normal", + "denoise": "denoisenum", + "model": ["2", 0], + "positive": ["5", 0], + "negative": ["6", 0], + "latent_image": ["3", 0] + }, + "class_type": "KSampler", + "_meta": { + "title": "KSampler" + } + }, + "5": { + "inputs": { + "text": "positiveprompt", + "clip": ["2", 1] + }, + "class_type": "CLIPTextEncode", + "_meta": { + "title": "CLIP Text Encode (Prompt)" + } + }, + "6": { + "inputs": { + "text": "negativeprompt", + "clip": ["2", 1] + }, + "class_type": "CLIPTextEncode", + "_meta": { + "title": "CLIP Text Encode (Prompt)" + } + }, + "7": { + "inputs": { + "samples": ["4", 0], + "vae": ["2", 2] + }, + "class_type": "VAEDecode", + "_meta": { + "title": "VAE Decode" + } + }, + "8": { + "inputs": { + "filename_prefix": "Conceptor", + "images": ["7", 0] + }, + "class_type": "SaveImage", + "_meta": { + "title": "Save Image" + } + } + } +} diff --git a/Content/E_OverlayState.uasset b/Content/E_OverlayState.uasset new file mode 100644 index 0000000000000000000000000000000000000000..1de5168040727f8f5a5e54612d773d103f6f1403 GIT binary patch literal 2687 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 VdV@BkmG4fgPJDiMy7Cd^{{yy(jRyb# literal 0 HcmV?d00001 diff --git a/Content/W_ConceptorViewport.uasset b/Content/W_ConceptorViewport.uasset new file mode 100644 index 0000000000000000000000000000000000000000..adf5975f1ea1777abdfadd35d91d9c88b73b812a GIT binary patch literal 24733 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 R%j+{M5}tp2qMWRt|6jmgSnmJ; literal 0 HcmV?d00001 diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..e62ec04 --- /dev/null +++ b/LICENSE @@ -0,0 +1,674 @@ +GNU GENERAL PUBLIC LICENSE + Version 3, 29 June 2007 + + Copyright (C) 2007 Free Software Foundation, Inc. + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The GNU General Public License is a free, copyleft license for +software and other kinds of works. + + The licenses for most software and other practical works are designed +to take away your freedom to share and change the works. By contrast, +the GNU General Public License is intended to guarantee your freedom to +share and change all versions of a program--to make sure it remains free +software for all its users. We, the Free Software Foundation, use the +GNU General Public License for most of our software; it applies also to +any other work released this way by its authors. You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +them if you wish), that you receive source code or can get it if you +want it, that you can change the software or use pieces of it in new +free programs, and that you know you can do these things. + + To protect your rights, we need to prevent others from denying you +these rights or asking you to surrender the rights. Therefore, you have +certain responsibilities if you distribute copies of the software, or if +you modify it: responsibilities to respect the freedom of others. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must pass on to the recipients the same +freedoms that you received. You must make sure that they, too, receive +or can get the source code. And you must show them these terms so they +know their rights. + + Developers that use the GNU GPL protect your rights with two steps: +(1) assert copyright on the software, and (2) offer you this License +giving you legal permission to copy, distribute and/or modify it. + + For the developers' and authors' protection, the GPL clearly explains +that there is no warranty for this free software. For both users' and +authors' sake, the GPL requires that modified versions be marked as +changed, so that their problems will not be attributed erroneously to +authors of previous versions. + + Some devices are designed to deny users access to install or run +modified versions of the software inside them, although the manufacturer +can do so. This is fundamentally incompatible with the aim of +protecting users' freedom to change the software. The systematic +pattern of such abuse occurs in the area of products for individuals to +use, which is precisely where it is most unacceptable. Therefore, we +have designed this version of the GPL to prohibit the practice for those +products. If such problems arise substantially in other domains, we +stand ready to extend this provision to those domains in future versions +of the GPL, as needed to protect the freedom of users. + + Finally, every program is threatened constantly by software patents. +States should not allow patents to restrict development and use of +software on general-purpose computers, but in those that do, we wish to +avoid the special danger that patents applied to a free program could +make it effectively proprietary. To prevent this, the GPL assures that +patents cannot be used to render the program non-free. + + The precise terms and conditions for copying, distribution and +modification follow. + + TERMS AND CONDITIONS + + 0. Definitions. + + "This License" refers to version 3 of the GNU General Public License. + + "Copyright" also means copyright-like laws that apply to other kinds of +works, such as semiconductor masks. + + "The Program" refers to any copyrightable work licensed under this +License. Each licensee is addressed as "you". "Licensees" and +"recipients" may be individuals or organizations. + + To "modify" a work means to copy from or adapt all or part of the work +in a fashion requiring copyright permission, other than the making of an +exact copy. The resulting work is called a "modified version" of the +earlier work or a work "based on" the earlier work. + + A "covered work" means either the unmodified Program or a work based +on the Program. + + To "propagate" a work means to do anything with it that, without +permission, would make you directly or secondarily liable for +infringement under applicable copyright law, except executing it on a +computer or modifying a private copy. Propagation includes copying, +distribution (with or without modification), making available to the +public, and in some countries other activities as well. + + To "convey" a work means any kind of propagation that enables other +parties to make or receive copies. Mere interaction with a user through +a computer network, with no transfer of a copy, is not conveying. + + An interactive user interface displays "Appropriate Legal Notices" +to the extent that it includes a convenient and prominently visible +feature that (1) displays an appropriate copyright notice, and (2) +tells the user that there is no warranty for the work (except to the +extent that warranties are provided), that licensees may convey the +work under this License, and how to view a copy of this License. If +the interface presents a list of user commands or options, such as a +menu, a prominent item in the list meets this criterion. + + 1. Source Code. + + The "source code" for a work means the preferred form of the work +for making modifications to it. "Object code" means any non-source +form of a work. + + A "Standard Interface" means an interface that either is an official +standard defined by a recognized standards body, or, in the case of +interfaces specified for a particular programming language, one that +is widely used among developers working in that language. + + The "System Libraries" of an executable work include anything, other +than the work as a whole, that (a) is included in the normal form of +packaging a Major Component, but which is not part of that Major +Component, and (b) serves only to enable use of the work with that +Major Component, or to implement a Standard Interface for which an +implementation is available to the public in source code form. A +"Major Component", in this context, means a major essential component +(kernel, window system, and so on) of the specific operating system +(if any) on which the executable work runs, or a compiler used to +produce the work, or an object code interpreter used to run it. + + The "Corresponding Source" for a work in object code form means all +the source code needed to generate, install, and (for an executable +work) run the object code and to modify the work, including scripts to +control those activities. However, it does not include the work's +System Libraries, or general-purpose tools or generally available free +programs which are used unmodified in performing those activities but +which are not part of the work. For example, Corresponding Source +includes interface definition files associated with source files for +the work, and the source code for shared libraries and dynamically +linked subprograms that the work is specifically designed to require, +such as by intimate data communication or control flow between those +subprograms and other parts of the work. + + The Corresponding Source need not include anything that users +can regenerate automatically from other parts of the Corresponding +Source. + + The Corresponding Source for a work in source code form is that +same work. + + 2. Basic Permissions. + + All rights granted under this License are granted for the term of +copyright on the Program, and are irrevocable provided the stated +conditions are met. This License explicitly affirms your unlimited +permission to run the unmodified Program. The output from running a +covered work is covered by this License only if the output, given its +content, constitutes a covered work. This License acknowledges your +rights of fair use or other equivalent, as provided by copyright law. + + You may make, run and propagate covered works that you do not +convey, without conditions so long as your license otherwise remains +in force. You may convey covered works to others for the sole purpose +of having them make modifications exclusively for you, or provide you +with facilities for running those works, provided that you comply with +the terms of this License in conveying all material for which you do +not control copyright. Those thus making or running the covered works +for you must do so exclusively on your behalf, under your direction +and control, on terms that prohibit them from making any copies of +your copyrighted material outside their relationship with you. + + Conveying under any other circumstances is permitted solely under +the conditions stated below. Sublicensing is not allowed; section 10 +makes it unnecessary. + + 3. Protecting Users' Legal Rights From Anti-Circumvention Law. + + No covered work shall be deemed part of an effective technological +measure under any applicable law fulfilling obligations under article +11 of the WIPO copyright treaty adopted on 20 December 1996, or +similar laws prohibiting or restricting circumvention of such +measures. + + When you convey a covered work, you waive any legal power to forbid +circumvention of technological measures to the extent such circumvention +is effected by exercising rights under this License with respect to +the covered work, and you disclaim any intention to limit operation or +modification of the work as a means of enforcing, against the work's +users, your or third parties' legal rights to forbid circumvention of +technological measures. + + 4. Conveying Verbatim Copies. + + You may convey verbatim copies of the Program's source code as you +receive it, in any medium, provided that you conspicuously and +appropriately publish on each copy an appropriate copyright notice; +keep intact all notices stating that this License and any +non-permissive terms added in accord with section 7 apply to the code; +keep intact all notices of the absence of any warranty; and give all +recipients a copy of this License along with the Program. + + You may charge any price or no price for each copy that you convey, +and you may offer support or warranty protection for a fee. + + 5. Conveying Modified Source Versions. + + You may convey a work based on the Program, or the modifications to +produce it from the Program, in the form of source code under the +terms of section 4, provided that you also meet all of these conditions: + + a) The work must carry prominent notices stating that you modified + it, and giving a relevant date. + + b) The work must carry prominent notices stating that it is + released under this License and any conditions added under section + 7. This requirement modifies the requirement in section 4 to + "keep intact all notices". + + c) You must license the entire work, as a whole, under this + License to anyone who comes into possession of a copy. This + License will therefore apply, along with any applicable section 7 + additional terms, to the whole of the work, and all its parts, + regardless of how they are packaged. This License gives no + permission to license the work in any other way, but it does not + invalidate such permission if you have separately received it. + + d) If the work has interactive user interfaces, each must display + Appropriate Legal Notices; however, if the Program has interactive + interfaces that do not display Appropriate Legal Notices, your + work need not make them do so. + + A compilation of a covered work with other separate and independent +works, which are not by their nature extensions of the covered work, +and which are not combined with it such as to form a larger program, +in or on a volume of a storage or distribution medium, is called an +"aggregate" if the compilation and its resulting copyright are not +used to limit the access or legal rights of the compilation's users +beyond what the individual works permit. Inclusion of a covered work +in an aggregate does not cause this License to apply to the other +parts of the aggregate. + + 6. Conveying Non-Source Forms. + + You may convey a covered work in object code form under the terms +of sections 4 and 5, provided that you also convey the +machine-readable Corresponding Source under the terms of this License, +in one of these ways: + + a) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by the + Corresponding Source fixed on a durable physical medium + customarily used for software interchange. + + b) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by a + written offer, valid for at least three years and valid for as + long as you offer spare parts or customer support for that product + model, to give anyone who possesses the object code either (1) a + copy of the Corresponding Source for all the software in the + product that is covered by this License, on a durable physical + medium customarily used for software interchange, for a price no + more than your reasonable cost of physically performing this + conveying of source, or (2) access to copy the + Corresponding Source from a network server at no charge. + + c) Convey individual copies of the object code with a copy of the + written offer to provide the Corresponding Source. This + alternative is allowed only occasionally and noncommercially, and + only if you received the object code with such an offer, in accord + with subsection 6b. + + d) Convey the object code by offering access from a designated + place (gratis or for a charge), and offer equivalent access to the + Corresponding Source in the same way through the same place at no + further charge. You need not require recipients to copy the + Corresponding Source along with the object code. If the place to + copy the object code is a network server, the Corresponding Source + may be on a different server (operated by you or a third party) + that supports equivalent copying facilities, provided you maintain + clear directions next to the object code saying where to find the + Corresponding Source. Regardless of what server hosts the + Corresponding Source, you remain obligated to ensure that it is + available for as long as needed to satisfy these requirements. + + e) Convey the object code using peer-to-peer transmission, provided + you inform other peers where the object code and Corresponding + Source of the work are being offered to the general public at no + charge under subsection 6d. + + A separable portion of the object code, whose source code is excluded +from the Corresponding Source as a System Library, need not be +included in conveying the object code work. + + A "User Product" is either (1) a "consumer product", which means any +tangible personal property which is normally used for personal, family, +or household purposes, or (2) anything designed or sold for incorporation +into a dwelling. In determining whether a product is a consumer product, +doubtful cases shall be resolved in favor of coverage. For a particular +product received by a particular user, "normally used" refers to a +typical or common use of that class of product, regardless of the status +of the particular user or of the way in which the particular user +actually uses, or expects or is expected to use, the product. A product +is a consumer product regardless of whether the product has substantial +commercial, industrial or non-consumer uses, unless such uses represent +the only significant mode of use of the product. + + "Installation Information" for a User Product means any methods, +procedures, authorization keys, or other information required to install +and execute modified versions of a covered work in that User Product from +a modified version of its Corresponding Source. The information must +suffice to ensure that the continued functioning of the modified object +code is in no case prevented or interfered with solely because +modification has been made. + + If you convey an object code work under this section in, or with, or +specifically for use in, a User Product, and the conveying occurs as +part of a transaction in which the right of possession and use of the +User Product is transferred to the recipient in perpetuity or for a +fixed term (regardless of how the transaction is characterized), the +Corresponding Source conveyed under this section must be accompanied +by the Installation Information. But this requirement does not apply +if neither you nor any third party retains the ability to install +modified object code on the User Product (for example, the work has +been installed in ROM). + + The requirement to provide Installation Information does not include a +requirement to continue to provide support service, warranty, or updates +for a work that has been modified or installed by the recipient, or for +the User Product in which it has been modified or installed. Access to a +network may be denied when the modification itself materially and +adversely affects the operation of the network or violates the rules and +protocols for communication across the network. + + Corresponding Source conveyed, and Installation Information provided, +in accord with this section must be in a format that is publicly +documented (and with an implementation available to the public in +source code form), and must require no special password or key for +unpacking, reading or copying. + + 7. Additional Terms. + + "Additional permissions" are terms that supplement the terms of this +License by making exceptions from one or more of its conditions. +Additional permissions that are applicable to the entire Program shall +be treated as though they were included in this License, to the extent +that they are valid under applicable law. If additional permissions +apply only to part of the Program, that part may be used separately +under those permissions, but the entire Program remains governed by +this License without regard to the additional permissions. + + When you convey a copy of a covered work, you may at your option +remove any additional permissions from that copy, or from any part of +it. (Additional permissions may be written to require their own +removal in certain cases when you modify the work.) You may place +additional permissions on material, added by you to a covered work, +for which you have or can give appropriate copyright permission. + + Notwithstanding any other provision of this License, for material you +add to a covered work, you may (if authorized by the copyright holders of +that material) supplement the terms of this License with terms: + + a) Disclaiming warranty or limiting liability differently from the + terms of sections 15 and 16 of this License; or + + b) Requiring preservation of specified reasonable legal notices or + author attributions in that material or in the Appropriate Legal + Notices displayed by works containing it; or + + c) Prohibiting misrepresentation of the origin of that material, or + requiring that modified versions of such material be marked in + reasonable ways as different from the original version; or + + d) Limiting the use for publicity purposes of names of licensors or + authors of the material; or + + e) Declining to grant rights under trademark law for use of some + trade names, trademarks, or service marks; or + + f) Requiring indemnification of licensors and authors of that + material by anyone who conveys the material (or modified versions of + it) with contractual assumptions of liability to the recipient, for + any liability that these contractual assumptions directly impose on + those licensors and authors. + + All other non-permissive additional terms are considered "further +restrictions" within the meaning of section 10. If the Program as you +received it, or any part of it, contains a notice stating that it is +governed by this License along with a term that is a further +restriction, you may remove that term. If a license document contains +a further restriction but permits relicensing or conveying under this +License, you may add to a covered work material governed by the terms +of that license document, provided that the further restriction does +not survive such relicensing or conveying. + + If you add terms to a covered work in accord with this section, you +must place, in the relevant source files, a statement of the +additional terms that apply to those files, or a notice indicating +where to find the applicable terms. + + Additional terms, permissive or non-permissive, may be stated in the +form of a separately written license, or stated as exceptions; +the above requirements apply either way. + + 8. Termination. + + You may not propagate or modify a covered work except as expressly +provided under this License. Any attempt otherwise to propagate or +modify it is void, and will automatically terminate your rights under +this License (including any patent licenses granted under the third +paragraph of section 11). + + However, if you cease all violation of this License, then your +license from a particular copyright holder is reinstated (a) +provisionally, unless and until the copyright holder explicitly and +finally terminates your license, and (b) permanently, if the copyright +holder fails to notify you of the violation by some reasonable means +prior to 60 days after the cessation. + + Moreover, your license from a particular copyright holder is +reinstated permanently if the copyright holder notifies you of the +violation by some reasonable means, this is the first time you have +received notice of violation of this License (for any work) from that +copyright holder, and you cure the violation prior to 30 days after +your receipt of the notice. + + Termination of your rights under this section does not terminate the +licenses of parties who have received copies or rights from you under +this License. If your rights have been terminated and not permanently +reinstated, you do not qualify to receive new licenses for the same +material under section 10. + + 9. Acceptance Not Required for Having Copies. + + You are not required to accept this License in order to receive or +run a copy of the Program. Ancillary propagation of a covered work +occurring solely as a consequence of using peer-to-peer transmission +to receive a copy likewise does not require acceptance. However, +nothing other than this License grants you permission to propagate or +modify any covered work. These actions infringe copyright if you do +not accept this License. Therefore, by modifying or propagating a +covered work, you indicate your acceptance of this License to do so. + + 10. Automatic Licensing of Downstream Recipients. + + Each time you convey a covered work, the recipient automatically +receives a license from the original licensors, to run, modify and +propagate that work, subject to this License. You are not responsible +for enforcing compliance by third parties with this License. + + An "entity transaction" is a transaction transferring control of an +organization, or substantially all assets of one, or subdividing an +organization, or merging organizations. If propagation of a covered +work results from an entity transaction, each party to that +transaction who receives a copy of the work also receives whatever +licenses to the work the party's predecessor in interest had or could +give under the previous paragraph, plus a right to possession of the +Corresponding Source of the work from the predecessor in interest, if +the predecessor has it or can get it with reasonable efforts. + + You may not impose any further restrictions on the exercise of the +rights granted or affirmed under this License. For example, you may +not impose a license fee, royalty, or other charge for exercise of +rights granted under this License, and you may not initiate litigation +(including a cross-claim or counterclaim in a lawsuit) alleging that +any patent claim is infringed by making, using, selling, offering for +sale, or importing the Program or any portion of it. + + 11. Patents. + + A "contributor" is a copyright holder who authorizes use under this +License of the Program or a work on which the Program is based. The +work thus licensed is called the contributor's "contributor version". + + A contributor's "essential patent claims" are all patent claims +owned or controlled by the contributor, whether already acquired or +hereafter acquired, that would be infringed by some manner, permitted +by this License, of making, using, or selling its contributor version, +but do not include claims that would be infringed only as a +consequence of further modification of the contributor version. For +purposes of this definition, "control" includes the right to grant +patent sublicenses in a manner consistent with the requirements of +this License. + + Each contributor grants you a non-exclusive, worldwide, royalty-free +patent license under the contributor's essential patent claims, to +make, use, sell, offer for sale, import and otherwise run, modify and +propagate the contents of its contributor version. + + In the following three paragraphs, a "patent license" is any express +agreement or commitment, however denominated, not to enforce a patent +(such as an express permission to practice a patent or covenant not to +sue for patent infringement). To "grant" such a patent license to a +party means to make such an agreement or commitment not to enforce a +patent against the party. + + If you convey a covered work, knowingly relying on a patent license, +and the Corresponding Source of the work is not available for anyone +to copy, free of charge and under the terms of this License, through a +publicly available network server or other readily accessible means, +then you must either (1) cause the Corresponding Source to be so +available, or (2) arrange to deprive yourself of the benefit of the +patent license for this particular work, or (3) arrange, in a manner +consistent with the requirements of this License, to extend the patent +license to downstream recipients. "Knowingly relying" means you have +actual knowledge that, but for the patent license, your conveying the +covered work in a country, or your recipient's use of the covered work +in a country, would infringe one or more identifiable patents in that +country that you have reason to believe are valid. + + If, pursuant to or in connection with a single transaction or +arrangement, you convey, or propagate by procuring conveyance of, a +covered work, and grant a patent license to some of the parties +receiving the covered work authorizing them to use, propagate, modify +or convey a specific copy of the covered work, then the patent license +you grant is automatically extended to all recipients of the covered +work and works based on it. + + A patent license is "discriminatory" if it does not include within +the scope of its coverage, prohibits the exercise of, or is +conditioned on the non-exercise of one or more of the rights that are +specifically granted under this License. You may not convey a covered +work if you are a party to an arrangement with a third party that is +in the business of distributing software, under which you make payment +to the third party based on the extent of your activity of conveying +the work, and under which the third party grants, to any of the +parties who would receive the covered work from you, a discriminatory +patent license (a) in connection with copies of the covered work +conveyed by you (or copies made from those copies), or (b) primarily +for and in connection with specific products or compilations that +contain the covered work, unless you entered into that arrangement, +or that patent license was granted, prior to 28 March 2007. + + Nothing in this License shall be construed as excluding or limiting +any implied license or other defenses to infringement that may +otherwise be available to you under applicable patent law. + + 12. No Surrender of Others' Freedom. + + If conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot convey a +covered work so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you may +not convey it at all. For example, if you agree to terms that obligate you +to collect a royalty for further conveying from those to whom you convey +the Program, the only way you could satisfy both those terms and this +License would be to refrain entirely from conveying the Program. + + 13. Use with the GNU Affero General Public License. + + Notwithstanding any other provision of this License, you have +permission to link or combine any covered work with a work licensed +under version 3 of the GNU Affero General Public License into a single +combined work, and to convey the resulting work. The terms of this +License will continue to apply to the part which is the covered work, +but the special requirements of the GNU Affero General Public License, +section 13, concerning interaction through a network will apply to the +combination as such. + + 14. Revised Versions of this License. + + The Free Software Foundation may publish revised and/or new versions of +the GNU General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + + Each version is given a distinguishing version number. If the +Program specifies that a certain numbered version of the GNU General +Public License "or any later version" applies to it, you have the +option of following the terms and conditions either of that numbered +version or of any later version published by the Free Software +Foundation. If the Program does not specify a version number of the +GNU General Public License, you may choose any version ever published +by the Free Software Foundation. + + If the Program specifies that a proxy can decide which future +versions of the GNU General Public License can be used, that proxy's +public statement of acceptance of a version permanently authorizes you +to choose that version for the Program. + + Later license versions may give you additional or different +permissions. However, no additional obligations are imposed on any +author or copyright holder as a result of your choosing to follow a +later version. + + 15. Disclaimer of Warranty. + + THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY +APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT +HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY +OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, +THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM +IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF +ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. Limitation of Liability. + + IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS +THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY +GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE +USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF +DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD +PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), +EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF +SUCH DAMAGES. + + 17. Interpretation of Sections 15 and 16. + + If the disclaimer of warranty and limitation of liability provided +above cannot be given local legal effect according to their terms, +reviewing courts shall apply local law that most closely approximates +an absolute waiver of all civil liability in connection with the +Program, unless a warranty or assumption of liability accompanies a +copy of the Program in return for a fee. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +state the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + +Also add information on how to contact you by electronic and paper mail. + + If the program does terminal interaction, make it output a short +notice like this when it starts in an interactive mode: + + Copyright (C) + This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, your program's commands +might be different; for a GUI interface, you would use an "about box". + + You should also get your employer (if you work as a programmer) or school, +if any, to sign a "copyright disclaimer" for the program, if necessary. +For more information on this, and how to apply and follow the GNU GPL, see +. + + The GNU General Public License does not permit incorporating your program +into proprietary programs. If your program is a subroutine library, you +may consider it more useful to permit linking proprietary applications with +the library. If this is what you want to do, use the GNU Lesser General +Public License instead of this License. But first, please read +. diff --git a/README.md b/README.md new file mode 100644 index 0000000..7a283a6 --- /dev/null +++ b/README.md @@ -0,0 +1,2 @@ +# Conceptor + ComfyUI integration for Unreal Engine 5 diff --git a/Resources/Icon128.png b/Resources/Icon128.png new file mode 100644 index 0000000000000000000000000000000000000000..1231d4aad4d0d462fb7b178eb5b30aa61a10df0b GIT binary patch literal 12699 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 a;7#~yJh_ha>A&A^fRdb=Y>l)<=>Gxy=2LS3 literal 0 HcmV?d00001 diff --git a/Source/Conceptor/Conceptor.Build.cs b/Source/Conceptor/Conceptor.Build.cs new file mode 100644 index 0000000..eadf82a --- /dev/null +++ b/Source/Conceptor/Conceptor.Build.cs @@ -0,0 +1,72 @@ +// Created by Bankai Software @2025 + +using UnrealBuildTool; + +public class Conceptor : ModuleRules +{ + public Conceptor(ReadOnlyTargetRules Target) : base(Target) + { + PCHUsage = ModuleRules.PCHUsageMode.UseExplicitOrSharedPCHs; + + PublicIncludePaths.AddRange( + new string[] { + // ... add public include paths required here ... + } + ); + + + PrivateIncludePaths.AddRange( + new string[] { + // ... add other private include paths required here ... + } + ); + + + PublicDependencyModuleNames.AddRange( + new string[] + { + "Core", + "UMG", + "HTTP" + // ... add other public dependencies that you statically link with here ... + } + ); + + + PrivateDependencyModuleNames.AddRange( + new string[] + { + "CoreUObject", + "Engine", + "Slate", + "SlateCore", + "WebSockets", + "Json", + "JsonUtilities" + // ... add private dependencies that you statically link with here ... + } + ); + + if (Target.bBuildEditor) + { + PrivateDependencyModuleNames.AddRange(new string[] { + "UnrealEd", + "Blutility", + "EditorScriptingUtilities", + "UMGEditor" + }); + } + + if (Target.Type != TargetType.Editor) + { + throw new BuildException("Conceptor is an editor-only plugin and cannot be built for non-editor targets."); + } + + DynamicallyLoadedModuleNames.AddRange( + new string[] + { + // ... add any modules that your module loads dynamically here ... + } + ); + } +} diff --git a/Source/Conceptor/Private/Conceptor.cpp b/Source/Conceptor/Private/Conceptor.cpp new file mode 100644 index 0000000..c6c977d --- /dev/null +++ b/Source/Conceptor/Private/Conceptor.cpp @@ -0,0 +1,20 @@ +// Created by Bankai Software @2025 + +#include "Conceptor.h" + +#define LOCTEXT_NAMESPACE "FConceptorModule" + +void FConceptorModule::StartupModule() +{ + // This code will execute after your module is loaded into memory; the exact timing is specified in the .uplugin file per-module +} + +void FConceptorModule::ShutdownModule() +{ + // This function may be called during shutdown to clean up your module. For modules that support dynamic reloading, + // we call this function before unloading the module. +} + +#undef LOCTEXT_NAMESPACE + +IMPLEMENT_MODULE(FConceptorModule, Conceptor) \ No newline at end of file diff --git a/Source/Conceptor/Private/ConceptorWidgetBase.cpp b/Source/Conceptor/Private/ConceptorWidgetBase.cpp new file mode 100644 index 0000000..1d33734 --- /dev/null +++ b/Source/Conceptor/Private/ConceptorWidgetBase.cpp @@ -0,0 +1,434 @@ +// Created by Bankai Software @2025 + + +#include "ConceptorWidgetBase.h" + +void UConceptorWidgetBase::NativeDestruct() +{ + if (EditorViewportWidget.IsValid() && SlateWidget.IsValid()) + { + EditorViewportWidget->RemoveOverlayWidget(SlateWidget.ToSharedRef()); + SlateWidget.Reset(); + } + if (IsValid(UMGWidget)) { + UMGWidget->RemoveFromParent(); + UMGWidget = nullptr; + } + + EditorViewportWidget.Reset(); + + Super::NativeDestruct(); +} + +void UConceptorWidgetBase::SetupWebSocket() { + if (!FModuleManager::Get().IsModuleLoaded("WebSockets")) + { + FModuleManager::Get().LoadModule("WebSockets"); + } + + // Create socket + Socket = FWebSocketsModule::Get().CreateWebSocket(url, TEXT("ws")); + + // Binds + Socket->OnConnected().AddLambda([this]() -> void { + IsConnected = true; + UE_LOG(LogTemp, Warning, TEXT("Connected to WebSocket")); + }); + + Socket->OnClosed().AddLambda([this](int32 StatusCode, const FString& Reason, bool bWasClean) -> void { + IsConnected = false; + UE_LOG(LogTemp, Warning, TEXT("Connection Closed - Reason: %s"), *Reason); + }); + + Socket->OnConnectionError().AddLambda([this](const FString & Error) -> void { + IsConnected = true; + UE_LOG(LogTemp, Warning, TEXT("Connection Failed - Reason: %s"), *Error); + }); + + Socket->OnMessage().AddLambda([this](const FString& Message) -> void { + UConceptorWidgetBase::HandleMessageRecieved(Message); + }); + + // Connect + + Socket->Connect(); +} + +void UConceptorWidgetBase::Connect() { + if (!IsConnected) { + UpdateWorkflows(); + SetupWebSocket(); + SetupViewportAccess(); + FString ScreenshotsDir = FPaths::ProjectSavedDir() / TEXT("Screenshots/"); + ScreenshotPath = ScreenshotsDir + TEXT("screenshot"); + } + else { + UE_LOG(LogTemp, Warning, TEXT("Already connected")); + } + +} + +void UConceptorWidgetBase::Disconnect() { + if(IsConnected) Socket->Close(); +} + +void UConceptorWidgetBase::HandleMessageRecieved(FString Message) { + FString MessageType = "ok"; + TSharedRef> JsonReader = TJsonReaderFactory::Create(Message); + TSharedPtr OutValue; + TSharedPtr MainObject; + + if (FJsonSerializer::Deserialize(JsonReader, OutValue)) { + MainObject = OutValue->AsObject(); + MainObject->TryGetStringField(TEXT("type"), MessageType); + } + + if (MessageType == TEXT("progress")) + { + int32 CurrentStep = MainObject->GetObjectField("data")->GetNumberField("value"); + int32 LastStep = MainObject->GetObjectField("data")->GetNumberField("max"); + Progress = 1.0f * CurrentStep / LastStep; + UE_LOG(LogTemp, Warning, TEXT("Progress: %f"), Progress); + OnStatusReceived.Broadcast(TEXT("progress")); + FString PromptId = MainObject->GetObjectField("data")->GetStringField("prompt_id"); + if (!PromptId.Equals(LastPromptId)) { + LastPromptId = PromptId; + UE_LOG(LogTemp, Warning, TEXT("LastPromptId updated to: %s"), *LastPromptId); + } + } + else if (MessageType == TEXT("status")) { + QueueRemaining = MainObject->GetObjectField("data")->GetObjectField("status")->GetObjectField("exec_info")->GetNumberField("queue_remaining"); + OnStatusReceived.Broadcast(TEXT("status")); + UE_LOG(LogTemp, Warning, TEXT("QueueRemainig: %d"), QueueRemaining); + if (QueueRemaining == 0) { + FetchAssetURL(); + } + } + else { + UE_LOG(LogTemp, Warning, TEXT("Unknown message")); + } +} + +void UConceptorWidgetBase::TakeScreenshot() { + if (IsConnected) { + FLevelEditorViewportClient* ViewportClient = GCurrentLevelEditingViewportClient; + if (ViewportClient) + { + ViewportClient->bDrawAxes = false; + ViewportClient->RedrawRequested(ViewportClient->Viewport); + ViewportClient->Invalidate(); + } + FScreenshotRequest::RequestScreenshot(ScreenshotPath, false, false); + FScreenshotRequest::OnScreenshotRequestProcessed().AddLambda([&]() { + OnScreenshotTaken(); + FScreenshotRequest::OnScreenshotRequestProcessed().Clear(); + }); + UE_LOG(LogTemp, Warning, TEXT("Screenshot requested")); + } + else { + UE_LOG(LogTemp, Warning, TEXT("Unable to take a screenshot - please connect first")); + } +} + +void UConceptorWidgetBase::OnScreenshotTaken_Implementation() { + // EMPTY + UE_LOG(LogTemp, Warning, TEXT("Screenshot saved to: %s"), *ScreenshotPath); +} + +void UConceptorWidgetBase::SetWorkflowValues() { + if (JsonString.IsEmpty()) { + UE_LOG(LogTemp, Error, TEXT("No workflow loaded.")); + return; + } + TSharedPtr JsonObject; + TSharedRef> Reader = TJsonReaderFactory<>::Create(JsonString); + + if (FJsonSerializer::Deserialize(Reader, JsonObject)) { + for (const auto& KeyValuePair : JsonObject->Values) { + const FString& Key = KeyValuePair.Key; + TSharedPtr SubObject = KeyValuePair.Value->AsObject(); + + if (SubObject.IsValid()) { + FString ClassType = SubObject->GetStringField("class_type"); + + if (ClassType.Equals("KSampler")) { + // KSampler + TSharedPtr InputsObject = SubObject->GetObjectField("inputs"); + int32 RandomSeed = FMath::Rand(); + InputsObject->SetNumberField("seed", RandomSeed); + InputsObject->SetNumberField("steps", Steps); + InputsObject->SetNumberField("cfg", CfgScale); + InputsObject->SetNumberField("denoise", Denoise); + } + + if (ClassType.Equals("CheckpointLoaderSimple")) { + // Model loader + TSharedPtr InputsObject = SubObject->GetObjectField("inputs"); + InputsObject->SetStringField("ckpt_name", *Model); + } + + if (ClassType.Equals("ControlNetLoader")) { + // ControlNet loader + TSharedPtr InputsObject = SubObject->GetObjectField("inputs"); + InputsObject->SetStringField("control_net_name", *ControlNet); + } + + if (ClassType.Equals("ControlNetApplyAdvanced")) { + // ControlNetStrength + TSharedPtr InputsObject = SubObject->GetObjectField("inputs"); + InputsObject->SetNumberField("strength", ControlNetStrength); + } + + if (ClassType.Equals("LoadImageFromPath")) { + // LoadImageFromPath + TSharedPtr InputsObject = SubObject->GetObjectField("inputs"); + FString ScreenshotPathWithExt = ScreenshotPath + TEXT(".png"); + InputsObject->SetStringField("image", *ScreenshotPathWithExt); + } + } + } + TSharedPtr OuterObject = MakeShareable(new FJsonObject()); + OuterObject->SetNumberField("clientId", 0); + OuterObject->SetObjectField("prompt", JsonObject); + TSharedRef> Writer = TJsonWriterFactory<>::Create(&JsonString); + if (!FJsonSerializer::Serialize(OuterObject.ToSharedRef(), Writer)) { + UE_LOG(LogTemp, Error, TEXT("JSON Serialize error")); + return; + } + + JsonString = JsonString.Replace(TEXT("positiveprompt"), *PositivePrompt, ESearchCase::CaseSensitive); + JsonString = JsonString.Replace(TEXT("negativeprompt"), *NegativePrompt, ESearchCase::CaseSensitive); + UE_LOG(LogTemp, Warning, TEXT("Workflow injection successful")); + } + else { + UE_LOG(LogTemp, Error, TEXT("JSON Deserialize error")); + } +} + +void UConceptorWidgetBase::SendPrompt() { + if (IsConnected) { + FHttpModule& httpModule = FHttpModule::Get(); + TSharedRef pRequest = httpModule.CreateRequest(); + pRequest->SetVerb(TEXT("POST")); + pRequest->SetHeader(TEXT("Content-Type"), TEXT("application/json")); + + SetWorkflowValues(); + pRequest->SetContentAsString(JsonString); + pRequest->SetURL("http://127.0.0.1:8188/prompt"); + + pRequest->ProcessRequest(); + } + else { + UE_LOG(LogTemp, Error, TEXT("Couldn't process - Not connected to WebSocket service.")); + } +} + +void UConceptorWidgetBase::FetchAssetURL() { + FHttpModule& httpModule = FHttpModule::Get(); + TSharedRef pRequest = httpModule.CreateRequest(); + pRequest->SetVerb(TEXT("GET")); + pRequest->SetHeader(TEXT("Content-Type"), TEXT("application/json")); + pRequest->SetURL("http://127.0.0.1:8188/history"); + + pRequest->OnProcessRequestComplete().BindLambda( + [&]( + FHttpRequestPtr pRequest, + FHttpResponsePtr pResponse, + bool connectedSuccessfully) mutable { + + if (connectedSuccessfully) { + FString ParsedUrl = GetFilenameFromHistory(pResponse->GetContentAsString()); + OnUrlReceived.Broadcast(ParsedUrl); + } + else { + switch (pRequest->GetStatus()) { + case EHttpRequestStatus::Failed_ConnectionError: + UE_LOG(LogTemp, Error, TEXT("Connection failed.")); + default: + UE_LOG(LogTemp, Error, TEXT("Request failed.")); + } + } + }); + + pRequest->ProcessRequest(); +} + +void UConceptorWidgetBase::DownloadAndSetTexture(UImage* TargetImage, FString ImageURL) +{ + FHttpModule* Http = &FHttpModule::Get(); + TSharedRef Request = Http->CreateRequest(); + + Request->OnProcessRequestComplete().BindLambda([TargetImage, this](FHttpRequestPtr Request, FHttpResponsePtr Response, bool bWasSuccessful) + { + if (bWasSuccessful && Response.IsValid()) + { + TArray ImageData = Response->GetContent(); + UTexture2D* Texture = LoadTextureFromByteArray(ImageData); + + if (Texture && TargetImage) + { + TargetImage->SetBrushFromTexture(Texture); + } + } + }); + + Request->SetURL(ImageURL); + Request->SetVerb("GET"); + Request->ProcessRequest(); +} + +UTexture2D* UConceptorWidgetBase::LoadTextureFromByteArray(const TArray& ImageData) +{ + IImageWrapperModule& ImageWrapperModule = FModuleManager::LoadModuleChecked(FName("ImageWrapper")); + TSharedPtr ImageWrapper = ImageWrapperModule.CreateImageWrapper(EImageFormat::PNG); + + if (ImageWrapper.IsValid() && ImageWrapper->SetCompressed(ImageData.GetData(), ImageData.Num())) + { + TArray UncompressedRGBA; + if (ImageWrapper->GetRaw(ERGBFormat::BGRA, 8, UncompressedRGBA)) + { + UTexture2D* NewTexture = UTexture2D::CreateTransient(ImageWrapper->GetWidth(), ImageWrapper->GetHeight()); + if (!NewTexture) return nullptr; + + void* TextureData = NewTexture->GetPlatformData()->Mips[0].BulkData.Lock(LOCK_READ_WRITE); + FMemory::Memcpy(TextureData, UncompressedRGBA.GetData(), UncompressedRGBA.Num()); + NewTexture->GetPlatformData()->Mips[0].BulkData.Unlock(); + + NewTexture->UpdateResource(); + return NewTexture; + } + } + return nullptr; +} + +FString UConceptorWidgetBase::GetFilenameFromHistory(FString RawJson) { + TSharedRef> JsonReader = TJsonReaderFactory::Create(RawJson); + TSharedPtr OutValue; + TSharedPtr MainObject; + FString Filename = "None"; + + if (FJsonSerializer::Deserialize(JsonReader, OutValue) && Progress == 1.0f) { + MainObject = OutValue->AsObject(); + TSharedPtr OutputsObject = MainObject->GetObjectField(LastPromptId)->GetObjectField("outputs"); + + for (const auto& KeyValuePair : OutputsObject->Values) { + const FString& Key = KeyValuePair.Key; + if (!KeyValuePair.Value->AsObject()->GetArrayField("images").IsEmpty()) { + TSharedPtr SubObject = KeyValuePair.Value->AsObject()->GetArrayField("images")[0]->AsObject(); + if (SubObject->GetStringField("type").Equals("output")) { + Filename = SubObject->GetStringField("filename"); + break; + } + } + } + UE_LOG(LogTemp, Warning, TEXT("Filename: %s"), *Filename); + Progress = 0.0f; + } + + return Filename; +} + +void UConceptorWidgetBase::SetupViewportAccess() { + FLevelEditorViewportClient* ViewportClient = GCurrentLevelEditingViewportClient; + if (ViewportClient) { + EditorViewportWidget = StaticCastSharedPtr(ViewportClient->GetEditorViewportWidget()); + if (!EditorViewportWidget.IsValid()) { + UE_LOG(LogTemp, Error, TEXT("EditorViewportWidget INVALID")); + return; + } + + World = GEditor->GetEditorWorldContext().World(); + if (!World) { + UE_LOG(LogTemp, Error, TEXT("World INVALID")); + return; + } + + if (!WidgetClass) + { + UE_LOG(LogTemp, Error, TEXT("UMG Widget Class INVALID")); + return; + } + + UMGWidget = CreateWidget(World, WidgetClass); + if (!UMGWidget) + { + UE_LOG(LogTemp, Error, TEXT("Failed to create UMG widget.")); + return; + } + + SlateWidget = UMGWidget->TakeWidget(); + EditorViewportWidget->AddOverlayWidget(SlateWidget.ToSharedRef()); + + UE_LOG(LogTemp, Warning, TEXT("Viewport Setup Successful")); + } + else { + UE_LOG(LogTemp, Error, TEXT("Couldn't get ViewportClient")); + } +} + +void UConceptorWidgetBase::UpdateWorkflows() { + FString PluginDir = FPaths::ProjectPluginsDir() + TEXT("Conceptor/Content/Data/"); + UE_LOG(LogTemp, Warning, TEXT("Checking for workflows under: %s"), *PluginDir); + IFileManager::Get().FindFiles(Workflows, *PluginDir, TEXT("*.json")); +} + +bool UConceptorWidgetBase::LoadWorkflow(FString Workflow) { + FString FileDir = FPaths::ProjectPluginsDir() + TEXT("Conceptor/Content/Data/") + Workflow; + if (FFileHelper::LoadFileToString(JsonString, *FileDir)) { + UE_LOG(LogTemp, Warning, TEXT("Workflow: %s - loaded"), *Workflow); + return true; + } + else { + UE_LOG(LogTemp, Warning, TEXT("Workflow loading failed")); + return false; + } +} + +void UConceptorWidgetBase::UpdateModels() { + FHttpModule* Http = &FHttpModule::Get(); + TSharedRef Request = Http->CreateRequest(); + Checkpoints.Empty(); + ControlNets.Empty(); + + Request->OnProcessRequestComplete().BindLambda([this](FHttpRequestPtr Request, FHttpResponsePtr Response, bool bWasSuccessful) + { + if (bWasSuccessful && Response.IsValid()) + { + TSharedRef> JsonReader = TJsonReaderFactory::Create(Response->GetContentAsString()); + TSharedPtr OutValue; + TSharedPtr MainObject; + + if (FJsonSerializer::Deserialize(JsonReader, OutValue)) { + MainObject = OutValue->AsObject(); + TArray> FilesArray = MainObject->GetArrayField("files"); + + for (TSharedPtr& Value : FilesArray) { + TSharedPtr FileObject = Value->AsObject(); + FString FileName; + bool IsCheckpointsFile = FileObject->GetStringField("path").Split("checkpoints\\", nullptr, &FileName); + bool IsControlNetFile = FileObject->GetStringField("path").Split("controlnet\\", nullptr, &FileName); + + if ((IsCheckpointsFile || IsControlNetFile) && (FileName.Contains(".safetensors") || FileName.Contains(".pth"))) { + if (IsCheckpointsFile) { + Checkpoints.Add(FileName); + UE_LOG(LogTemp, Warning, TEXT("%s added to Checkpoints"), *FileName); + } + else { + ControlNets.Add(FileName); + UE_LOG(LogTemp, Warning, TEXT("%s added to ControlNets"), *FileName); + } + } + } + } + } + OnModelsUpdated(); + }); + + Request->SetURL("http://127.0.0.1:8188/internal/files?directory=models"); + Request->SetVerb("GET"); + Request->ProcessRequest(); +} + +void UConceptorWidgetBase::OnModelsUpdated_Implementation() { + // +} \ No newline at end of file diff --git a/Source/Conceptor/Public/Conceptor.h b/Source/Conceptor/Public/Conceptor.h new file mode 100644 index 0000000..1b10bee --- /dev/null +++ b/Source/Conceptor/Public/Conceptor.h @@ -0,0 +1,15 @@ +// Created by Bankai Software @2025 + +#pragma once + +#include "CoreMinimal.h" +#include "Modules/ModuleManager.h" + +class FConceptorModule : public IModuleInterface +{ +public: + + /** IModuleInterface implementation */ + virtual void StartupModule() override; + virtual void ShutdownModule() override; +}; diff --git a/Source/Conceptor/Public/ConceptorWidgetBase.h b/Source/Conceptor/Public/ConceptorWidgetBase.h new file mode 100644 index 0000000..a1ebc31 --- /dev/null +++ b/Source/Conceptor/Public/ConceptorWidgetBase.h @@ -0,0 +1,165 @@ +// Created by Bankai Software @2025 + +#pragma once + +#include "CoreMinimal.h" +#include "EditorUtilityWidget.h" +#include "EditorUtilitySubsystem.h" +#include "EditorViewportClient.h" +#include "Blueprint/UserWidget.h" +#include "SLevelViewport.h" +#include "Widgets/SOverlay.h" +#include "Engine/Texture2D.h" +#include "IImageWrapper.h" +#include "IImageWrapperModule.h" +#include "Components/Image.h" +#include "Editor.h" +#include "Editor/EditorEngine.h" +#include "IWebSocket.h" +#include "WebSocketsModule.h" +#include "HttpModule.h" +#include "Interfaces/IHttpRequest.h" +#include "Interfaces/IHttpResponse.h" +#include "Json.h" +#include "Misc/Paths.h" +#include "Misc/FileHelper.h" +#include "HAL/FileManager.h" +#include "ConceptorWidgetBase.generated.h" + +DECLARE_DYNAMIC_MULTICAST_DELEGATE_OneParam(FReceivedUrl, FString, Url); +DECLARE_DYNAMIC_MULTICAST_DELEGATE_OneParam(FReceivedStatus, FString, Status); +/** + * + */ +UCLASS() +class CONCEPTOR_API UConceptorWidgetBase : public UEditorUtilityWidget +{ + GENERATED_BODY() + +protected: + + TSharedPtr Socket; + + virtual void NativeDestruct() override; + + UFUNCTION() + void SetupWebSocket(); + +public: + + UPROPERTY(BlueprintReadOnly, Category = "Conceptor") + bool IsConnected = false; + + UPROPERTY(BlueprintAssignable, Category = "Conceptor") + FReceivedUrl OnUrlReceived; + + UPROPERTY(BlueprintAssignable, Category = "Conceptor") + FReceivedStatus OnStatusReceived; + + UPROPERTY(BlueprintReadWrite, Category = "Conceptor") + float Progress = 0.0f; + + FString LastPromptId = ""; + + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Conceptor") + TSubclassOf WidgetClass; + + UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category = "Conceptor") + UUserWidget* UMGWidget; + + FString ScreenshotPath; + + TSharedPtr EditorViewportWidget; + TSharedPtr SlateWidget; + UWorld* World; + + UPROPERTY() + FString url = TEXT("ws://127.0.0.1:8188/ws?clientId=0"); + + UPROPERTY(BlueprintReadWrite, EditAnywhere, Category = "Conceptor") + FString PositivePrompt = "best quality, cyberpunk, city, cinematic"; + + UPROPERTY(BlueprintReadWrite, EditAnywhere, Category = "Conceptor") + FString NegativePrompt = "worst quality, watermark"; + + UPROPERTY(BlueprintReadWrite, EditAnywhere, Category = "Conceptor") + int32 Steps = 6; + + UPROPERTY(BlueprintReadWrite, EditAnywhere, Category = "Conceptor") + float CfgScale = 6.0f; + + UPROPERTY(BlueprintReadWrite, EditAnywhere, Category = "Conceptor") + float Denoise = 0.8f; + + UPROPERTY(BlueprintReadWrite, EditAnywhere, Category = "Conceptor") + float ControlNetStrength = 0.8f; + + UPROPERTY(BlueprintReadWrite, EditAnywhere, Category = "Conceptor") + FString Model = "dreamshaper_8.safetensors"; + + UPROPERTY(BlueprintReadWrite, EditAnywhere, Category = "Conceptor") + FString ControlNet = "diffusion_pytorch_model.fp16.safetensors"; + + UPROPERTY() + FString JsonString; + + UPROPERTY(BlueprintReadOnly, Category = "Conceptor") + TArray Checkpoints; + + UPROPERTY(BlueprintReadOnly, Category = "Conceptor") + TArray ControlNets; + + UPROPERTY(BlueprintReadOnly, Category = "Conceptor") + TArray Workflows; + + UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category = "Conceptor") + int32 QueueRemaining = 0; + + UFUNCTION(BlueprintCallable, Category = "Conceptor") + void Disconnect(); + + UFUNCTION(BlueprintCallable, Category = "Conceptor") + void Connect(); + + UFUNCTION() + void HandleMessageRecieved(FString Message); + + UFUNCTION(BlueprintCallable, Category = "Conceptor") + void SendPrompt(); + + UFUNCTION(BlueprintCallable, Category = "Conceptor") + FString GetFilenameFromHistory(FString RawJson); + + UFUNCTION(BlueprintCallable, Category = "Conceptor") + void FetchAssetURL(); + + UFUNCTION(BlueprintCallable, Category = "Conceptor") + void DownloadAndSetTexture(UImage* TargetImage, FString ImageURL); + + UTexture2D* LoadTextureFromByteArray(const TArray& ImageData); + + void UpdateWorkflows(); + + UFUNCTION(BlueprintCallable, Category = "Conceptor") + bool LoadWorkflow(FString Workflow); + + UFUNCTION(BlueprintCallable, Category = "Conceptor") + void TakeScreenshot(); + + UFUNCTION(BlueprintCallable, Category = "Conceptor") + void SetupViewportAccess(); + + void SetWorkflowValues(); + + UFUNCTION(BlueprintCallable, Category = "Conceptor") + void UpdateModels(); + + UFUNCTION(BlueprintNativeEvent, Category = "Conceptor") + void OnModelsUpdated(); + virtual void OnModelsUpdated_Implementation(); + + UFUNCTION(BlueprintNativeEvent, Category = "Conceptor") + void OnScreenshotTaken(); + virtual void OnScreenshotTaken_Implementation(); + +};