# Osero Suite

This is the official Osero Suite website including changelogs and documentation.

[Fab](https://www.fab.com/sellers/Jeren%20Osero) | [YouTube](https://www.youtube.com/@JerenOsero) | [Rumble](https://rumble.com/c/c-6746292) | [Twitter/X](https://twitter.com/JerenOsero) | [Instagram](https://www.instagram.com/jerenosero/) | [LinkedIn](https://www.linkedin.com/company/jeren-osero)

* [About](/about)
* [Support](/support)

### Featured Assets

<table data-view="cards"><thead><tr><th></th><th data-hidden data-card-cover data-type="files"></th><th data-hidden data-card-target data-type="content-ref"></th></tr></thead><tbody><tr><td>Module Creator</td><td><a href="/files/NPHr8LNtgavHMPK8KKMq">/files/NPHr8LNtgavHMPK8KKMq</a></td><td><a href="/pages/GNyCIX6cv2Isl7LJypcg">/pages/GNyCIX6cv2Isl7LJypcg</a></td></tr></tbody></table>

### Supported Assets

<table data-view="cards"><thead><tr><th></th><th data-hidden data-card-cover data-type="files"></th><th data-hidden data-card-target data-type="content-ref"></th></tr></thead><tbody><tr><td>Module Creator</td><td><a href="/files/NPHr8LNtgavHMPK8KKMq">/files/NPHr8LNtgavHMPK8KKMq</a></td><td><a href="/pages/GNyCIX6cv2Isl7LJypcg">/pages/GNyCIX6cv2Isl7LJypcg</a></td></tr><tr><td>Plugin Sync Tool</td><td><a href="/files/gpODj9NgwF62GFScK2X6">/files/gpODj9NgwF62GFScK2X6</a></td><td><a href="/pages/sz6jE5Ks5SAz1n2FNOzP">/pages/sz6jE5Ks5SAz1n2FNOzP</a></td></tr><tr><td>Render Results Screen</td><td><a href="/files/eqFYusWY9l7xjKPZpkEx">/files/eqFYusWY9l7xjKPZpkEx</a></td><td><a href="/pages/HRFhsaGwwlWXwst3kRxp">/pages/HRFhsaGwwlWXwst3kRxp</a></td></tr></tbody></table>


# About

### Osero Suite

The Osero Suite is a suite of tools developed for Unreal Engine and sold on Fab. These tools are developed by Jeren Osero as a hobby around other life commitments such as work and family. Most of these tools are ones that Jeren Osero has developed for his personal use and decided to improve and share with the rest of the world.

{% hint style="info" %}
[View the Osero Suite on Fab!](https://www.fab.com/sellers/Jeren%20Osero)
{% endhint %}

### Jeren Osero

Jeren Osero is a a Software Engineer and Game Developer from Australia who has a passion for Unreal Engine, C++, and being productivly lazy by automating tedious tasks. He's been working with Unreal Engine and C++ since UE4.0 in 2015, and has extensive experience working on multiple professional and experimental projects over the last decade in both the game and animation industries.

{% hint style="info" %}
[Visit the Jeren Osero website!](https://jerenosero.com/)
{% endhint %}


# Frequently Asked Questions

{% hint style="info" %}
For Asset-Specific Questions, please see their individual FAQ pages:

* [Module Creator FAQ](/supported-assets/module-creator/frequently-asked-questions)
  {% endhint %}

### Q. Where can I buy the Osero Suite?

A. The Osero Suite is available for purchase on [Fab](https://www.fab.com/sellers/Jeren%20Osero).

### Q. Can I buy Osero Suite Tools in a bundle?

A. Unfortunately Fab does not provide the ability to sell multiple products in a bundle, so each tool is sold separately.

### Q. Does the Osero Suite ever go on sale and can I get a discount outside of a sale?

A. Osero Suite products are put on sale regularly, usually in line with Fab sale events. This will sometimes include a couple of products, or all products, depending on the invitation that we receive from Epic Games.

{% hint style="warning" %}
In between sales, the Osero Suite is sold at full price and no discounts will be given out.
{% endhint %}

We are also unable to provide advance notice of upcoming sale dates due to Epic Games' seller agreement. We are not allowed to publicly discuss a sale until it has been announced on Epic Games' socials, which is usually the day the sale starts.

Follow Jeren Osero on socials to see updates about sales: [YouTube](https://www.youtube.com/@JerenOsero) | [Twitter/X](https://twitter.com/JerenOsero) | [Instagram](https://www.instagram.com/jerenosero/) | [LinkedIn](https://www.linkedin.com/company/jeren-osero).

### Q. Which platforms are supported for the Osero Suite?

{% hint style="success" %}
A. The Osero Suite has been fully tested on **Windows** platforms.
{% endhint %}

{% hint style="warning" %}
The Osero Suite is untested on other platforms including:

* Mobile (Android/iOS)
* Mac OS
* Linux
* Gaming Consoles (XBox/PlayStation/Switch/Etc)

It's possible that the assets/plugins may work just fine on these platforms. However, we do not currently support or test our products on these platforms.
{% endhint %}


# Support

Updated support methods coming soon. For now you can [use the Contact Form here](https://jerenosero.com/osero-suite/contact-form/).


# \_TEMPLATE {New Tool}

Documentation for the Osero Suite: {New Tool}

[Fab](https://www.fab.com/sellers/Jeren%20Osero) | [YouTube](https://www.youtube.com/@JerenOsero) | [Rumble](https://rumble.com/c/c-6746292) | [Twitter/X](https://twitter.com/JerenOsero) | [Instagram](https://www.instagram.com/jerenosero/) | [LinkedIn](https://www.linkedin.com/company/jeren-osero)

## Quick Links

* Fab Link
* Videos:
  * Introduction Video: YouTube | Rumble
* Support

## General Information

* UE Versions
  * Supported versions: 5.2+
  * Versions no longer supported (sold as is): 5.1

## Section Links

* About
* Changelog
* How to Use


# About

Information about the {New Tool}

{Introduction Video}

{Fab Description}

### Features

{Fab Feature List}


# Changelog

Changelog for {New Tool}

### \[{Date}]: Release v1.0

{Changelog dot points}


# How To Use

Documentation for the {New Tool}

{List of subpages}


# Accessing the {New Tool}

Documentation for the {New Tool}

Access the {New Tool} via the Osero Suite Menu located on the Level Editor Toolbar.

{Insert Picture}

The Osero Suite Menu can also be located in the Window Menu.

{Insert Picture}


# UI Outline

Documentation for the {New Tool}

### Header

{Insert picture}

1. **Store Page**: Opens the Fab Store Page for this tool in your web browser.
2. **Documentation**: Opens the documentation page for this tool in your web browser.
3. **Osero Suite Symbol**: Opens the Jeren Osero website in your web browser.

### Parameters

#### {Category 1}

{Insert Picture}

...

#### {Category 2}

{Insert Picture}

...

### Footer

{Insert Picture}

1. **Version Number**: Shows the tool's current version number.
2. **{Tool Button 1}**: {Tool Button 1 Description}


# Plugin Content

Documentation for the {New Tool}

### Base <a href="#base" id="base"></a>

* **{Asset 1}**: {Asset 1 Description}

### Example <a href="#example" id="example"></a>

* **{Asset 2}**: {Asset 2 Description}


# Project Settings

Documentation for the {New Tool}

Access the {New Tool} Project Settings by going to **Project Settings** > **Plugins** > **Osero Suite: {New Tool} Settings**.

{Insert Picture}

...


# Module Creator

Documentation for the Osero Suite: Module Creator

[Fab](https://www.fab.com/sellers/Jeren%20Osero) | [YouTube](https://www.youtube.com/@JerenOsero) | [Rumble](https://rumble.com/c/c-6746292) | [Twitter/X](https://twitter.com/JerenOsero) | [Instagram](https://www.instagram.com/jerenosero/) | [LinkedIn](https://www.linkedin.com/company/jeren-osero)

## Quick Links

* [Fab Link](https://www.fab.com/listings/1386de9b-6e3d-4aa1-a84b-3d10eda24c86)
* Videos:
  * Introduction: [YouTube](https://www.youtube.com/watch?v=blAKd4bcVwc) | [Rumble](https://rumble.com/v5emuit-osero-suite-module-creator-introduction.html)
  * Tutorial: [YouTube](https://youtu.be/AMH0wwnGkyA) | [Rumble](https://rumble.com/v6qil06-osero-suite-module-creator-tutorial.html)
* [Support](/support)

## General Information

* UE Versions
  * Supported versions: 5.2+
  * Versions no longer supported (sold as is): 5.1

## Section Links

* [About](/supported-assets/module-creator/about)
* [Changelog](/supported-assets/module-creator/changelog)
* [How to Use (5.2+)](/supported-assets/module-creator/how-to-use-5.2+)
* [How to Use (Legacy 5.1)](/supported-assets/module-creator/how-to-use-legacy-5.1)
* [Frequently Asked Questions](/supported-assets/module-creator/frequently-asked-questions)


# About

Information about the Osero Suite: Module Creator

{% embed url="<https://www.youtube.com/watch?v=blAKd4bcVwc>" %}

The Osero Suite Module Creator is an Unreal Engine editor tool that offers a quick and easy solution for creating new C++ modules for a uproject or uplugin. It removes the hassle of manually copying and creating code files and replaces it with the simple click of a button! The tool Includes settings for module type and loading phase, and also has support for module templates and revision control, making the process of creating new C++ modules super easy and simple.

### Features

* Easily create new C++ modules for a uproject or uplugin!
* Select module type (eg, runtime, editor, etc)!
* Select loading phase (eg, default, post-engine init, etc)!
* Use module templates to create similar modules for multiple plugins or projects!
* Ability to create a new module as a new project plugin!
* Handles revision control for newly generated files!

{% hint style="info" %}
[View the Osero Suite: Module Creator on Fab!](https://www.fab.com/listings/1386de9b-6e3d-4aa1-a84b-3d10eda24c86)
{% endhint %}


# Changelog

Changelog for the Osero Suite: Module Creator.

### \[05 June 2025]: Hotfix 1.1b

* Updated example module template with updated Osero Suite module data
* Updated to UE 5.6

### \[09 March 2025]: Hotfix 1.1a

* Bug Fix: Buttons are disabled in Module Template Data Assets
* UI Fix: Renamed category "Source Control" to "Revision Control" to match UE5's terminology updates.
* UI Fix: Fixed Osero Suite Icons

### \[27 February 2025]: Update v1.1

* Updated to UE5.5
* Updated copyright notice
* Removed UFUNCTIONS from Statics class to avoid cluttering Blueprint menus with duplicate static functions when multiple Osero Suite tools are installed
* Code optimisation and reworks
* Fixed bug in 5.4+ where settings didn't save to config properly
* Updated code for consistency across all Osero Suite tools
  * This includes adding a sort function to the Osero Suite Menu so that the tools are always in the same order, not dependant on which order the plugins load
  * This includes updating code to new Osero Suite naming convention
  * Osero Suite logo in tool now opens the Jeren Osero website
  * All code for each engine version is in ALL plugin versions so it doesn't matter which engine version the plugin comes from, it should work for all (5.2+)
  * Resynced static functions across all Osero Suite tools so that they perform the same in every tool
* Added in Module Templates
  * The tool now uses Osero Suite: Module Template Data Assets to store template modules
  * The default template can be set in the new Osero Suite: Module Creator Project Settings
  * Import/Export Templates from/to json files
  * Templates give the user flexibility to add extra files other than just the module h/cpp and build.cs
  * Ability to copy an existing module in the project and convert it into a template
  * Templates use key variables to replace text when generating the new module - users can add and modify keys as they wish (default keys include "{Module Name}", "{Module Name UPPER}", "{Plugin Name}", and "{Copyright Notice}")
* Fixed some minor UI issues
* Added Osero Suite Footer
  * Moved "Generate Module" to footer and renamed "Create Module"
  * Added plugin version to footer
* Added icons to buttons throughout tool
* Added ability to create the new module as a new plugin
* Renamed "Source Control" to "Revision Control" to align with the change by Epic Games in 5.2+
* Updated documentation (<https://docs.oserosuite.com/supported-assets/module-creator>)

### \[26 September 2023]: Release v1.0

* **Status**: Published
* **Marketplace Link**: <https://www.unrealengine.com/marketplace/en-US/product/71f5b1f9b9504656980c72fe8a0fe969>
* **Release Date**: 15 November 2023
* **Main Documentation**: <https://jerenosero.com/osero-suite/module-creator/>
* **Code Modules**:
  * OseroSuite\_ModuleCreator: Editor Only
* **Network Replicated**: No (Not required as editor tool)
* **Supported Development Platforms**: Windows
* **Key Features**:
  * Easily create new C++ modules for a uproject or uplugin
  * Select module type (eg, runtime, editor, etc)
  * Select loading phase (eg, default, post-engine init, etc)
  * Handles source control for newly generated files


# How to Use (5.2+)

Documentation for the Osero Suite: Module Creator update 1.1 (5.2+)

Update 1.1 added some new features and modified how some features work, however, the general principle is still the same as the previous version.

* [Tutorial](/supported-assets/module-creator/how-to-use-5.2+/tutorial)
* [Accessing the Module Creator](/supported-assets/module-creator/how-to-use-5.2+/accessing-the-module-creator)
* [UI Outline](/supported-assets/module-creator/how-to-use-5.2+/ui-outline)
* [Module Templates](/supported-assets/module-creator/how-to-use-5.2+/module-templates)
* [Plugin Content](/supported-assets/module-creator/how-to-use-5.2+/plugin-content)
* [Project Settings](/supported-assets/module-creator/how-to-use-5.2+/project-settings)

{% hint style="info" %}
For general information on Unreal Engine Modules, [see the Epic Games documentation here](https://dev.epicgames.com/documentation/en-us/unreal-engine/unreal-engine-modules).
{% endhint %}


# Tutorial

Documentation for the Osero Suite: Module Creator update 1.1 (5.2+)

{% embed url="<https://youtu.be/AMH0wwnGkyA>" %}

## Transcript

### Intro

The Osero Suite: Module Creator is an Unreal Engine editor tool that offers a quick and easy solution for creating new C++ modules for a uproject or uplugin. It removes the hassle of manually copying and creating code files and replaces it with the simple click of a button! The tool includes settings for module type and loading phase, and also has support for module templates and source control, making the process of creating new C++ modules super easy and simple.

### Accessing the Module Creator

Once the Osero Suite: Module Creator plugin is installed, the Module Creator can be accessed via the Osero Suite menu in the Level Editor Toolbar or the Window menu.

<div><figure><img src="/files/l3qi94ZQizCfIVfAfRso" alt=""><figcaption></figcaption></figure> <figure><img src="/files/AiXOZyW3eVfSToHfveB6" alt=""><figcaption></figcaption></figure></div>

### Create a new Module

To create a new module, the first thing needed is a name.

<figure><img src="/files/SrntXRmb7CCzgkiKETg3" alt=""><figcaption></figcaption></figure>

The Module Creator will replace invalid characters with an underscore to make sure it fits with Unreal Engine’s naming convention.

<figure><img src="/files/1luW83KOv2aGQW13qZx9" alt=""><figcaption></figcaption></figure>

The module type and loading phase then need to be defined.

<div><figure><img src="/files/0iVS5Ew1EWWpYvjMcWI4" alt=""><figcaption></figcaption></figure> <figure><img src="/files/PmMS53JbEMWtwxSfCLzI" alt=""><figcaption></figcaption></figure></div>

The Module Creator uses a special Data Asset called a “Module Template” in order to know what files to create. The default template is a copy of the Blank Plugin template from the Plugin Manager and will create a Build.cs, module header, and module cpp file.

<div><figure><img src="/files/6P310cJWyNHzvXXGxK35" alt=""><figcaption></figcaption></figure> <figure><img src="/files/ObBW33FFWeM1cdyv74Dl" alt=""><figcaption></figcaption></figure></div>

The new module then needs a destination. This can be either the current project, an existing project plugin, or a new project plugin. The tool will automatically create or update the relevant uproject or uplugin files.

<div><figure><img src="/files/O3tdN4gkGs13OXVltWQI" alt=""><figcaption></figcaption></figure> <figure><img src="/files/183Ux0x9MQrc6QuekTh8" alt=""><figcaption></figcaption></figure></div>

The final option is whether or not to check Revision Control for any files created or modified. This saves having to manually check out files or mark them for add when using Source Control like Perforce.

<figure><img src="/files/BNZrmKnHst08ATERv9kx" alt=""><figcaption></figcaption></figure>

When “Create Module” is clicked, the Module Creator will then use all the settings to create and modify the relevant files. The project files will then be regenerated to add the module into the Visual Studio solution. Then, based on your Hot Reload and Live Coding settings, the project will recompile the solution with the new module included.

<div><figure><img src="/files/3pu96lkc91SaGHi16USa" alt=""><figcaption></figcaption></figure> <figure><img src="/files/gEkqIxcs3c30WBWrZzlN" alt=""><figcaption></figcaption></figure></div>

It should be noted that sometimes new modules will not immediately show up despite Hot Reload or Live Coding. To fix this, close Unreal Engine and manually build from Visual Studio.

<figure><img src="/files/gQjm1OtPWiC7ufTLATqL" alt=""><figcaption></figcaption></figure>

### Module Templates

A core feature of the Module Creator is Module Templates. Module Templates are special Data Assets that contain information about what files to create when building a new module. By default, the tool uses **OS\_MDC\_DefaultTemplate\_Data**, which is a basic module with no custom code.

<div><figure><img src="/files/6P310cJWyNHzvXXGxK35" alt=""><figcaption></figcaption></figure> <figure><img src="/files/ObBW33FFWeM1cdyv74Dl" alt=""><figcaption></figcaption></figure></div>

The plugin also comes with an example of a custom Module Template called **OS\_MDC\_Template\_OseroSuiteEditorTool**, which is a copy of a basic Osero Suite tool module with no custom code.

<div><figure><img src="/files/hEMWNVVsEfpyNvRjjHkG" alt=""><figcaption></figcaption></figure> <figure><img src="/files/OIQ40fI9Vd7q1UQg4eh1" alt=""><figcaption></figcaption></figure></div>

To create a new Module Template, simply click the plus button under the Module Template field.

<figure><img src="/files/XEb6yaCfUr4BKu5FHFI5" alt=""><figcaption></figcaption></figure>

The new Module Template will be a copy of the default template and can be modified as needed.

<figure><img src="/files/AVIQq4YcOG8aNAy7IuZo" alt=""><figcaption></figcaption></figure>

Module Templates have three buttons at the top.

<figure><img src="/files/G4FXBqlwcV9CQ4IFO2bX" alt=""><figcaption></figcaption></figure>

Copy Existing Module will replace all the data in this template with the imported data from an existing module in the current project.

<figure><img src="/files/U0eboreLp57z8t0AdPUW" alt=""><figcaption></figcaption></figure>

Export to Json will create a new Json file with all of the data in this template for easy copying between projects or editing in an external program.

<figure><img src="/files/s7G3CdDfoEdkJLBoU8B3" alt=""><figcaption></figcaption></figure>

Import from Json will replace all the data in this template with the imported data from a valid Json file.

<figure><img src="/files/fP8bt7wwbohhXop1i9Ec" alt=""><figcaption></figcaption></figure>

The essentials of a module include the module header, module cpp, and Build.cs files. If any of these are left blank, the tool will abort and not create a new module.

<div><figure><img src="/files/MzpdsRwezuz0iQjFSpSb" alt=""><figcaption></figcaption></figure> <figure><img src="/files/1OTfhuiMZeAhuTTayArA" alt=""><figcaption></figcaption></figure></div>

Keys allow the user to modify data in a template automatically when the new module is created.

<figure><img src="/files/PXk8gnYBrp4uCdbkzap9" alt=""><figcaption></figcaption></figure>

Default keys are internal keys used behind the scenes and can be used in most text fields of the module template. Clicking any of these keys will copy it so that it can be easily pasted into the text fields.

<figure><img src="/files/9zy8h1soV19sBpTsBEv2" alt=""><figcaption></figcaption></figure>

Custom keys allow the user to set additional keys to be replaced in the module creation process. Any keys defined here will appear in the Module Creator window when this template is being used to create a new module. In the example, there are two custom keys: {ID} and {Full Name}.

<div><figure><img src="/files/2yMaKixecLaVP2cRcEYf" alt=""><figcaption></figcaption></figure> <figure><img src="/files/zQV6Fg0clyMSXuDwKZYs" alt=""><figcaption></figcaption></figure></div>

Additional Files are files other than the module header, module cpp, and Build.cs files. The example includes three additional files: S{ID}\_Tool, {ID}\_Style, and {ID}\_Statics. Additional files can include a header, cpp, or “other” file. They can also include a subfolder, while the header and “other” files can be marked as Private, meaning they will be placed in the Private folder, rather than the public folder.

<div><figure><img src="/files/A36xbcfRwu8QMbMHsJa0" alt=""><figcaption></figcaption></figure> <figure><img src="/files/JvhFJTCE1AMjgddcH6jY" alt=""><figcaption></figcaption></figure></div>

### Project Settings

The Osero Suite: Module Creator also includes its own project settings. In these settings, the default template can be set.

<figure><img src="/files/mim1ZECmvL55aKDEXusy" alt=""><figcaption></figcaption></figure>

### Outro

The Osero Suite: Module Creator is a useful tool to save time when creating Unreal Engine C++ modules. For more information, visit [docs.oserosuite.com](/).


# Accessing the Module Creator

Documentation for the Osero Suite: Module Creator update 1.1 (5.2+)

Access the Osero Suite: Module Creator via the Osero Suite Menu located on the Level Editor Toolbar.

<figure><img src="/files/dp1zxZSB0Y3Vb45REFZT" alt=""><figcaption></figcaption></figure>

The Osero Suite Menu can also be located in the Window Menu.

<figure><img src="/files/wWMWPmf3AvRKOXM06Xxg" alt=""><figcaption></figcaption></figure>


# UI Outline

Documentation for the Osero Suite: Module Creator update 1.1 (5.2+)

### Header

<figure><img src="/files/OJNtBLKoe3o1cKRfphRL" alt=""><figcaption></figcaption></figure>

1. **Store Page**: Opens the Fab Store Page for this tool in your web browser.
2. **Documentation**: Opens the documentation page for this tool in your web browser.
3. **Osero Suite Symbol**: Opens the Jeren Osero website in your web browser.

### Parameters

#### Module Settings

<figure><img src="/files/R49dnBBEcuwZWuOpgDmt" alt=""><figcaption></figcaption></figure>

* **New Module Name**: The name of the new module to be generated.
* **New Module Type**: The type of the new module to be generated (ie, Runtime/Editor/etc).
* **New Module Loading Phase**: The phase in which this new module will load when the project/package loads.

#### Template

<figure><img src="/files/45PjL2vyRlwnrgUWT7lw" alt=""><figcaption></figcaption></figure>

* **Module Template**: The template to use to generate the new module ([see here](/supported-assets/module-creator/how-to-use-5.2+/module-templates)).
  * (1) Create a new Module Template.
  * (2) Use the Default Template for the new module (set in Project Settings).
* **Key Data**: Key data to be replaced in the template text when creating the new module.

#### Destination

* **Create as New Plugin**: If ticked, this module will be created as a new blank plugin, rather than being added to an existing project or plugin.

*Create as New Plugin ticked off:*

<figure><img src="/files/6fBOfNM6qoON518qWg3g" alt=""><figcaption></figcaption></figure>

* **Target**: Select the existing project or plugin where this new module will be added.

*Create as New Plugin ticked on:*

<figure><img src="/files/cWSbXXxjJ0HtoJC7YKNZ" alt=""><figcaption></figcaption></figure>

* **Plugin Name Override**: If this is left empty, the new Plugin will use the same name as *NewModuleName*.
* Plugin Details: All of the details to go in the new .uplugin file. These can be left as default and filled in later in Visual Studio or the in-built *Plugin Manager*.
  * Versions
    * **Plugin Version**: The version name for this plugin.
    * **Engine Version**: The target engine version for this plugin.
  * Plugin Descriptors
    * **Friendly Name**: The user-friendly name of this plugin (shown throughout the engine UI).
    * **Description**: The description for this plugin.
    * **Category**: The category for this plugin in the Plugin Manager.
  * Creator Details
    * **Created By**: This plugin's author.
    * **Created By URL**: This plugin's author's website.
    * **Docs URL**: The link to this plugin's documentation.
    * **Marketplace URL**: The link to this plugin's Marketplace URL (this is required for submitting to Fab).
    * **Support URL**: The link to support for this plugin (eg, support web page or email).
  * Plugin Options
    * **Can Contain Content**: Whether this plugin has a Content folder or not.
    * **Is Beta Version**: Whether this plugin is flagged as Beta.
    * **Is Experimental Version**: Whether this plugin is flagged as Experimental.
    * **Installed**: Whether this plugin is flagged as Installed.
  * Platforms
    * **Platform Allow List**: The target platforms for this plugin.
    * **Platform Deny List**: Any platforms that this plugin is not intended to work on.
  * Dependencies
    * **Plugin Dependencies**: Any other Unreal Engine plugins that this plugin relies on.

#### Revision Control

<figure><img src="/files/aR2B2HdUN9ll6c5pU8kf" alt=""><figcaption></figcaption></figure>

* **Check Revision Control**: Add the new files to Revision Control (if connected).

### Footer

<figure><img src="/files/dD7Mh7DmzB5VUwgcXBPM" alt=""><figcaption></figcaption></figure>

1. **Version Number**: Shows the tool's current version number.
2. **Create Module**: When clicked, the Module Creator will create a new module for your project or plugin based on the data in the Parameters.
   1. New code files will be generated and the uplugin or uproject file specified in *Target* will be edited to add the new module, *or* a new Plugin will be created depending on the settings.
   2. The project files for your project will then be regenerated to add the new module into the Visual Studio solution.
   3. Then based on your Hot Reload and Live Coding settings, the project will recompile the solution with the new module included.


# Module Templates

Documentation for the Osero Suite: Module Creator update 1.1 (5.2+)

Module Templates are special Data Assets that contain data to use when creating a new module. By default, the tool uses **OS\_MDC\_DefaultTemplate\_Data**, which is a basic module with no custom code. It's essentially a copy of the module used in the *Blank Plugin* template when creating a new plugin in the Plugin Manager.

The plugin also comes with an example of a custom Module Template called **OS\_MDC\_Template\_OseroSuiteEditorTool**, which is a copy of a basic Osero Suite tool module with no custom code. It includes code to add a new tool to the Osero Suite menu, create its slate UI, Details Customisation, and basic static functions used across many Osero Suite tools.

### Viewing the Example Template

The Example Template is located in **Plugins** > **Osero Suite: Module Creator Content** > **Example**.

<figure><img src="/files/XFKM2hDwMU0C4cfRpVL1" alt=""><figcaption></figcaption></figure>

### Creating a New Template

To create a new Module Template, right click in the *Content Browser* or click **+Add**. Go to **Miscellaneous** > **Data Asset**.

<figure><img src="/files/28OlmhEq2YPTTTXME8gi" alt=""><figcaption></figcaption></figure>

Select **Osero Suite: Module Template**.

<figure><img src="/files/TRNyTYBzsETzVhq54E7U" alt=""><figcaption></figcaption></figure>

The new Module Template will be a copy of the default template and can be modified as needed.

<figure><img src="/files/u5J61k6fFSbaeLNenf22" alt=""><figcaption></figcaption></figure>

### Actions

<figure><img src="/files/dX8jGdsIe6sYYGt8Gk2C" alt=""><figcaption></figcaption></figure>

#### Copy Existing Module

Clicking this button will replace all the data in this template with the imported data from an existing module in the current project. This action will provide a window to select an existing module to copy.

<figure><img src="/files/0ZzkIATo81Ivb1dhM4zd" alt=""><figcaption></figcaption></figure>

* **Accept**: Replaces ALL data in this template with the data from the selected module. This includes the module header, cpp, Build.cs, and any additional files. This will NOT clear custom keys.
* **Cancel**: Cancel the operation, leaving the template as it is.

#### Import from Json

Clicking this button will replace all the data in this template with the imported data from a valid json file. The tool performs a check to make sure the json file is a json saved from the Osero Suite: Module Creator.

#### Export to Json

Clicking this button will create a new json file with all of the data in this template for easy copying between projects or editing in an external program. The json file will also include an "OseroSuite" field to identify it as a valid json file for import.

### Essentials

<figure><img src="/files/cHvrvEAbzg2h8NoKT0C8" alt=""><figcaption></figcaption></figure>

The essentials of a module include the module header, module cpp, and Build.cs files. If any of these are left blank, the tool will abort and not create a new module.

### Keys (Optional)

<figure><img src="/files/5fXfTDOjaC2ibeLBpNHU" alt=""><figcaption></figcaption></figure>

Keys allow the user to modify data in a template automatically when the new module is created.

* **Default Keys**: These are internal keys used behind the scenes and can be used in most text fields of the module template. Clicking any of these keys will copy it to the clipboard so that it can be easily pasted into the text fields.
  * {Module Name} will be replaced with the **New Module Name** defined in the tool when creating a new module.
  * {Module Name UPPER} will be replaced with the **New Module Name** defined in the tool when creating a new module, but all in UPPERCASE. Useful for defining {Module Name UPPER}\_API in templates.
  * {Plugin Name} will be replaced with the **Target** name. This will be the Plugin Name if it's a .uplugin, or the Project Name if it's the root project.
  * {Copyright Notice} will be replaced with this Project's Copyright Notice defined in Project Settings.
* **Custom Keys**: Custom keys allow the user to set additional keys to be replaced in the module creation process. Any keys defined here will appear in the Module Creator window when this template is being used to create a new module. In the example, there are two custom keys: {ID} and {Full Name}.

<figure><img src="/files/pGuPpSrm2Gcln6b8MTjW" alt=""><figcaption></figcaption></figure>

### Additional Files (Optional)

Additional Files are files other than the essential module header, module cpp, and Build.cs files. The example includes three additional files: **S{ID}\_Tool**, **{ID}\_Style**, and **{ID}\_Statics**.

<figure><img src="/files/Bp0kcEwwN0zWHWw1cjzR" alt=""><figcaption></figcaption></figure>

1. View the previous additional file.
2. The file number that you are viewing and the total number of additional files.
3. Add a new additional file to this template.
4. Delete ALL additional files from this template.
5. View the next additional file.
6. The subfolder of this additional file relative to the root of the new module (ie, where the module header/cpp is saved).
7. Insert a new blank additional file here.
8. Duplicate this additional file.
9. Delete this additional file from this template.
10. The additional file's header data.
    1. **Private** will place the header in the new module's Private folder rather than Public.
11. The additional file's cpp data.
    1. Leaving the cpp name blank will force the tool to use the header name for the cpp as well. If both are blank, the tool will not generate a module successfully and it will abort the process.
    2. New cpp files will always be placed in the new module's Private folder.
12. The additional file's other data. This other data can be of any valid file type.
    1. The file extension is defined for this file.
    2. **Private** will place this file in the new module's Private folder rather than Public.


# Plugin Content

Documentation for the Osero Suite: Module Creator update 1.1 (5.2+)

### Base

* **OS\_MDC\_DefaultTemplate\_Data**: The default empty module used for creating a new module. The default template can be changed in the [Module Creator Project Settings](/supported-assets/module-creator/how-to-use-5.2+/project-settings).

### Example

* **OS\_MDC\_Template\_OseroSuiteEditorTool**: An example custom template showing off keys and additional files. This template is generally used to create new Osero Suite Editor Tool. See [Module Templates](/supported-assets/module-creator/how-to-use-5.2+/module-templates) for more info.


# Project Settings

Documentation for the Osero Suite: Module Creator update 1.1 (5.2+)

Access the Module Creator Project Settings by going to **Project Settings** > **Plugins** > **Osero Suite: Module Creator Settings**.

<figure><img src="/files/53A7DhrxhPKmeapvNNFL" alt=""><figcaption></figcaption></figure>

Here you can edit the default template for the Module Creator to use. Clicking the *Return to Default* button for **Default Module Tempate** will reset it to *OS\_MDC\_DefaultTemplate\_Data*.

<figure><img src="/files/3I0hfdwRO8pSNTXmlbh5" alt=""><figcaption></figcaption></figure>


# How To Use (Legacy 5.1)

Documentation for the Osero Suite: Module Creator update 1.0 (5.1)

1. Open the tool via the Osero Suite Menu, or through Window > Osero Suite.

<div><figure><img src="/files/bzaKfFwyAYrLGDnI3HRH" alt=""><figcaption><p>Access the tool via the Osero Suite Menu</p></figcaption></figure> <figure><img src="/files/BrNYajpV79SO9LgDUzLC" alt=""><figcaption><p>Access the tool via the Window Menu</p></figcaption></figure></div>

2\. Enter details:

* **New Module Name**: The name of the new module to be created.
* **Destination**: The uproject or uplugin where this module will be created.
* **New Module Type**: The type of module this module will be (eg, Runtime, Editor, Uncooked Only, etc).
* **New Module Loading Phase**: The time when this new module will be loaded on engine initialisation (eg, Default, Earliest Possible, Post-Engine Init, etc).
* **Add to Source Control**: Whether to add the new code generated code files to Source Control if this project is connected to a Source Control provider.

<figure><img src="/files/VVIXtjoGs2mQrTvxXB44" alt=""><figcaption></figcaption></figure>

3\. Click **Generate Module**.

* New code files will be generated and the uplugin or uproject file specified in *Destination* will be edited to add the new module properly.
* The project files will then be regenerated to add the new module into the Visual Studio solution.
* Then based on your hot reload and live coding settings, the project will recompile the solution with the new module included.


# Frequently Asked Questions

### Q. Why can't I view the Default or Example Templates in the Module Template selection menu?

A. Sometimes when the menu is created, Unreal Engine likes to turn off "Show Plugin Content", especially in UE 5.3. Make sure "Show Plugin Content" is ticked on to select the Default or Example Template.

<div><figure><img src="/files/j19Zld9cLAmDNmttpbkq" alt=""><figcaption></figcaption></figure> <figure><img src="/files/PYVHGvEPa73vwFVktDmL" alt=""><figcaption></figcaption></figure></div>


# Plugin Sync Tool

Documentation for the Osero Suite: Plugin Sync Tool (formerly Osero Suite: Plugin Migration Tool)

[Fab](https://www.fab.com/sellers/Jeren%20Osero) | [YouTube](https://www.youtube.com/@JerenOsero) | [Rumble](https://rumble.com/c/c-6746292) | [Twitter/X](https://twitter.com/JerenOsero) | [Instagram](https://www.instagram.com/jerenosero/) | [LinkedIn](https://www.linkedin.com/company/jeren-osero)

## Quick Links

* [Fab Link](https://www.fab.com/listings/2a03aa14-bbf1-404e-b9c9-055fb5b747a9)
* Videos:
  * Introduction Video: [YouTube](https://www.youtube.com/watch?v=D8UsIrMaHRM) | [Rumble](https://rumble.com/v5emvhg-osero-suite-plugin-migration-tool-introduction.html)
  * Tutorial: [YouTube](https://youtu.be/YkzB7N-Ebi0) | [Rumble](https://rumble.com/v6rg3a3-osero-suite-plugin-sync-tool-tutorial.html)
* [Support](/support)

## General Information

* UE Versions
  * Supported versions: 5.2+
  * Versions no longer supported (sold as is): 5.1

## Section Links

* [About](/supported-assets/plugin-sync-tool/about)
* [Changelog](/supported-assets/plugin-sync-tool/changelog)
* [How to Use (5.2+)](/supported-assets/plugin-sync-tool/how-to-use-5.2+)
* [How to Use (Legacy 5.1)](/supported-assets/plugin-sync-tool/how-to-use-legacy-5.1)


# About

Information about the Osero Suite: Plugin Sync Tool

{% embed url="<https://www.youtube.com/watch?v=D8UsIrMaHRM>" %}

The Osero Suite Plugin Sync Tool offers an easy solution for plugin management across multiple projects. By entering a project’s details and "Plugins" folder path, easily sync plugins from one project to another with a click of a button! The Plugin Sync Tool saves the hassle of using the File Explorer to copy files from one place to another and handles checking out files/marking files for add with Revision Control too.

### Features

* Easily sync project plugins between two projects with a single click in a similar way to migrating assets!
* Useful for testing plugins being developed in multiple projects!
* Handles Revision Control!
* Export/import project information to use across multiple projects!
* Works between Blueprint plugins and Blueprint projects!
* Works between C++ plugins and C++ projects!
* Works between C++ plugins and Blueprint projects!
* Migrate to multiple projects at once or a single project at a time!

### Important/Additional Notes

* This plugin is currently a simple copy/paste tool, it currently offers **no sort of merging/diffing of text files**.
* This tool currently only syncs plugins saved in a project’s Plugins folder, not in an engine version’s Plugins folder.

{% hint style="info" %}
[View the Osero Suite: Plugin Sync Tool on Fab!](https://www.fab.com/listings/2a03aa14-bbf1-404e-b9c9-055fb5b747a9)
{% endhint %}


# Changelog

Changelog for the Osero Suite: Plugin Sync Tool

### \[05 June 2025]: Hotfix 1.1a

* UI Fix: Fixed tab name from "Plugin Sync" to "Plugin Sync Tool"
* UI Fix: Fixed Osero Suite Icons
* Updated to UE 5.6

### \[27 February 2025]: Update v1.1

* Updated to UE5.5
* Renamed tool from "Plugin Migration Tool" to "Plugin Sync Tool" to better reflect its functionality
* Updated copyright notice
* Removed UFUNCTIONS from Statics class to avoid cluttering Blueprint menus with duplicate static functions when multiple Osero Suite tools are installed
* Code optimisation and reworks
* Updated code for consistency across all Osero Suite tools
  * This includes adding a sort function to the Osero Suite Menu so that the tools are always in the same order, not dependant on which order the plugins load
  * This includes updating code to new Osero Suite naming convention
  * Osero Suite logo in tool now opens the Jeren Osero website
  * All code for each engine version is in ALL plugin versions so it doesn't matter which engine version the plugin comes from, it should work for all (5.2+)
  * Resynced static functions across all Osero Suite tools so that they perform the same in every tool
* Added Osero Suite Footer
  * Moved "Update ALL" to footer and renamed to "Sync All"
  * Condensed the individual project buttons into one and added to footer as "Sync \<Project Name> Only"
  * Added new Sync Plugins Menu to sync a single Plugin across all active Target Projects
  * Added plugin version to footer
* Added icons to buttons throughout tool
* Bug Fixes
  * Fixed bug in 5.4+ where settings didn't save to config properly
  * Fixed minor bug where very occasionally the tool wouldn't find any files/folders to copy
  * Fixed bug where the copied files had different timestamps to the original files
* Target Projects
  * Renamed "Project Info" to "Target Projects" and redesigned the entire UI
  * Also updated "Plugins to Sync" to collect information from This Project so that plugin names don't have to be manually typed
  * Added a "Reverse Sync" option to treat the Target Project as the This Project and vice versa
* Results Window
  * Fixed bug in the Results Window where it would show only the results from the last synced project, not all synced projects if using "Sync All"

    Also tidied up the information displayed on the Results Window to make it easier to read
* Revision Control
  * Added option to skip Revision Control Checks
* Syncing
  * Added prompt when found files newer in the Target Project than This Project for the user to determine the action taken
  * Added prompt when files are found in the Target Project that do not exist in This Project for the user to determine the action taken
  * Added option to auto-update the "Engine Version" tag in copied .uplugin files to match the Target Project's engine version
* Developer Settings
  * Added new Plugin Sync Tool Settings to Project Settings with parameters to update colours used in tool
* Header
  * "Import Project Info" is now "Import Project Data"
  * "Export Project Info" is now "Export Project Data"
  * After exporting to a json file, the save location will now open in File Explorer
  * When clicking "Import Project Data", there is a new prompt warning about replacing all data with the imported data
* Updated Documentation (<https://docs.oserosuite.com/supported-assets/plugin-sync-tool>)

### \[26 September 2023]: Release v1.0

* **Status**: Published
* **Marketplace Link**: <https://www.unrealengine.com/marketplace/en-US/product/26e72cf589d8422495959337096d6845>
* **Release Date**: 15 November 2023
* **Main Documentation**: <https://jerenosero.com/osero-suite/plugin-migration-tool/>
* **Code Modules**:
  * OseroSuite\_PluginMigration: Editor Only
* **Network Replicated**: No (Not required as editor tool)
* **Supported Development Platforms**: Windows
* **Key Features**:
  * Easily migrate project plugins between two projects
  * Update multiple projects at the same time or just one at a time
  * Copy files only if newer or copy all files
  * Handles source control
  * Export/import project info for easy use between projects


# How to Use (5.2+)

Documentation for the Osero Suite: Plugin Sync Tool update 1.1 (5.2+)

Update 1.1 added some new features and modified how some features work, however, the general principle is still the same as the previous version.

* [Tutorial](/supported-assets/plugin-sync-tool/how-to-use-5.2+/tutorial)
* [Accessing the Plugin Sync Tool](/supported-assets/plugin-sync-tool/how-to-use-5.2+/accessing-the-plugin-sync-tool)
* [UI Outline](/supported-assets/plugin-sync-tool/how-to-use-5.2+/ui-outline)
* [Project Settings](/supported-assets/plugin-sync-tool/how-to-use-5.2+/project-settings)

{% hint style="info" %}
For general information on Unreal Engine Plugins, [see the Epic Games documentation here](https://dev.epicgames.com/documentation/en-us/unreal-engine/plugins-in-unreal-engine).
{% endhint %}


# Tutorial

Documentation for the Osero Suite: Plugin Sync Tool update 1.1 (5.2+)

{% embed url="<https://youtu.be/YkzB7N-Ebi0>" %}

## Transcript <a href="#transcript" id="transcript"></a>

### Intro <a href="#intro" id="intro"></a>

The Osero Suite Plugin Sync Tool offers an easy solution for plugin management across multiple projects. By entering a project’s details and "Plugins" folder path, easily sync plugins from one project to another with a click of a button! The Plugin Sync Tool saves the hassle of using File Explorer to copy files from one place to another and also handles related Revision Control actions.

### Accessing the Plugin Sync Tool

Once the Osero Suite: Plugin Sync Tool plugin is installed, the Plugin Sync Tool can be accessed via the Osero Suite menu in the Level Editor Toolbar or the Window menu.

<div><figure><img src="/files/CjIzB8hSY7RK2QUa9afM" alt=""><figcaption></figcaption></figure> <figure><img src="/files/uEhr3UBe2dmhFRZ08Zu4" alt=""><figcaption></figcaption></figure></div>

### Syncing Plugins

Before we begin, we need to make these two definitions clear: “Target Project” means a project other than the current project running the Plugin Sync Tool. “This Project” means the host project that is currently running the Plugin Sync Tool.

<figure><img src="/files/mrbJCNHvSqwxr1NTMyea" alt=""><figcaption></figcaption></figure>

First we begin by defining a Target Project. Clicking the “Add” button will present a new empty Target Project.

<figure><img src="/files/1tV6ZlNx9HxK5M2IXY0O" alt=""><figcaption></figcaption></figure>

The Project Display Name is for your reference only - the tool internally uses indexes, not this name, so it can be anything you want.

<figure><img src="/files/Wey0lP9NVvfYH3E6TiDj" alt=""><figcaption></figcaption></figure>

The Project Plugin Directory is the path to the Target Project’s Plugins folder, located in the same directory as the uproject file.

<figure><img src="/files/SUmuIHfKeU9QRRmK0gVc" alt=""><figcaption></figcaption></figure>

If Reverse Sync is ticked, the Target Project will be considered This Project and This Project will be considered the Target Project when syncing.

<figure><img src="/files/p07PZP372y5ZT6TDq3MR" alt=""><figcaption></figcaption></figure>

You can then select the plugins you wish to sync from This Project to the Target Project.

<figure><img src="/files/16YAEsTsuj5xU2hTLd4t" alt=""><figcaption></figcaption></figure>

Target Projects can be managed via these buttons.

<figure><img src="/files/NmyE5zawnmItVwGriuwG" alt=""><figcaption></figcaption></figure>

The Target Project Data can also be exported to a json file and imported into another project using these buttons here.

<figure><img src="/files/JxEi7DzDFukjI1KC6wnc" alt=""><figcaption></figcaption></figure>

A Target Project can also be set to disabled using the tickbox on the Target Project’s tab. This means that Sync All will skip this Target Project.

<figure><img src="/files/MYXca3kcYuIAdfJ4tax9" alt=""><figcaption></figcaption></figure>

The Plugin Sync Tool allows you to define Ignore Directories, Ignore File Types, and Ignore Files. By default, the tool ignores common directories and files that are not necessary to copy. Entries in Ignore Files do not have to be a full file name, they can include a single word, such as the default “patch”, which will exclude any files with this word in their name.

<figure><img src="/files/SzdS2vd9gIqgitLXuc21" alt=""><figcaption></figcaption></figure>

The Plugin Sync Tool has a number of options that modify how the syncing process is carried out.

<figure><img src="/files/colAiIn7kozChYdFYy3w" alt=""><figcaption></figcaption></figure>

Force update will re-copy EVERYTHING regardless of date and time. If this is ticked off, it will only sync files that have a more recent timestamp than the equivalent file in the Target Project.

<figure><img src="/files/NZROQ9Jotdv5z5k3Uh1f" alt=""><figcaption></figcaption></figure>

When the sync is executed, any files in the Target Project which have a newer timestamp than This Project will appear in a prompt, asking you how you want to handle the sync. If Skip Newer Check is ticked on, it will ignore this check and simply overwrite the files in the Target Project with the files in This Project regardless of date and time.

<div><figure><img src="/files/IadBKkJ1Ajyc4jXSFmYe" alt=""><figcaption></figcaption></figure> <figure><img src="/files/ihiO4oPJ7WA3rScigdSe" alt=""><figcaption></figcaption></figure></div>

When the sync is executed, any files found in the Target Project that do not exist in This Project will appear in a prompt, asking you how you want to handle the sync. If Skip Delete Check is ticked, it will simply delete any files in the Target Project that do not exist in This Project.

<div><figure><img src="/files/vKvTKMuab57m6ZeBJi1b" alt=""><figcaption></figcaption></figure> <figure><img src="/files/nW69sdl3MVemyiOEEkrb" alt=""><figcaption></figcaption></figure></div>

If Copy Binaries is ticked, the files in the Binaries folder of the plugin in This Project will be copied to the Target Project too. This is necessary if copying a C++ plugin to a Blueprint project as the Blueprint project has no way to rebuild the binaries.

<figure><img src="/files/0fHj0eUpK5nz7C4ICTZg" alt=""><figcaption></figcaption></figure>

If Fix Plugin Engine Versions is ticked, all uplugin files being copied will have their engine version tag updated to match the Target Project’s engine version.

<div><figure><img src="/files/ey7097DBKdQfgIeTcP3d" alt=""><figcaption></figcaption></figure> <figure><img src="/files/kmq0JbooEDpbsgfUDpzp" alt=""><figcaption></figcaption></figure></div>

The Plugin Sync Tool handles Revision Control if Check Revision Control is enabled. This will include Checking Out, Marking For Add, and Marking For Delete.

<figure><img src="/files/aClkBUEFaIR3nt0LzgQ2" alt=""><figcaption></figcaption></figure>

Push Binaries to Revision Control will tell the tool that any dll files copied need to be added to Revision Control. This is not advised when copying to a C++ Target Project as recompiling the project will recreate the binary files.

<figure><img src="/files/kCl8uLKD2AXGJmsp4LM9" alt=""><figcaption></figcaption></figure>

Push pdb to Revision Control will tell the tool that any pdb files copied need to be added to Revision Control. This is usually not advised as pdb files tend to be quite big, though sometimes it might be necessary for debugging purposes.

<figure><img src="/files/1mgqEQa1HDb4mcWkbyL5" alt=""><figcaption></figcaption></figure>

There are three ways that a sync can be executed.

<figure><img src="/files/Shq48UnjX3wMub6IHZZI" alt=""><figcaption></figcaption></figure>

The green button will sync the focused Target Project only.

<figure><img src="/files/B4DUXtuZPsK46hIHCT2X" alt=""><figcaption></figcaption></figure>

The blue Sync All button will sync all Target Projects.

<figure><img src="/files/xmP7HNMSnCAc9mHYwzDC" alt=""><figcaption></figcaption></figure>

The dropdown menu allows you to sync *just* the selected plugin in This Project if the Target Project has this plugin set to sync.

<figure><img src="/files/BCy1K7G93JAz3SSDH3JG" alt=""><figcaption></figcaption></figure>

When the sync is started, the tool will find all files in This Project’s Plugins directory and all files in the Target Project’s Plugins directory. Then, based on the settings, the tool compares all the files to determine which files need to be synced.

If the file in the Target Project is older than the matching file in This Project, or Force Update is ticked on, the file will be overwritten.

If the file in the Target Project does not exist, the file from This Project will be copied to the Target Project.

<div><figure><img src="/files/SHhPU9WKYtl5R6fIzzF7" alt=""><figcaption></figcaption></figure> <figure><img src="/files/OXWtDUDyygYLjgnlulVr" alt=""><figcaption></figcaption></figure></div>

If the file in the Target Project is newer than the file in This Project, the user will be prompted to either copy the file back to This Project, or overwrite the file in the Target Project with the older file from This Project.

<figure><img src="/files/IadBKkJ1Ajyc4jXSFmYe" alt=""><figcaption></figcaption></figure>

If the file exists in the Target Project but does not exist in This Project, the user will be prompted to either copy the file back to This Project, or delete the file in the Target Project.

<figure><img src="/files/vKvTKMuab57m6ZeBJi1b" alt=""><figcaption></figcaption></figure>

As the tool runs, it will also perform the appropriate Revision Control actions, depending on your settings.

<figure><img src="/files/aClkBUEFaIR3nt0LzgQ2" alt=""><figcaption></figcaption></figure>

### Project Settings

The Osero Suite: Plugin Sync Tool also includes its own project settings. In these settings, the colours for the selected and unselected plugins can be set to cater for those who may have difficulty differentiating between red and green.

<div><figure><img src="/files/WhbumqnwI3Z8xjxdjD32" alt=""><figcaption></figcaption></figure> <figure><img src="/files/3XhtGvmO3c1cnWBoLsCB" alt=""><figcaption></figcaption></figure></div>

### Use Case 1: Developing a C++ Plugin for Use in Blueprint Projects

A question that may arise when looking at the Plugin Sync Tool is, “why would I even need such a tool, given that I can just copy files in File Explorer?” Well, I’ve personally been using versions of this tool for a few years now as it removed the monotony of manually updating plugins.

The first use case is developing a C++ plugin for a Blueprint project.

<figure><img src="/files/FfioQmEPiIBdWcf2CW9m" alt=""><figcaption></figcaption></figure>

For a cinematic pipeline, for example, artists don’t need the worry about the hassle of dealing with Visual Studio and compilation times. The Plugin Sync Tool allows C++ content to be developed in a separate C++ test project and synced easily with a Blueprint project so the artists aren’t affected by updates to the C++ code. It also means the C++ project can be lightweight without all the heavy cinematics, levels, and VFX, improving loading times and efficiency for the engineering team. Because the tool handles Revision Control, especially if using Perforce, it saves the hassle of checking out, marking for add, and deleting appropriate files, especially when needing to push minor hotfixes in plugins with thousands of lines of code.

### Use Case 2: Managing Fab Plugins

Developing a plugin for Fab has some specific rules in Epic Games’ guidelines. One of these rules, unlike with Blueprint assets, is that each engine version needs to uploaded separately. And so, when developing the Osero Suite plugins, the Plugin Sync Tool has been extremely useful in keeping the plugins in different engine versions synced.

I have my workflow set up so that the 5.2 version is the main host project with all the Target Project data, and the Plugin Sync Tool then allows me to edit code in any of the engine versions and easily sync it back to 5.2 and then out to all other versions. This also includes keeping it synced in testing projects, such as the Blueprint Slay Project.

<figure><img src="/files/J0L9nPWuteIg6k4WShAs" alt=""><figcaption></figcaption></figure>

### Use Case 3: Copying a Plugin from Another Project into This Project

The final use case is copying a plugin from another project into This Project. Sometimes when purchasing or downloading assets online, especially those outside Fab, the functionality is in a plugin in a host project.

Having the Plugin Sync Tool in a working project allows for a quick setup with a reverse sync, allowing the plugin to be copied back to This Project, while also handling Revision Control and automatically modifying the engine version tag in the uplugin. This saves time and effort mucking around in File Explorer and Revision Control such as Perforce, so that the focus can be on the working project, not on tedious tasks. It also means if the Target Project was synced from somewhere such as GitHub, if the plugin is updated, it’s super easy to update again in the working project.

<figure><img src="/files/qjFlxZT0KDi9QggnTkeY" alt=""><figcaption></figcaption></figure>

### Conclusion

At first glance it can be easy to dismiss the usefulness of the Plugin Sync Tool, but, as outlined in this video, there are many use cases where this tool can improve efficiency and cut out monotonous tasks. For more information, visit [docs.oserosuite.com](https://docs.oserosuite.com/).


# Accessing the Plugin Sync Tool

Documentation for the Osero Suite: Plugin Sync Tool update 1.1 (5.2+)

Access the Osero Suite: Plugin Sync Tool via the Osero Suite Menu located on the Level Editor Toolbar.

<figure><img src="/files/QH10WJVUOPWsgwoQL5dz" alt=""><figcaption></figcaption></figure>

The Osero Suite Menu can also be located in the Window Menu.

<figure><img src="/files/TR9CgZSwouW6v4jh5CxW" alt=""><figcaption></figcaption></figure>


# UI Outline

Documentation for the Osero Suite: Plugin Sync Tool update 1.1 (5.2+)

{% hint style="success" %}
**Target Project** means a project other than the one the Plugin Sync Tool is running in right now.
{% endhint %}

{% hint style="success" %}
**This Project** means the host project that is currently running the Plugin Sync Tool.
{% endhint %}

### Header

<figure><img src="/files/iixTmPIOGPud57kGIDXT" alt=""><figcaption></figcaption></figure>

1. **Store Page**: Opens the Fab Store Page for this tool in your web browser.
2. **Documentation**: Opens the documentation page for this tool in your web browser.
3. **Osero Suite Symbol**: Opens the Jeren Osero website in your web browser.
4. **Export Project Data**: Exports all data in *Target Projects* to a Json file for backup anbd easy transfer between projects.
5. **Import Project Data**: Imports a valid Json file and replaces all the information in *Target Projects* with the imported data.

### Parameters

#### Target Projects

Target Projects are Unreal Engine projects other than This Project (the project with the Plugin Sync Tool running).

If there are no Target Projects, the only option here will be to add a new Target Project, and the tool's buttons will be greyed out.

<figure><img src="/files/oTLB3QnETMlXvHhak2Om" alt=""><figcaption></figcaption></figure>

<figure><img src="/files/czvsX33H3Yjh9erafsNX" alt=""><figcaption></figcaption></figure>

When there are Target Projects, the UI will change to allow editing of one Target Project at a time.

<figure><img src="/files/XXibctuRIRSYxgLVmeRg" alt=""><figcaption></figcaption></figure>

1. Add new Target Project.
2. Delete ALL Target Projects.
3. Insert a new Target Project here.
4. Duplicate the focused Target Project's data into a new Target Project.
5. Delete the focused Target project.
6. Shift this Target Project one place to the left (order to sync when clicking "Sync All").
7. Shift this Target Project one place to the right (order to sync when clicking "Sync All").
8. Click any of the Target Projects to see and update their data.
9. If unticked, the Target Project will be considered "inactive" and will be ignored when clicking "Sync All".

<figure><img src="/files/zXS1qA3voOzfB8zUSWYh" alt=""><figcaption></figcaption></figure>

* **Project Display Name**: This is just for your reference only - the tool internally uses indexes, not this name, so it can be anything.
* **Project Plugin Directory**: Path to the project's '/Plugin' folder. Note: For Revision Control to work, This Project has to be under the same Revision Control directory as the Target Project.
* **Reverse Sync**: If ticked, this Target Project will be considered the "This Project" and This Project will be considered the "Target Project" when syncing.
* **Plugins To Sync**: Which plugins in This Project (or the Target Project if Reverse Sync is ticked) that should be synced between the two projects.

#### Global Settings

<figure><img src="/files/5OMr6ZfMwbTcTYw0v2JX" alt=""><figcaption></figcaption></figure>

* **Ignore Directories**: Directories to ignore when syncing the Plugin(s) between projects.
* **Ignore File Types**: File types to ignore when syncing the Plugin(s) between projects.
* **Ignore Files**: Specific files to ignore when syncing the Plugin(s) between projects.

#### Sync Settings

<figure><img src="/files/ABPX5osutN0xv7PNoG8j" alt=""><figcaption></figcaption></figure>

* **Force Update**: The sync will re-copy EVERYTHING regardless of date-time. If this is ticked off, it will only sync files that have a more recent timestamp than the equivalent file in then Target Project. Note: This can slow down the sync quite significantly, especially if Revision Control is active.
* **Skip Newer Check**: If ticked, the tool will skip the prompt asking whether you want to copy newer files from the target project back to this project. It will just overwite them in the target project with the files from this project (as if *No All* was pressed). It will still perform a date-time check to filter out unchanged files, however.
* **Skip Delete Check**: If ticked, the tool will skip the prompt asking whether you want to delete files that exist in the target project but not this project. It will just delete them in the target project (as if *No All* was pressed).
* **Copy Binaries**: If ticked, the files in the /Binaries folder will be copied too.
* **Fix Plugin Engine Versions**: If ticked, all .uplugin files being copied will have their engine version updated to match the Target Project's engine version.

#### Revision Control

<figure><img src="/files/B9zf5ukME3QT9KzDCPpl" alt=""><figcaption></figcaption></figure>

* **Check Revision Control**: If Revision Control is enabled in this project, should it be used for the sync?
* **Push Binaries (.dll) to Revision Control**: If ticked .dll files will also be pushed to Revision Control, otherwise they'll be copied but not pushed.
* **Push .pdb to Revision Control**: If ticked .pdb files will also be pushed to Revision Control, otherwise they'll be copied but not pushed.

### Footer

<figure><img src="/files/ZNTeEnIIH7GF1X8Pr1DT" alt=""><figcaption></figcaption></figure>

1. **Version Number**: Shows the tool's current version number.
2. **Sync All**: Syncs all active Target Projects with This Project.
3. **Sync "Single Project" Only**: Syncs the focused Target Project (at the top of the tool) with This Project.
4. **Sync Single Plugin Menu**: For all active Target Projects, sync *just* the selected plugin with This Project if the Target Project has this plugin set to sync.

#### How Syncing Works

{% hint style="info" %}
If a project is marked as **Reverse Sync**, then the exact same thing happens, except the Target Project and This Project are swapped.
{% endhint %}

1. For each project to sync, find all the relevant files in the .../\<Project Name>/Plugins folder.
2. Compare the timestamp of each file, or if *Force Update* is ticked on, skip this check.
3. If the file in the Target Project is older than the matching file in This Project, the file will be overwritten.
4. If the file in the Target Project does not exist, the file from This Project will be created in the Target Project.
5. If the file in the Target Project is newer than the file in This Project, the user will be prompted to either copy the file back to This Project, or overwrite the file in the Target Project with the older file from This Project.
6. If the file exists in the Target Project but does not exist in This Project, the user will be prompted to either copy the file back to This Project, or delete the file in the Target Project.

{% hint style="success" %}
As the tool runs, it will also perform the appropriate Revision Control actions, depending on your settings.
{% endhint %}


# Project Settings

Documentation for the Osero Suite: Plugin Sync Tool update 1.1 (5.2+)

Access the Plugin Sync Tool Project Settings by going to **Project Settings** > **Plugins** > **Osero Suite: Plugin Sync Tool Settings**.

<figure><img src="/files/53A7DhrxhPKmeapvNNFL" alt=""><figcaption></figcaption></figure>

Here the colours for the selected/unselected plugins can be set in case red/green is not preferable.

<figure><img src="/files/z2KnzgAAWmnZnk6OdQmO" alt=""><figcaption></figcaption></figure>

<figure><img src="/files/MR2qDg6ax57dTwwkA5o0" alt=""><figcaption></figcaption></figure>


# How to Use (Legacy 5.1)

Documentation for the Osero Suite: Plugin Sync Tool update 1.0 (5.1)

1. Open the tool via the Osero Suite Menu, or through Window > Osero Suite.

<div><figure><img src="/files/0uRPzLa5IXgkjzDJRMOe" alt=""><figcaption></figcaption></figure> <figure><img src="/files/poSXxlMv5ZMYosPDWmZs" alt=""><figcaption></figcaption></figure></div>

2\. Add a new destination project to the **Project Info** map. This will be the destination of where the selected plugins will be *copied to*.

<figure><img src="/files/KmnLeWFjltI2VOHSr5dT" alt=""><figcaption></figcaption></figure>

3\. Fill out the project's information:

* **Project Label**: The label entered here does *not have to be the same as the destination uproject*. This is a user-friendly label set by you for your reference. It's just used to auto-generate a green button at the bottom of the UI to allow you to update that project specifically. Note: These labels MUST be unique (no two the same) or you will get an error when trying to add/edit a name.

<figure><img src="/files/SB6kzBe8CsZH9HJS9HPm" alt=""><figcaption></figcaption></figure>

* **Active**: If this is ticked, this project will be updated by the **Update ALL Projects** button. If not, it can only be updated via its individual green button.
* **Project Plugin Directory**: The full *absolute* path to the *Plugins* folder of the destination project to copy the files to.
* **Plugins to Migrate**: The names of the plugins to migrate *from this project* to the destination project. They can also be activated and deactivated with their tickbox.

<figure><img src="/files/PVvHsHEGgOafSsNrNHyb" alt=""><figcaption></figcaption></figure>

4\. Fill out any other settings as required:

* Project Settings
  * **Ignore Directories**: Directories within the plugin to ignore when copying to the destination project.
    * Entries to this array must start with "/"
    * By default, this includes the plugins' *Intermediate* directory.
  * **Ignore File Types**: All files with these extensions will be ignored when copying to the destination project.
    * Entries to this array must start with "."
    * By default, this includes the ".exp" extension because it's usually an unneeded file type generated by UE's Live Coding.
  * **Ignore Files**: All files with the text entered into this array in their name will be ignored when copying to the destination project. Eg, if an entry to this array has the text "foo", the file named "foobar.txt" will be ignored because it contains "foo" in the file name.
    * By default, this includes "pingme.txt" and "patch" because these files are usually unneeded files generated by UE's Live Coding.
* Migration Settings
  * **Force Update**: If this is ticked, the tool will ignore "last modified" timestamps and copy *every file* to the destination project. If it is unticked, only files that are newer in this project than the files in the target project will be copied.
  * **Push .pdb to Source Control**: By default the Plugin Migration Tool will copy .pdb files to the destination project but not add them to source control. Pdb files contain the debugging symbols used in crash reports and by Visual Studio when working with breakpoints, and are created when compiling a code project. These files are usually quite large and often not needed to be added to source control. Tick this box to add them to source control when the files are copied.
  * **Push Binaries (.dll) to Source Control**: Binary files (.dll) are the compiled libraries generated when code files are compiled. In most cases these files do not need to be pushed to source control because they get regenerated the next time a code plugin is compiled. HOWEVER, if you're copying from a code project to a Blueprint-only project, the binary files must be added to source control so that anyone who opens the Blueprint-only project can use the code plugin. Otherwise they will get an error when opening the project, which will force them to disable the plugin due to binaries being out of date.

<figure><img src="/files/SFV3eiAnoIFAd3YjJfuX" alt=""><figcaption></figcaption></figure>

5\. Click either **Update ALL Projects** or the **Project's Individual Green Button** to start the copying.

* For each selected project (in the case of *Update ALL Projects*, this is every project with *Active* ticked, and if a green button is pressed, it's JUST that one project), the tool will go through the *Plugins to Migrate* and compared all the files in this project's directory with all of the files in the destination project's Plugin Directory.
* If source control is enabled, the tool will then check out any files necessary in the destination project.
* The tool will then copy all relevant files (based on the settings) from this project to the destination project.
* The tool will then delete any files from the destination project that no longer exist in this project.
* The tool will then add any new files copied to source control.

**Note: There is no merging with this tool, it just straight up copies and replaces files from one location to another.**

#### Export Project Info <a href="#export-project-info" id="export-project-info"></a>

<figure><img src="/files/2K0dEqXukSp2TyvUKHdF" alt=""><figcaption></figcaption></figure>

Clicking this button will export all of the information in **Project Info** to a .json file so that it can be imported into another project.

#### Import Project Info <a href="#import-project-info" id="import-project-info"></a>

<figure><img src="/files/ney9biEHzxxK8ttUQ8z0" alt=""><figcaption></figcaption></figure>

Clicking this button will import a .json file that's been exported with the *Export Project Info* button to the **Project Info** map.


# Render Results Screen

Documentation for the Osero Suite: Render Results Screen

[Fab](https://www.fab.com/sellers/Jeren%20Osero) | [YouTube](https://www.youtube.com/@JerenOsero) | [Rumble](https://rumble.com/c/c-6746292) | [Twitter/X](https://twitter.com/JerenOsero) | [Instagram](https://www.instagram.com/jerenosero/) | [LinkedIn](https://www.linkedin.com/company/jeren-osero)

## Quick Links

* [Fab Link](https://www.fab.com/listings/cdd92b7b-0d2f-439b-bd4b-ce5b1d0b30bb)
* Videos:
  * Introduction Video: [YouTube](https://youtu.be/_t6izYoKUOM) | [Rumble](https://rumble.com/v6qkif8-osero-suite-render-results-screen-introduction.html)
  * Tutorial: [YouTube](https://youtu.be/eC8B8WQwHCE) | [Rumble](https://rumble.com/v6rq5e7-osero-suite-render-results-screen-tutorial.html)
* [Support](/support)

## General Information

* UE Versions
  * Supported versions: 5.2+
  * Versions no longer supported (sold as is): 5.1

## Section Links

* [About](/supported-assets/render-results-screen/about)
* [Changelog](/supported-assets/render-results-screen/changelog)
* [How to Use (5.2+)](/supported-assets/render-results-screen/how-to-use-5.2+)
* [How to Use (Legacy 5.1)](/supported-assets/render-results-screen/how-to-use-legacy-5.1)


# About

Information about the Osero Suite: Render Results Screen

{% embed url="<https://youtu.be/_t6izYoKUOM>" %}

The Osero Suite: Render Results Screen adds a convenient window to Unreal Engine, triggered when a render is finished through the Movie Render Queue. Wondering how your render went while you were away from your PC? Wondering which shot the render crashed on? Wondering how long a sequence took to render? These questions can be answered by adding the Osero Suite: Render Results Screen to your project!

This plugin also comes with a simple line graph that can show you which shots and sequences take the longest to render! It also lets you rerender the whole pipeline or just rerender the failed shots from where the previous render was interrupted with two simple buttons!

Update 1.1 (5.2+) cleans up the UI and also adds an experimental [Contact Sheet](/supported-assets/render-results-screen/how-to-use-5.2+/ui-outline/contact-sheet) feature, allowing for quick viewing of a render to check for immediate consistency and accuracy before importing it into external video editing software. It also adds the ability to create a custom ["Data Handler" class](/supported-assets/render-results-screen/how-to-use-5.2+/data-handler) to allow for custom automated handling of render results to fit anyone's render pipeline.

### Features

* Adds a Render Results window to the Movie Render Queue that gets triggered when a render finishes!
* Shows how long a render took to finish, and how long each shot and job took!
* Adds a *Rerender All Shots* button to rerender all shots currently marked active!
* Adds a *Rerender Failed Shots* button to rerender only the shots that did not render before the render was interrupted!
* Simple line graphs for visual display of render times including the ability to customise colours and line thicknesses!
* Buttons to browse to each level sequence in the Content Browser and to open the render output location in File Explorer!
* Adds an *Output Directory Override* variable to the render job for quick and easy modification of the output location for multiple jobs at once!
* Adds a *Split Shots Into Folders* variable to allow for quick organisation by rendering each shot into its own “Shot Name” subfolder in the output directory!
* As a bonus, having this plugin active also makes it so that the mouse cursor isn’t consumed by the rendering window so you can still use it without having to Alt-Tab away!
* Accessibility options: Colours and date/time formats changeable in Project Settings!
* \[v1.1] View the last several render results from any Unreal Engine project!
* \[v1.1] Data Handler class to allow for customisation of handling render result data when a render finishes!
* \[v1.1] Experimental Contact Sheets to perform quick and easy analyses of renders before importing image sequences into external video editing software!

### Important/Additional Notes

* This plugin requires the use of special Movie Pipeline classes including executors, jobs, and pipeline classes, so this plugin isn’t currently compatible with projects already using custom Movie Pipeline classes, such as for Deadline Render Farms, etc, without modification.

{% hint style="info" %}
[View the Osero Suite: Render Results Screen on Fab!](https://www.fab.com/listings/cdd92b7b-0d2f-439b-bd4b-ce5b1d0b30bb)
{% endhint %}


# Changelog

Changelog for the Osero Suite: Render Results Screen

### \[06 June 2025]: Hotfix 1.1a

* UI Fix: Fixed Osero Suite Icons
* Renamed "Data Export Class" to "Data Handler Class" in Developer Settings to properly reflect functionality.
* Upgraded to 5.6

### \[27 February 2025]: Update v1.1

* Updated to UE5.5
* Updated copyright notice
* Updated code for consistency across all Osero Suite tools
  * This includes adding a sort function to the Osero Suite Menu so that the tools are always in the same order, not dependant on which order the plugins load
  * This includes updating code to new Osero Suite naming convention
  * Osero Suite logo in tool now opens the Jeren Osero website
  * All code for each engine version is in ALL plugin versions so it doesn't matter which engine version the plugin comes from, it should work for all (5.2+)
  * Resynced static functions across all Osero Suite tools so that they perform the same in every tool
* Added Osero Suite "Header" to the Results Screen
  * Removed Documentation/Store Page/Icon from Render Details Panel
* Added Osero Suite Footer
  * Moved "View Render Graph" to footer
    * "View Render Graph" is now disabled if only one job was rendered
  * Added new button "Open Contact Sheet"
  * Added plugin version to footer
* Added icons to buttons throughout tool
* Code optimisation and reworks
* Bug fixes
  * Fixed bug in 5.4+ where settings didn't save to config properly
  * "Open in File Explorer" buttons are now platform-independant rather than Windows only
  * "Split Shots Into Folders" bool now updates output correctly if output ends in '/' and now removes {shot\_name} key when ticked off
  * If two jobs/shots have the same name, the json now records them correctly
  * Fixed bug where opening a new render results window would not close the old one
  * Fixed bug where if a render results window is open when clicking render in the Movie Render Queue, the window will now close
* Render Data
  * Added checks to json saving/loading to make sure the json is an Osero Suite json
  * Combined three saved jsons into one
  * Changed the save path to account for saving multiple jsons
  * Added new Data Handler Class that can be used to process data at the end of a render
    * Added example to Plugin's Content folder
    * [See here for more information](/supported-assets/render-results-screen/how-to-use-5.2+/data-handler)
* Render Results Window
  * Added Project Name and Engine Version to Window Title
  * Modified the default Window size to fit the content a little better
  * Added ability to view the last n-renders (default to 10, can be changed in Project Settings)
  * Added new (experimental) Contact Sheet viewer to get a quick overview of the render ([see here](/supported-assets/render-results-screen/how-to-use-5.2+/ui-outline/contact-sheet))
* Render Details Panel
  * Added Project Name and Engine Version to Render Details Panel
  * Added tooltips to clarify what each data point means
  * Changed the "Copy" button back to a basic button
  * Added proper separators to the panel to make it easier to read
  * Documentation/Store Page/Icon moved to "Header"
* Job/Shot Breakdown Panel
  * Added "No Shot Data Found" window when the loaded window cannot find any appropriate render data, rather than just leaving a blank screen.
  * Removed ugly pixellated Osero Suite logo from behind the shot results
  * Added backgrounds and separators to each job entry to make it easier to read
  * Added new tooltip when hovering a job/shot to view the data about that job/shot, including an image of the first frame (if the render is an image sequence) to make it easier to understand which shot is which
  * Cleaned up the buttons for each job to fit with a "UE5" look rather than a "UE4" look
  * Fixed the icon for "Open Line Graph" for individual jobs
  * "Open Line Graph" is disabled if there is only one shot for a job
* Line Graph
  * Redesigned the Line Graph with better visuals
  * Added proper Osero Suite Header
  * Moved buttons to proper Osero Suite Footer
* Project Settings
  * General
    * Added "Number of Renders to Keep" which will automatically delete any older render data once this number is reached
  * Accessibility
    * Fixed the Reset button to save to config correctly
    * Updated a couple of variable names
  * Added "Contact Sheet" Category
    * Added array to define file extensions to search for when opening a Contact Sheet
    * [See here for more information](/supported-assets/render-results-screen/how-to-use-5.2+/ui-outline/contact-sheet)
  * Added "Graphing" Category
    * Added ability to modify details of the Line Graph including colours and line thicknesses
  * Added "Automation" Category
    * Added option to not show the Render Results Window at the end of a render
    * Added Data Exporter class option ([see here](/supported-assets/render-results-screen/how-to-use-5.2+/data-handler))
* Updated documentation (<https://docs.oserosuite.com/supported-assets/render-results-screen>)

### \[10 April 2024] Release v1.0

* **Status**: Published
* **Marketplace Link**: <https://www.unrealengine.com/marketplace/en-US/product/osero-suite-render-results-screen>
* **Release Date**: 18 April 2024
* **Main Documentation**:[ ](https://jerenosero.com/osero-suite/module-creator/)<https://jerenosero.com/osero-suite/render-results-screen/>
* **Code Modules:**
  * OS\_RenderResultsEditor (Editor Only)
  * OS\_RenderResultsRuntime (Runtime Module)
* **Network Replicated:**
  * No (Not required as editor tool only)
* **Supported Development Platforms:**
  * Windows
* **Key Features:**
  * Adds a Render Results window to the Movie Render Queue that gets triggered when a render finishes
  * Shows how long a render took to finish, and how long each shot and sequence took
  * Adds two buttons:
    * *Rerender All Shots*: Rerenders all shots currently marked active
    * *Rerender Failed Shots*: Rerenders only the shots that did not render before the render was interrupted
  * Simple line graphs for visual display of render times
  * Buttons to browse to each level sequence in the Content Browser and to open the render output location in File Explorer
  * Adds an *Output Directory Override* variable to the render job for quick and easy modification of the output location for multiple jobs at once
  * Adds a *Split Shots Into Folders* variable to allow for quick organisation by rendering each shot into its own “Shot Name” subfolder in the output directory
  * As a bonus, having this plugin active also makes it so that the mouse cursor isn’t consumed by the rendering window so you can still use it without having to alt-tab away
  * Colours and date/time formats changeable in Project Settings


# How to Use (5.2+)

Documentation for the Osero Suite: Render Results Screen update 1.1 (5.2+)

Update 1.1 added some new features and modified how some features work, however, the general principle is still the same as the previous version.

* [Tutorial](/supported-assets/render-results-screen/how-to-use-5.2+/tutorial)
* [Making Sure the Plugin is Active](/supported-assets/render-results-screen/how-to-use-5.2+/making-sure-the-plugin-is-active)
* [Movie Render Queue Job Additons](/supported-assets/render-results-screen/how-to-use-5.2+/movie-render-queue-job-additions)
* [UI Outline](/supported-assets/render-results-screen/how-to-use-5.2+/ui-outline)
  * [Render Results Window](/supported-assets/render-results-screen/how-to-use-5.2+/ui-outline/render-results-window)
  * [Render Graph](/supported-assets/render-results-screen/how-to-use-5.2+/ui-outline/render-graph)
  * [Contact Sheet](/supported-assets/render-results-screen/how-to-use-5.2+/ui-outline/contact-sheet)
* [Accessing Previous Render Results](/supported-assets/render-results-screen/how-to-use-5.2+/accessing-previous-render-results)
* [Data Handler](/supported-assets/render-results-screen/how-to-use-5.2+/data-handler)
* [Plugin Content](/supported-assets/render-results-screen/how-to-use-5.2+/plugin-content)
* [Project Settings](/supported-assets/render-results-screen/how-to-use-5.2+/project-settings)
* [Code Reference](/supported-assets/render-results-screen/how-to-use-5.2+/code-reference)

{% hint style="info" %}
For general information about the Movie Render Queue, [see the Epic Games documentation here](https://dev.epicgames.com/documentation/en-us/unreal-engine/rendering-high-quality-frames-with-movie-render-queue-in-unreal-engine).
{% endhint %}


# Tutorial

Documentation for the Osero Suite: Render Results Screen update 1.1 (5.2+)

{% embed url="<https://youtu.be/eC8B8WQwHCE>" %}

## Transcript

### Intro

The Osero Suite: Render Results Screen adds a convenient window to Unreal Engine, triggered when a render is finished through the Movie Render Queue. Wondering how your render went while you were away from your PC? Wondering which shot the render crashed on? Wondering how long a sequence took to render? These questions can be answered by adding the Osero Suite: Render Results Screen to your project!

### Making Sure the Plugin is Active

To verify that the plugin is active, go to Edit > Project Settings... > Plugins > Osero Suite: Render Results Screen Settings > General and make sure *Use Osero Suite Movie Render Pipeline Classes* is ticked on.

<div><figure><img src="/files/ff9otJ7ISiFg8yg7fsQV" alt=""><figcaption></figcaption></figure> <figure><img src="/files/Cm8sSDgA7ZHCZ6BCFR2a" alt=""><figcaption></figcaption></figure></div>

When this tickbox is on, the plugin automatically sets, and verifies that, the executor and job classes are set to the classes from this plugin so that they don't have to be changed manually.

<figure><img src="/files/ahb7SquScLNH8yleli36" alt=""><figcaption></figcaption></figure>

The Osero Suite: Render Results Screen uses these custom classes to record its data while rendering. This means that if you are using your own custom executor, this plugin likely isn't compatible out of the box.

### Movie Render Queue Job Additions

The Osero Suite: Render Results Screen adds two additional variables into the Movie Render Queue when selecting one or more job(s).

**Output Directory Override** is a quick-edit for the Output Path of a job. This allows editing the Output Path for multiple jobs simultaneously without the need to open up each of their settings individually.

<div><figure><img src="/files/2le83RxD2Tip6gO5SFIj" alt=""><figcaption></figcaption></figure> <figure><img src="/files/hmF6AZaatFKj0tazlB6O" alt=""><figcaption></figcaption></figure></div>

**Split Shots Into Folders** will automatically add the key *{shot\_name}* to the end of the output path so that each shot renders into its own individual folder. This is often helpful for image sequence renders, rather than rendering everything to the one folder and ending up with thousands of images to sort through.

<div><figure><img src="/files/sPT3ungVeOVXnMleecBB" alt=""><figcaption></figcaption></figure> <figure><img src="/files/GCuu8G7Y1v1nhyOZ7wPE" alt=""><figcaption></figcaption></figure></div>

### Rendering

Rendering is executed as normal from the Movie Render Queue tab. As the render progresses, the custom classes mentioned earlier record data to a json file.

<figure><img src="/files/tkM4hm7Ng1JUtsWFWTmz" alt=""><figcaption></figcaption></figure>

When a render starts, the cursor will also no longer be consumed by the Preview Window.

<figure><img src="/files/6hA2jdbwAlrTufYmObr3" alt=""><figcaption></figcaption></figure>

### Render Results Screen

Once a render finishes, a Render Results Screen will open in a new window.

<figure><img src="/files/Yq9jp6GCsNEmZRzWVOLA" alt=""><figcaption></figcaption></figure>

There are four possible render results that may be displayed by the Render Results Screen.

<figure><img src="/files/knspdBEilJPI02CQswJD" alt=""><figcaption></figcaption></figure>

Render Successful means that the whole render was completed successfully and there were no crashes or interruptions.

<figure><img src="/files/IdVdYC8nk7l1aDzDAuon" alt=""><figcaption></figcaption></figure>

Render Interrupted means the process was shut down cleanly but the render did not successfully render all of its shots. This generally means a user has pressed the ‘X’ button in the window to interrupt.

<figure><img src="/files/xZuEBE753LxmBxjobvr5" alt=""><figcaption></figcaption></figure>

Render Failure is an unexplained error. Most often this result is shown if the Movie Render Pipeline was unable to write output files to the disk. This might be because files that need to be overwritten are read only, or that the output directory does not and cannot exist.

<figure><img src="/files/bDyZ0opgt7Vgi9Ke3tNA" alt=""><figcaption></figcaption></figure>

Render Error means the process was not shut down cleanly. The Render Results Screen tries to show the last error encountered. This result normally occurs when a render crashes or the render is closed via the ‘X’ button in the engine CMD prompt, rather than the ‘X’ on the preview screen.

<div><figure><img src="/files/z7k1CzO0z8cZ1vvBNt13" alt=""><figcaption></figcaption></figure> <figure><img src="/files/2Lrk3OcLynF5Kl1ye2kO" alt=""><figcaption></figcaption></figure></div>

The Render Details Panel shows information about the render results being viewed. It shows the Project Name, Engine Version, and Render Times for this render.

<figure><img src="/files/FlMe8TFxK8goJeweezRY" alt=""><figcaption></figcaption></figure>

The ‘Copy’ button will copy all of this information to the clipboard so that it can be pasted somewhere else.

<div><figure><img src="/files/40oL5oVA2jLs6qmoL2ye" alt=""><figcaption></figcaption></figure> <figure><img src="/files/DqzWFFW6Hjuq17GSFzQz" alt=""><figcaption></figcaption></figure></div>

**Show Individual Shot Times** will toggle individual shot time display in the Job Breakdown Panel.

<figure><img src="/files/rY1x64xgdF8tLrlePlcW" alt=""><figcaption></figcaption></figure>

The Job Breakdown Panel shows the status and render times of individual shots and jobs.

For each job in the render, it will show:

1. the Job/Sequence Name;
2. the total render time for the job;
3. and the individual status of each shot.

<figure><img src="/files/TjtR8tk5F2I22M7CZ3Du" alt=""><figcaption></figcaption></figure>

There are also a number of buttons for each job.

This button will browse to the output location of the job in File Explorer.

<div><figure><img src="/files/US8T5YQdxyFZNjlXC94L" alt=""><figcaption></figcaption></figure> <figure><img src="/files/rpQop1LKvTG6w7gYZ4hY" alt=""><figcaption></figcaption></figure></div>

This button will browse to the Level Sequence for the job in the Content Browser.

<div><figure><img src="/files/8Mp347cSNDpSNrLy4wzK" alt=""><figcaption></figcaption></figure> <figure><img src="/files/zcB35vkvQ2s9ao5Pwwuz" alt=""><figcaption></figcaption></figure></div>

This button will open a render graph, showing the render times for all shots in the job.

<div><figure><img src="/files/Qc0Te1fgDTPMwHGidRUu" alt=""><figcaption></figcaption></figure> <figure><img src="/files/0U5Zhs7LY2NkKi3jqIGT" alt=""><figcaption></figcaption></figure></div>

When hovering a job or shot, a tooltip will be displayed. This tooltip will show information about the job or shot, and, if it’s available, will show the first frame rendered for the job or shot.

<figure><img src="/files/J7r5simOLGmdRvbOko1r" alt=""><figcaption></figcaption></figure>

By default, the Oser Suite: Render Results Screen will save the last ten render results. These buttons here change which render results are currently being viewed.

<figure><img src="/files/VRu8IYX4jpHLd01ZNH6S" alt=""><figcaption></figcaption></figure>

If a render is unsuccessful, a button marked “Rerender Failed Shots” will be available. This will disable all shots that WERE successful and restart the render for all shots that were not rendered correctly. This means, if a render crashes, or is interrupted by a work colleague when they want to play Dota, the render can pick up from where it left off.

<div><figure><img src="/files/uZOc5yeEzBJJwm5LVfjt" alt=""><figcaption></figcaption></figure> <figure><img src="/files/D6gbUEfHSsjdJgPbMNyV" alt=""><figcaption></figcaption></figure></div>

When a render is finished, regardless of its success status, “Rerender All Shots” will be available. This will start the entire render again from the start with no changes to any of the jobs or shots.

<figure><img src="/files/Ly5NpiU9oFZoduk2iSKR" alt=""><figcaption></figcaption></figure>

“Open Contact Sheet” will open the contact sheet window for this render if it is able to.

<div><figure><img src="/files/I1lNbDuGQVq8mnpIEPz4" alt=""><figcaption></figcaption></figure> <figure><img src="/files/m7YbJdkcvMJel9GamsUu" alt=""><figcaption></figcaption></figure></div>

“View Render Graph” will open a render graph, showing the render times for all jobs in this queue.

<div><figure><img src="/files/nA1kc9ypsVmKw2CRnG11" alt=""><figcaption></figcaption></figure> <figure><img src="/files/8cPzkbwC6jOZkPC5mvy1" alt=""><figcaption></figcaption></figure></div>

“Close Window” will close the Render Results Screen window.

<figure><img src="/files/dOWfxaH04TPswPdkE5JB" alt=""><figcaption></figcaption></figure>

### Render Graph

The Render Graph plots the times of Jobs or Shots as a Line Graph to make it easy to see which Jobs or Shots take the longest amount of time and may need optimising.

The x-axis shows the names of the Jobs or Shots.

The y-axis shows time.

<figure><img src="/files/0U5Zhs7LY2NkKi3jqIGT" alt=""><figcaption></figcaption></figure>

Hovering an individual plotted point will show the exact render time.

<figure><img src="/files/4o4u3m2MwLjrwVTDz7D0" alt=""><figcaption></figcaption></figure>

“Save as CSV” saves all of the data into a plain text CSV file for use in external programs.

<div><figure><img src="/files/p73SlXV4iPfgv8zyx6mH" alt=""><figcaption></figcaption></figure> <figure><img src="/files/C1eFLmyH4N0oit0U4dEV" alt=""><figcaption></figcaption></figure></div>

“Copy to Clipboard” converts the data to plain text CSV but rather than saving it to a file, copies it to the clipboard, so that it can be pasted elsewhere.

<div><figure><img src="/files/arNdSsfN6B388tNN551A" alt=""><figcaption></figcaption></figure> <figure><img src="/files/1QFNE4vUQoN6OjnRS4af" alt=""><figcaption></figcaption></figure></div>

“Close Graph” will close the graph window.

<figure><img src="/files/2A4hejXMJ9Vpzq8FwOOO" alt=""><figcaption></figcaption></figure>

### Contact Sheet

{% hint style="warning" %}
The Contact Sheet is currently experimental in the Osero Suite: Render Results Screen version 1.1.
{% endhint %}

So what is a Contact Sheet? A Contact Sheet shows a series of images in a big collage to allow a user to view them together to give them a simple review.

<figure><img src="/files/hSJYPkKWbAqtllu1Owui" alt=""><figcaption></figcaption></figure>

In this case, the Contact Sheet generated by the Render Results Screen has two views. Job View will show the first frame of every job together. Shot View shows the first, middle, and end frames of each shot.

<div><figure><img src="/files/m7YbJdkcvMJel9GamsUu" alt=""><figcaption></figcaption></figure> <figure><img src="/files/NxQtN6NIo1RNWis0Mw9Q" alt=""><figcaption></figcaption></figure></div>

This allows for a quick and easy review of a render to check for obvious errors, such as lighting, colour, dead frames, or animation issues, before the sequence is loaded into an external program like Adobe Premiere.

<figure><img src="/files/zEqAIoWyl2DMCLIDDw6d" alt=""><figcaption></figcaption></figure>

In version 1.1 of the Osero Suite: Render Results Screen, the Contact Sheet only works with image sequence renders. It also works best if shots are all rendered to individual folders, or if the output image sequences contain the shot name in the image file title.

<figure><img src="/files/GCuu8G7Y1v1nhyOZ7wPE" alt=""><figcaption></figcaption></figure>

When the Contact Sheet opens, it will be in Job View by default. This will display information about the queue, as well as the first frame of every job in the queue. Clicking a Job will open Shot View for that job.

<figure><img src="/files/m7YbJdkcvMJel9GamsUu" alt=""><figcaption></figcaption></figure>

In Shot View, the Contact Sheet will display information about the Job, as well as the first, middle, and end frames of each shot.

<figure><img src="/files/NxQtN6NIo1RNWis0Mw9Q" alt=""><figcaption></figcaption></figure>

### Accessing Render Results Outside of Rendering

The Render Results Screen can also be summoned without setting off a render. It can be called from the option in the Osero Suite Menu located on the Level Editor Toolbar, or the Window menu.

<div><figure><img src="/files/skvcS6OIJKF0xSE3dz1Z" alt=""><figcaption></figcaption></figure> <figure><img src="/files/Oaphu02nDoslAcTGfs8Q" alt=""><figcaption></figcaption></figure></div>

### Data Handler

Included in the Osero Suite: Render Results Screen, is the ability to create an automated task at the end of a render. This allows the user to process the render data in a way other than the Render Results Screen window.

The Data Handler class can be set in the Project Settings, along with an option to disable the Render Results Screen. When a render finishes in the Movie Render Queue, the data will be sent to this class to process in the user-defined way.

<figure><img src="/files/6QhkR1MQk1B3wPFrbfwr" alt=""><figcaption></figcaption></figure>

### Creating a Blueprint Data Handler

To create a new Data Handler, right-click in the *Content Browser* and select Blueprint Class.

<figure><img src="/files/DqtXFYK5bWnP1nkoAGbc" alt=""><figcaption></figcaption></figure>

Under *All Classes* select Osero Suite: Render Data Handler.

<figure><img src="/files/JhKSZCRNVtHssP5UWGrn" alt=""><figcaption></figcaption></figure>

When the new Data Handler is opened, it will be empty.

Under *FUNCTIONS*, click Override and select Handle Data.

<figure><img src="/files/F3oDDylKBIeZPzDYp5ie" alt=""><figcaption></figcaption></figure>

This will add a new Event to this Blueprint called Handle Data.

<figure><img src="/files/Otb6WApDo30bZ6C1Qzja" alt=""><figcaption></figcaption></figure>

The Result Data pin can be split into the data from the render and used as required.

<figure><img src="/files/GS5q5uMZ1r3kLtGEahtm" alt=""><figcaption></figcaption></figure>

The Job Data struct can be split into the data from the Job and used as required.

<figure><img src="/files/zn1vvOgJdFydFQGOZ9bF" alt=""><figcaption></figcaption></figure>

The Shot Data struct can be split into the data from the Shot and used as required.

<figure><img src="/files/OAlIh7ooBJbftSJOhFaz" alt=""><figcaption></figcaption></figure>

There also a number of functions available under the Osero Suite: Render Results Screen category to help with interpreting this data.

<figure><img src="/files/x9vXLt1MoGdW7mo3k013" alt=""><figcaption></figcaption></figure>

Make sure to set the Data Handler Class in Project Settings to the newly created Blueprint class so that it can be executed when renders are finished.

<figure><img src="/files/UL3epYJhbSRwsu8XWKED" alt=""><figcaption></figcaption></figure>

There is an example Blueprint Data Handler class included with the Plugin, located at **Osero Suite: Render Results Screen Content** > **Example** > **HandleData\_SaveToDataAsset**.

<figure><img src="/files/sjZQLZcW95BxNOUC58y4" alt=""><figcaption></figcaption></figure>

### Creating a C++ Data Handler

To create a new Data Handler, add a new C++ class of type OS\_RRS\_DataHandler.

<figure><img src="/files/DeCCLQxXRC2sAeZRZp6w" alt=""><figcaption></figcaption></figure>

Note that the Data Handler Class is in an Editor Module, and so the recommended place for a new Data Handler Class is in another Editor Module.

<figure><img src="/files/Rkt502v4Wl2DzYfu4TXQ" alt=""><figcaption></figcaption></figure>

In this example, I have used the [Osero Suite: Module Creator ](/supported-assets/module-creator)to create a new empty Editor Module.&#x20;

<figure><img src="/files/1YIlQ7X3VrfQmRNN3L5K" alt=""><figcaption></figcaption></figure>

Add `Blutility`, `MovieRenderPipelineCore`, and `OS_RRS_Editor` to the Module's Build.cs file.

```
"Blutility",
"MovieRenderPipelineCore",
"OS_RRS_Editor",
```

<figure><img src="/files/Xpt34WLhbJd5JMF2Wk6b" alt=""><figcaption></figcaption></figure>

Override HandleData\_Native in the new UOS\_RRS\_DataHandler to receive the render data once a render has finished. In this new function, the data can then be used as required.

```
virtual void HandleData_Native(FOS_RRS_ResultData ResultData) override;
```

<figure><img src="/files/VyxXdtLJ5NCVECx77kep" alt=""><figcaption></figcaption></figure>

The main classes and structs of relevance are:

* [UOS\_RRS\_DataHandler](/supported-assets/render-results-screen/how-to-use-5.2+/code-reference/classes/uos_rrs_datahandler)
* [FOS\_RRS\_ResultData](/supported-assets/render-results-screen/how-to-use-5.2+/code-reference/structs/fos_rrs_resultdata)
* [FOS\_RRS\_JobData](/supported-assets/render-results-screen/how-to-use-5.2+/code-reference/structs/fos_rrs_jobdata)
* [FOS\_RRS\_ShotData](/supported-assets/render-results-screen/how-to-use-5.2+/code-reference/structs/fos_rrs_shotdata)
* [UOS\_RRS\_RenderDataLibrary](/supported-assets/render-results-screen/how-to-use-5.2+/code-reference/classes/uos_rrs_renderdatalibrary).

Information on all of these classes can be found in the documentation for this plugin.

Make sure to set the Data Handler Class in Project Settings to the newly created C++ class so that it can execute when renders are finished.

<figure><img src="/files/CwqmMzhQ4Cr2HIahURe2" alt=""><figcaption></figcaption></figure>

### Project Settings

The Osero Suite: Render Results Screen also includes its own project settings. In these settings, there are several options that can be changed.

<figure><img src="/files/UeAEuA5rf8Bn7KKg9KeW" alt=""><figcaption></figcaption></figure>

When *Use Osero Suite Movie Render Pipeline Classes* is ticked on, the plugin automatically sets, and verifies that, the executor and job classes are set to the classes from this plugin so that they don't have to be changed manually.

*Default Date Time Format* is the way the dates and times are displayed throughout the plugin’s functionality.

*Number of Renders to Keep* is the number of past render data files to keep before deleting older data.

The *Accessibility* section allows for colours to be changed throughout the plugin, to cater for those who have different difficulties in distinguishing certain colours.

*Resize PIE Window To Output Resolution* is an option copied from the default PIE Executor Settings, as this class is private in the engine, and so it cannot be accessed by the Osero Suite. If ticked on, when executing a Play In Editor render, the PIE preview window will be resized to the render’s output resolution. As noted in the engine itself, this is not advised for large-scale renders.

<figure><img src="/files/ckYN4mZBF8OZQTmT2VQz" alt=""><figcaption></figcaption></figure>

*Valid File Extensions* are the file extensions to search for when looking for images for the Contact Sheet.

The *Graphing* section allows for colours and line thicknesses to be changed for the render graphs, to give the user freedom to customise the graphs to their needs.

<figure><img src="/files/irKaFvW3juq2KiVzXxBH" alt=""><figcaption></figcaption></figure>

If *Show Render Results Window* is ticked off, the Render Results Window will not open at the end of a render. It can still be accessed by the menu, however.

*Data Handler Class* is the custom Data Handler class to use to process render data at the end of a render.

<figure><img src="/files/6QhkR1MQk1B3wPFrbfwr" alt=""><figcaption></figcaption></figure>

### Outro

If rendering through the Movie Render Queue in Unreal Engine, the Osero Suite: Render Results Screen is a must have! As outlined in this video, it offers a number of useful features that makes crashes, render times, and rendering in general significantly easier. For more information, visit [docs.oserosuite.com](https://docs.oserosuite.com/).       &#x20;


# Making Sure the Plugin is Active

Documentation for the Osero Suite: Render Results Screen update 1.1 (5.2+)

The Render Results Screen should be active by default if the plugin is enabled.

{% hint style="warning" %}
The Osero Suite: Render Results Screen uses a custom executor to record its data when rendering. This means that if you are using your own custom executor, this plugin likely isn't compatible out of the box. It can be modified to work with other executors, but a knowledge of C++ is required for that.
{% endhint %}

To verify that the plugin is active, go to **Edit** > **Project Settings...** > **Plugins** > **Osero Suite: Render Results Screen Settings** > **General** and make sure *Use Osero Suite Movie Render Pipeline Classes* is ticked on.

<figure><img src="/files/HfuP1vsUvM1jQvGXngqr" alt=""><figcaption></figcaption></figure>

When this tickbox is on, the plugin automatically sets, and verifies that, the executor and job classes are set to the classes from this plugin so that they don't have to be changed manually.

<figure><img src="/files/MaBnosoI1zWs6MyDECTf" alt=""><figcaption></figcaption></figure>


# Movie Render Queue Job Additions

Documentation for the Osero Suite: Render Results Screen update 1.1 (5.2+)

The Osero Suite: Render Results Screen adds two additional variables into the Movie Render Queue when selecting one or more job(s).

<figure><img src="/files/ndWEIqa4uA960ukqyv5b" alt=""><figcaption></figcaption></figure>

**Output Directory Override** is a quick-edit for the Output path of a job. This allows editing the Output Path for multiple jobs simultaneously without the need to open up each of their settings individually.

**Split Shots Into Folders** will automatically add the key {shot\_name} to the end of the output path so that each shot renders into its own individual folder. This is often helpful for image sequence renders, rather than rendering everything to the one folder and ending up with thousands of images to sort through.

<figure><img src="/files/dPm5Uf557nGWJ0HHZytx" alt=""><figcaption></figcaption></figure>

<figure><img src="/files/lLzJU4HtoVpmm0lT1nX1" alt=""><figcaption></figcaption></figure>

{% hint style="info" %}
Also, as an extra little addition, when a render starts, the render preview screen no longer consumes the mouse cursor while the Osero Suite Executors are used.
{% endhint %}


# UI Outline

Documentation for the Osero Suite: Render Results Screen update 1.1 (5.2+)


# Render Results Window

Documentation for the Osero Suite: Render Results Screen update 1.1 (5.2+)

<div><figure><img src="/files/FLtURFocWRF9lMKC4yOc" alt=""><figcaption></figcaption></figure> <figure><img src="/files/sl6Gs8PHY4kg9KXf3BDp" alt=""><figcaption></figcaption></figure></div>

## Result Header

This is where the render result will be displayed. It will show one of four messages:

* <mark style="color:green;">**Render Successful**</mark>: The whole render completed successfully and there were no crashes or interruptions.
* <mark style="color:yellow;">**Render Interrupted**</mark>: Generally appears when the render is cancelled by the user (ie, the 'x' button was pressed on the render window).
* <mark style="color:orange;">**Render Failure**</mark>: Generally appears when there is a write failure. Ie, the render is trying to overwrite a read-only file or the render output location does not exist for a shot/job.
* <mark style="color:red;">**Render Error**</mark>: Generally appears when a render crashes or finishes unsuccessfully.

<figure><img src="/files/fjgZoQ5sP7SygLlNmntA" alt=""><figcaption></figcaption></figure>

<figure><img src="/files/lcc2OfnNMqXS4AUGTXs8" alt=""><figcaption></figcaption></figure>

<figure><img src="/files/8kOtb6TQBMebancqO2tj" alt=""><figcaption></figcaption></figure>

<figure><img src="/files/u43Q47hngrWshKd9DnC5" alt=""><figcaption></figcaption></figure>

## Render Details Panel

<figure><img src="/files/8ytdvDinrawWAx1GNl9w" alt=""><figcaption></figcaption></figure>

* **Project Name**: The project that this render data belongs to.
* **Engine Version**: The engine version that this render data was recorded in.
* **Render Start Time**: The date/time of when the render button was pressed.
* **Render End Time**: When the render shut down or crashed.
* **Total Render Time**: Total time it took to render the whole queue. This includes warmup and load times.
* **Copy**: Copy the text in this panel to the platform clipboard so that it can be pasted somewhere else.
* **Show Individual Shot Times**: Toggle individual shot time displaying in the Job Breakdown Panel.

<div><figure><img src="/files/UqXQUviwTJXlaGap9HPr" alt=""><figcaption><p><em><strong>Show Individual Shot Times ticked off</strong></em></p></figcaption></figure> <figure><img src="/files/gR1iGO8W3zP9cYFFJJ8y" alt=""><figcaption><p><em><strong>Show Individual Shot Times ticked on</strong></em></p></figcaption></figure></div>

## Job Breakdown Panel

<figure><img src="/files/XnO62Of7ep6wmKDIFYMt" alt=""><figcaption></figcaption></figure>

1. Job/Sequence name.
2. Total render time for this Job.
3. Job/Shot breakdown showing the status of each Shot. If **Show Individual Shot Times** is ticked on in the Render Details Panel, the individual Shot times will be displayed here too.
4. Browse to the output location of this Job in File Explorer.
5. Browse to the Level Sequence for this Job in the *Content Browser*.
6. Open a render graph showing the render times for all Shots in this Job. *Note: This option is disabled if there are one or less shots in the Job.*

### Tooltips

When hovering a job or shot in the Job Breakdown Panel, a custom tooltip will be displayed, showing data about the Job/Shot, as well as its first rendered frame (if available).

<figure><img src="/files/liCqOnHE1SO1cTyShN0A" alt=""><figcaption></figcaption></figure>

## "Header"

<figure><img src="/files/HOrzWA6OMo8pQFVNc9NF" alt=""><figcaption></figcaption></figure>

1. **Store Page**: Opens the Fab Store Page for this tool in your web browser.
2. **Documentation**: Opens the documentation page for this tool in your web browser.
3. **Osero Suite Symbol**: Opens the Jeren Osero website in your web browser.
4. **View Previous/Next Render**: Cycle back and forth through all saved render data. The number of render data being saved can be set in Project Settings ([see here](/supported-assets/render-results-screen/how-to-use-5.2+/project-settings#general)).

## Footer

<figure><img src="/files/aWsKcUICdj1lcp9TgQkx" alt=""><figcaption></figcaption></figure>

1. **Version Number**: Shows the tool's current version number.
2. **Close Window**: Closes this results window.
3. **View Render Graph**: Opens a graph showing the render times of all jobs ([see here](/supported-assets/render-results-screen/how-to-use-5.2+/ui-outline/render-graph)). *Note: This option is disabled if there are one or less jobs.*
4. **Open Contact Sheet**: Opens a contact sheet of the current render data ([see here](/supported-assets/render-results-screen/how-to-use-5.2+/ui-outline/contact-sheet)).
5. **Rerender All Shots**: Rerender all shots in the render queue. *Note: This option only appears when the window appears after a render, not when summoned from the Osero Suite Menu.*
6. **Rerender Failed Shots**: Rerender all shots not marked as successful, disabling all successful shots in the current render queue. *Note: This option only appears when the window appears after a render, not when summoned from the Osero Suite Menu AND only if the render was not successful.*


# Render Graph

Documentation for the Osero Suite: Render Results Screen update 1.1 (5.2+)

The Render Graph plots the times of Jobs or Shots as a Line Graph to make it easy to see which Jobs or Shots take the longest amount of time and may need optimising.

<figure><img src="/files/np7LYKz9VzmmhZdrwl3F" alt=""><figcaption></figcaption></figure>

1. **Store Page**: Opens the Fab Store Page for this tool in your web browser.
2. **Documentation**: Opens the documentation page for this tool in your web browser.
3. **Osero Suite Symbol**: Opens the Jeren Osero website in your web browser.
4. *Graph Area*: Shows the time data for all Jobs/Shots as a Line Graph. Hovering one of the plotted points will show a tooltip with the exact time.
5. *Y-Axis*: Time value from 0 up to slightly above the highest time.
6. *X-Axis*: The Job/Shot names.
7. **Version Number**: Shows the tool's current version number.
8. **Close Graph**: Closes this graph window.
9. **Save As .CSV**: Save the time data into a csv file.
10. **Copy to Clipboard**: Copy the time data to the platfrom's clipboard so it can be pasted elsewhere. *Note: This is text data, just like saving to csv, NOT a rendered version of the line graph.*

Hovering an individual plotted point will show the exact render time.

{% hint style="info" %}
The colours and line thicknesses of the graph can be changed in the Project Settings ([see here](/supported-assets/render-results-screen/how-to-use-5.2+/project-settings#graphing)).
{% endhint %}


# Contact Sheet

Documentation for the Osero Suite: Render Results Screen update 1.1 (5.2+)

{% hint style="danger" %}
The Contact Sheet feature is currently experimental and does not always work in 100% of use cases at the moment. It currently works best if shots are all rendered to individual folders, or if the output image sequences contain the shot name in the image file title.
{% endhint %}

A Contact Sheet shows a series of images in a big collage to allow a user to view them together to give them a simple review. In this case, the Contact Sheet generated by the Render Results Screen has two views. Job View will show the first frame of every job together. Shot View shows the first, middle, and end frames of each shot.

{% hint style="warning" %}
The Contact Sheet function only works if the output of the render is an image sequence. It does not work for video files.
{% endhint %}

<div><figure><img src="/files/Gv4FOj9sn8tW0z0zikCz" alt=""><figcaption><p>Job View</p></figcaption></figure> <figure><img src="/files/zr3MhM7qx9T8d0pnVZol" alt=""><figcaption><p>Shot View</p></figcaption></figure></div>

1. **Store Page**: Opens the Fab Store Page for this tool in your web browser.
2. **Documentation**: Opens the documentation page for this tool in your web browser.
3. **Osero Suite Symbol**: Opens the Jeren Osero website in your web browser.
4. **Version Number**: Shows the tool's current version number.
5. **Close Window**: Closes this Contact Sheet window.
6. **Back**: Return to Job View.
7. *Details*: Details about the rendered queue (Job View) or target Job (Shot View).
8. *Loaded Contact Sheet*: Raw image files from the render output location are loaded here for quick review. If in Job View, clicking one of the images will change to Shot View for the clicked Job.

{% hint style="info" %}
The Contact Sheet looks for specific file extensions when trying to load the image files. These file extensions can be set in the Project Settings ([see here](/supported-assets/render-results-screen/how-to-use-5.2+/project-settings#contact-sheet)).
{% endhint %}


# Accessing Previous Render Results

Documentation for the Osero Suite: Render Results Screen update 1.1 (5.2+)

Access previous render data via the Osero Suite Menu located on the Level Editor Toolbar.

<figure><img src="/files/nlIF5SX85srCN8gpo9sd" alt=""><figcaption></figcaption></figure>

The Osero Suite Menu can also be located in the Window Menu.

<figure><img src="/files/NDFb5Z5LiQS118fbRbY8" alt=""><figcaption></figcaption></figure>


# Data Handler

Documentation for the Osero Suite: Render Results Screen update 1.1 (5.2+)

A Render Results Screen Data Handler allows a user to create an automated task at the end of a render to process the render data in a way other than the Render Results Screen.

## Setting a Data Handler

The Data Handler class can be set in the Project Settings, along with an option to disable the Render Results Screen ([see here](/supported-assets/render-results-screen/how-to-use-5.2+/project-settings#automation)). When a render finishes in the Movie Render Queue, the data will be sent to this class to process in the user-defined way.

## Blueprints

To create a new Data Handler, right-click in the *Content Browser* or click **+Add**. Select **Blueprint Class**.&#x20;

<figure><img src="/files/g4pi9OKFpiFh7VpQitdp" alt=""><figcaption></figcaption></figure>

Under *All Classes* select **Osero Suite: Render Data Handler**.

<figure><img src="/files/fjIgPgm54fxWcoxmwEfL" alt=""><figcaption></figcaption></figure>

When the new Data Handler is opened, it will be empty.

<figure><img src="/files/WyKWIetznji4CLGjGoKw" alt=""><figcaption></figcaption></figure>

Under *FUNCTIONS*, click **Override** and select **Handle Data**.

<figure><img src="/files/HZZvJQz8gAmPwFhb7GKK" alt=""><figcaption></figcaption></figure>

This will add a new event to this Blueprint called **Handle Data**.

<figure><img src="/files/740KK14BLrErDNxTPBRH" alt=""><figcaption></figcaption></figure>

The Result Data pin can be split into the data from the render and used as required.

<figure><img src="/files/LMmYwDmZMkUNi0GP2EoR" alt=""><figcaption></figcaption></figure>

The Job Data struct can be split into the data from the Job and used as required.

<figure><img src="/files/ZYuDnszPfV5Mc2WZw8cf" alt=""><figcaption></figcaption></figure>

The Shot Data struct can be split into the data from the Shot and used as required.

<figure><img src="/files/CjlcntNOrjYrhcEzbUOe" alt=""><figcaption></figcaption></figure>

There also a number of functions available under the **Osero Suite: Render Results Screen** category to help with interpreting this data.

<figure><img src="/files/pzLymSTb1Qwx43yuuShO" alt=""><figcaption></figcaption></figure>

{% hint style="success" %}
Make sure to [set the **Data Export Class** in Project Settings](#setting-a-data-handler) to the newly created Blueprint class so that it can execute when renders are finished.
{% endhint %}

## C++

To create a new Data Handler, add a new C++ class of type `OS_RRS_DataHandler`.

<figure><img src="/files/DolDTzxVCZ2hhT7V8zfR" alt=""><figcaption></figcaption></figure>

{% hint style="info" %}
The Data Handler Class is in an Editor Module, and so the recommended place for a new Data Handler Class is in another Editor Module.
{% endhint %}

Add `Blutility`, `MovieRenderPipelineCore`, and `OS_RRS_Editor` to the Module's Build.cs file.

```csharp
PrivateDependencyModuleNames.AddRange(
	new string[]
	{
		...
		"Blutility",
		"MovieRenderPipelineCore",
         	"OS_RRS_Editor",
         }
);
```

Override `HandleData_Native` in the new `UOS_RRS_DataHandler` to receive the render data once a render has finished.

```cpp
/* Header File */
UCLASS()
class PROJECT_EDITOR_API UNewDataHandler : public UOS_RRS_DataHandler
{
	GENERATED_BODY()
	
protected:
	virtual void HandleData_Native(FOS_RRS_ResultData ResultData) override;
};
```

```
/* Cpp File */
#include "NewDataHandler.h"

void UNewDataHandler::HandleData_Native(FOS_RRS_ResultData ResultData)
{

}
```

In this new function, the data can then be used as required. The main classes and structs of relevance are:

* [UOS\_RRS\_DataHandler](/supported-assets/render-results-screen/how-to-use-5.2+/code-reference/classes/uos_rrs_datahandler)
* [FOS\_RRS\_ResultData](/supported-assets/render-results-screen/how-to-use-5.2+/code-reference/structs/fos_rrs_resultdata)
* [FOS\_RRS\_JobData](/supported-assets/render-results-screen/how-to-use-5.2+/code-reference/structs/fos_rrs_jobdata)
* [FOS\_RRS\_ShotData](/supported-assets/render-results-screen/how-to-use-5.2+/code-reference/structs/fos_rrs_shotdata)
* [UOS\_RRS\_RenderDataLibrary](/supported-assets/render-results-screen/how-to-use-5.2+/code-reference/classes/uos_rrs_renderdatalibrary)

{% hint style="success" %}
Make sure to [set the **Data Export Class** in Project Settings](#setting-a-data-handler) to the newly created Blueprint class so that it can execute when renders are finished.
{% endhint %}

## Example

There is an example Data Handler located here: **Osero Suite: Render Results Screen Content** > **Example** > **HandleData\_SaveToDataAsset**. This is a simple little Blueprint that takes the input data and saves it to a new Data Asset.


# Plugin Content

Documentation for the Osero Suite: Render Results Screen update 1.1 (5.2+)

## Example

* **HandleData\_SaveToDataAsset**: An example Data Handler. For more information, [see here](/supported-assets/render-results-screen/how-to-use-5.2+/data-handler).
* *Data*
  * **OS\_RRS\_Example\_BlueprintResults**: A Primary Data Asset used in the example Data Exporter.
  * **OS\_RRS\_BlueprintResults\_Empty**: An empty child of *OS\_RRS\_Example\_BlueprintResults* used in the example Data Exporter.


# Project Settings

Documentation for the Osero Suite: Render Results Screen update 1.1 (5.2+)

Access the Render Results Screen Settings by going to **Project Settings** > **Plugins** > **Osero Suite: Render Results Screen Settings**.

<figure><img src="/files/pugUDnS0tJEZtHTzBT4k" alt=""><figcaption></figcaption></figure>

Here you can edit many factors of how the Render Results Screen plugin works, and how it looks.

<figure><img src="/files/xEqsnzgdellwKRqDXcBK" alt=""><figcaption></figcaption></figure>

### General

* **Use Osero Suite Movie Render Pipeline Classes**: Automatically sets, and verifies that, the executor and job classes are set to the classes from this plugin so that they don't have to be changed manually ([see here](/supported-assets/render-results-screen/how-to-use-5.2+/making-sure-the-plugin-is-active)).
* **Default Date Time Format**: Changes the display format of dates and times across the plugin. Defaults to *YYMMDDHHMMSS*.
  * **DDMMYYHHMMSS**: 31/12/2025 15:34:00
  * **MMDDYYHHMMSS**: 12/31/2025 15:34:00
  * **YYMMDDHHMMSS**: 2025/12/31 15:34:00
  * **HHMMSSDDMMYY**: 15:34:00 31/12/2025
  * **HHMMSSMMDDYY**: 15:34:00 12/31/2025
  * **HHMMSSYYMMDD**: 15:34:00 2025/12/31
* **Number Of Renders To Keep**: How many past renders should be kept ([see here](/supported-assets/render-results-screen/how-to-use-5.2+/ui-outline/render-results-window)).

### Accessibility

* **Reset**: Reset all of the colours back to default.
* **Colour Success**: The colour used for successful renders.
* **Colour Warning**: The colour used for interrupted renders.
* **Colour Failure**: The colour used for failed renders.
* **Colour Error**: The colour used for errored/crashed renders.
* **Colour Date Time**: The display colour for date time strings.
* **Colour Total Render Time**: The display colour for total time strings.

### PIE Settings

* **Resize PIE Window To Output Resolution**: Should the PIE Window be created at the same resolution as the MRQ Output? Note: This is copied from \[UMoviePipelinePIEExecutorSettings] because that class is private so we can't access it.

### Contact Sheet

* **Valid File Extensions**: File extensions to search for when looking for images for the Contact Sheet ([see here](/supported-assets/render-results-screen/how-to-use-5.2+/ui-outline/contact-sheet)).

### Graphing

* **Reset Globals**: Reset all global graph variables.
* **Colour Graph Background**: The colour used for the background of the graph.
* Line Graph
  * Line Thickness
    * **Reset**: Reset all line thicknesses.
    * **Line Thickness Full Horizontal**: The thickness of the full horizontal lines.
    * **Line Thickness Quarter Horizontal**: The thickness of the quarter horizontal lines.
    * **Line Thickness Vertical**: The thickness of the vertical lines.
    * **Line Thickness Axis**: The thickness of the axis lines.
    * **Line Thickness Graph Line**: The thickness of the drawn graph line.
  * Colours
    * **Reset**: Reset all line graph colours.
    * **Colour Full Horizontal**: The colour used for the full horizontal lines.
    * **Colour Quarter Horizontal**: The colour used for the quarter horizontal lines.
    * **Colour Vertical**: The colour used for the vertical lines.
    * **Colour Axis**: The colour used for the axis lines.
    * **Colour Graph Line**: The colour used for the drawn graph line.
    * **Colour Graph Point**: The colour used for the graph points.
    * **Colour Axis Labels Y**: The colour used for the y-axis text.
    * **Colour Axis Labels X**: The colour used for the x-axis text.

<figure><img src="/files/v4n6qb3Nj4P3Mac9b56P" alt=""><figcaption></figcaption></figure>

### Automation

* **Show Render Results Window**: If ticked off, the Render Results Window will not appear at the end of a render. The data will still be recorded, however.
* **Data Export Class**: The class to use at the end of a render for automation of data handling purposes ([see here](/supported-assets/render-results-screen/how-to-use-5.2+/data-handler)).


# Code Reference

Documentation for the Osero Suite: Render Results Screen update 1.1 (5.2+)


# Classes

Documentation for the Osero Suite: Render Results Screen update 1.1 (5.2+)


# UOS\_RRS\_DataHandler

Documentation for the Osero Suite: Render Results Screen update 1.1 (5.2+)

## References

<table data-header-hidden><thead><tr><th width="151"></th><th></th></tr></thead><tbody><tr><td>Parent Class</td><td>UEditorUtilityObject</td></tr><tr><td>Module</td><td>OS_RRS_Editor</td></tr><tr><td>Header</td><td>/OseroSuite_RRS/Source/OS_RRS_Editor/Public/Automation/OS_RRS_DataHandler.h</td></tr><tr><td>Include</td><td>#include "Automation/OS_RRS_DataHandler.h"</td></tr></tbody></table>

## Remarks

This class is used for automation to be overridden to handle the data that is normally sent to the results window.

## Variables

| Type | Name | Description |
| ---- | ---- | ----------- |
|      |      |             |

## Functions

| Return Type  | Name                                                | Description                                                      |
| ------------ | --------------------------------------------------- | ---------------------------------------------------------------- |
| void         | HandleData(FOS\_RRS\_ResultData ResultData)         | Called internally when the Movie Render Queue finishes a render. |
| void         | HandleData\_BP(FOS\_RRS\_ResultData ResultData)     | Called when the Movie Render Queue finishes a render.            |
| virtual void | HandleData\_Native(FOS\_RRS\_ResultData ResultData) | Called when the Movie Render Queue finishes a render.            |


# UOS\_RRS\_RenderDataLibrary

Documentation for the Osero Suite: Render Results Screen update 1.1 (5.2+)

## References

<table data-header-hidden><thead><tr><th width="148"></th><th></th></tr></thead><tbody><tr><td>Parent Class</td><td>UBlueprintFunctionLibrary</td></tr><tr><td>Module</td><td>OS_RRS_Editor</td></tr><tr><td>Header</td><td>/OseroSuite_RRS/Source/OS_RRS_Editor/Public/Automation/</td></tr><tr><td>Include</td><td>#include "Automation/OS_RRS_RenderDataLibrary.h"</td></tr></tbody></table>

## Remarks

Blueprint wrappers and helpers for render result data.

## Variables

| Type | Name | Description |
| ---- | ---- | ----------- |
|      |      |             |

## Functions

| Return Type                 | Name                                                                                     | Description                                                                                       |
| --------------------------- | ---------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------- |
| static FString              | ToString\_RenderResult(const EOS\_RRS\_RenderResult& RenderResult)                       |                                                                                                   |
| static FString              | ToString\_DateTimeFormat(const EOS\_RRS\_DateTimeFormat& Format)                         |                                                                                                   |
| static FString              | ToString\_Status(EMovieRenderShotState Status)                                           |                                                                                                   |
| static FString              | ToString(const EOS\_RRS\_RenderResult& RenderResult)                                     |                                                                                                   |
| static FString              | ToString(const EOS\_RRS\_DateTimeFormat& Format)                                         |                                                                                                   |
| static FString              | ToString(EMovieRenderShotState Status)                                                   |                                                                                                   |
| static FLinearColor         | ToColour\_RenderResult(const EOS\_RRS\_RenderResult& RenderResult)                       |                                                                                                   |
| static FLinearColor         | ToColour\_Status(EMovieRenderShotState Status)                                           |                                                                                                   |
| static FLinearColor         | ToColour(const EOS\_RRS\_RenderResult& RenderResult)                                     |                                                                                                   |
| static FLinearColor         | ToColour(EMovieRenderShotState Status)                                                   |                                                                                                   |
| static FOS\_RRS\_ResultData | GetRenderResultsFromJson(FString FullJsonPath)                                           |                                                                                                   |
| static bool                 | ContainsJob(const FOS\_RRS\_ResultData& ResultData, FString JobName, FString ObjectPath) |                                                                                                   |
| static bool                 | ContainsJob\_Struct(const FOS\_RRS\_ResultData& ResultData, FOS\_RRS\_JobData JobData)   | This function compares JobName and ObjectPath - the rest of the data is ignored.                  |
| static bool                 | HasAnyShots\_Results(const FOS\_RRS\_ResultData& ResultData)                             |                                                                                                   |
| static bool                 | HasAnyShots\_Job(const FOS\_RRS\_JobData& JobData)                                       |                                                                                                   |
| static double               | GetTotalRenderTime\_Result(const FOS\_RRS\_ResultData& ResultData)                       |                                                                                                   |
| static double               | GetTotalRenderTime\_Job(const FOS\_RRS\_JobData& JobData)                                |                                                                                                   |
| static bool                 | ContainsShot(const FOS\_RRS\_JobData& JobData, FString ShotName)                         |                                                                                                   |
| static bool                 | ContainsShot\_Struct(const FOS\_RRS\_JobData& JobData, FOS\_RRS\_ShotData ShotData)      |                                                                                                   |
| static bool                 | EqualEqual\_JobJob(FOS\_RRS\_JobData A, FOS\_RRS\_JobData B)                             |                                                                                                   |
| static bool                 | EqualEqual\_ShotShot(FOS\_RRS\_ShotData A, FOS\_RRS\_ShotData B)                         |                                                                                                   |
| static bool                 | NotEqual\_JobJob(FOS\_RRS\_JobData A, FOS\_RRS\_JobData B)                               |                                                                                                   |
| static bool                 | NotEqual\_ShotShot(FOS\_RRS\_ShotData A, FOS\_RRS\_ShotData B)                           |                                                                                                   |
| static FString              | GetDisplayName\_Shot(const FOS\_RRS\_ShotData& ShotData, bool bRootOnly = true)          | @param RootOnly will cut any inner names and shot the name as displayed in the root sequence only |
| static bool                 | IsValid\_Job(const FOS\_RRS\_JobData& JobData)                                           |                                                                                                   |
| static bool                 | IsValid\_Shot(const FOS\_RRS\_ShotData& ShotData)                                        |                                                                                                   |
| static FString              | GetCleanOutputPath(const FOS\_RRS\_JobData& JobData, FString ShotName = "")              |                                                                                                   |
| static FColor               | GetColour\_Success()                                                                     |                                                                                                   |
| static FColor               | GetColour\_Warning()                                                                     |                                                                                                   |
| static FColor               | GetColour\_Failure()                                                                     |                                                                                                   |
| static FColor               | GetColour\_Error()                                                                       |                                                                                                   |
| static FColor               | GetColour\_DateTime()                                                                    |                                                                                                   |
| static FColor               | GetColour\_TotalRenderTime()                                                             |                                                                                                   |


# Structs

Documentation for the Osero Suite: Render Results Screen update 1.1 (5.2+)


# FOS\_RRS\_JobData

Documentation for the Osero Suite: Render Results Screen update 1.1 (5.2+)

## References

<table data-header-hidden><thead><tr><th width="154"></th><th></th></tr></thead><tbody><tr><td>Parent Struct</td><td>-</td></tr><tr><td>Module</td><td>OS_RRS_Editor</td></tr><tr><td>Header</td><td>/OseroSuite_RRS/Source/OS_RRS_Editor/Public/Slate/OS_RRS_ResultData.h</td></tr><tr><td>Include</td><td>#include "Slate/OS_RRS_ResultData.h"</td></tr></tbody></table>

## Remarks

Data representing a single job from a Movie Render Queue.

## Variables

| Type                        | Name           | Description |
| --------------------------- | -------------- | ----------- |
| FString                     | JobName        |             |
| FString                     | ObjectPath     |             |
| FString                     | OutputPath     |             |
| FString                     | FileNameFormat |             |
| TArray\<FOS\_RRS\_ShotData> | ShotData       |             |

## Constructors

| Name                                                                                                       | Description |
| ---------------------------------------------------------------------------------------------------------- | ----------- |
| FOS\_RRS\_JobData()                                                                                        |             |
| FOS\_RRS\_JobData(FString \_JobName, FString \_ObjectPath, FString \_OutputPath, FString \_FileNameFormat) |             |

## Functions

| Return Type              | Name                                         | Description |
| ------------------------ | -------------------------------------------- | ----------- |
| bool                     | IsValid()                                    |             |
| bool                     | HasAnyShots()                                |             |
| double                   | GetTotalRenderTime()                         |             |
| bool                     | ContainsShot(FString ShotName)               |             |
| const FOS\_RRS\_ShotData | FOS\_RRS\_ShotData GetShot(FString ShotName) |             |
| FString                  | GetCleanOutputPath(FString ShotName = "")    |             |


# FOS\_RRS\_ResultData

Documentation for the Osero Suite: Render Results Screen update 1.1 (5.2+)

## References

<table data-header-hidden><thead><tr><th width="153"></th><th></th></tr></thead><tbody><tr><td>Parent Struct</td><td>-</td></tr><tr><td>Module</td><td>OS_RRS_Editor</td></tr><tr><td>Header</td><td>/OseroSuite_RRS/Source/OS_RRS_Editor/Public/Slate/OS_RRS_ResultData.h</td></tr><tr><td>Include</td><td>#include "Slate/OS_RRS_ResultData.h"</td></tr></tbody></table>

## Remarks

Data payload that's saved to json files when rendering.

## Variables

| Type                       | Name          | Description |
| -------------------------- | ------------- | ----------- |
| EOS\_RRS\_RenderResult     | RenderResult  |             |
| FText                      | ErrorText     |             |
| FDateTime                  | StartTime     |             |
| FDateTime                  | EndTime       |             |
| bool                       | bSuccess      |             |
| FString                    | ProjectName   |             |
| FString                    | EngineVersion |             |
| TArray\<FOS\_RRS\_JobData> | JobData       |             |

## Constructors

| Name                                                                                                                                                                    | Description |
| ----------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ----------- |
| FOS\_RRS\_ResultData()                                                                                                                                                  |             |
| FOS\_RRS\_ResultData(EOS\_RRS\_RenderResult \_RenderResult, FDateTime \_StartTime, FDateTime \_EndTime, bool \_bSuccess = false, FText \_ErrorText = FText::GetEmpty()) |             |

## Functions

| Return Type             | Name                                             | Description |
| ----------------------- | ------------------------------------------------ | ----------- |
| void                    | SaveToActiveJson()                               |             |
| bool                    | ContainsJob(FString JobName, FString ObjectPath) |             |
| bool                    | HasAnyShots()                                    |             |
| const FOS\_RRS\_JobData | GetJob(FString JobName, FString ObjectPath)      |             |
| double                  | GetTotalRenderTime()                             |             |


# FOS\_RRS\_ShotData

Documentation for the Osero Suite: Render Results Screen update 1.1 (5.2+)

## References

<table data-header-hidden><thead><tr><th width="151"></th><th></th></tr></thead><tbody><tr><td>Parent Struct</td><td>-</td></tr><tr><td>Module</td><td>OS_RRS_Editor</td></tr><tr><td>Header</td><td>/OseroSuite_RRS/Source/OS_RRS_Editor/Public/Slate/OS_RRS_ResultData.h</td></tr><tr><td>Include</td><td>#include "Slate/OS_RRS_ResultData.h"</td></tr></tbody></table>

## Remarks

Data representing a single shot from a Movie Render Queue.

## Variables

| Type                  | Name       | Description |
| --------------------- | ---------- | ----------- |
| FString               | ShotName   |             |
| EMovieRenderShotState | Status     |             |
| FString               | JobName    |             |
| FString               | ObjectPath |             |
| float                 | RenderTime |             |

## Constructors

| Name                                                                                                                                | Description |
| ----------------------------------------------------------------------------------------------------------------------------------- | ----------- |
| FOS\_RRS\_ShotData()                                                                                                                |             |
| FOS\_RRS\_ShotData(FString \_ShotName, EMovieRenderShotState \_Status, FString \_JobName, FString \_ObjectPath, float \_RenderTime) |             |

## Functions

| Return Type | Name                                  | Description                                                                                       |
| ----------- | ------------------------------------- | ------------------------------------------------------------------------------------------------- |
| bool        | IsValid()                             |                                                                                                   |
| FString     | GetDisplayName(bool bRootOnly = true) | @param RootOnly will cut any inner names and shot the name as displayed in the root sequence only |


# Enums

Documentation for the Osero Suite: Render Results Screen update 1.1 (5.2+)


# EOS\_RRS\_RenderResult

Documentation for the Osero Suite: Render Results Screen update 1.1 (5.2+)

## References

<table data-header-hidden><thead><tr><th width="118"></th><th></th></tr></thead><tbody><tr><td>Module</td><td>OS_RRS_Editor</td></tr><tr><td>Header</td><td>/OseroSuite_RRS/Source/OS_RRS_Editor/Public/OS_RRS_Enums.h</td></tr><tr><td>Include</td><td>#include "OS_RRS_Enums.h"</td></tr></tbody></table>

## Remarks

\~

## Values

| Name             | Description |
| ---------------- | ----------- |
| OS\_RRS\_Success |             |
| OS\_RRS\_Failure |             |
| OS\_RRS\_Error   |             |
| OS\_RRS\_Cancel  |             |


# How to Use (Legacy 5.1)

Documentation for the Osero Suite: Render Results Screen update 1.0 (5.1)

The plugin should be active by default if the plugin is enabled. If the plugin is enabled but the results screen is not showing up, go to **Edit** > **Project Settings...** > **Plugins** > **Osero Suite: Render Results Screen Settings** > **General** and tick on [**Use Osero Suite Movie Render Pipeline Classes**](#settings). This is also how you can disable it if you need to use other Movie Pipeline classes, such as render farm executors.

### Extra Variables in Jobs <a href="#extra-variables-in-jobs" id="extra-variables-in-jobs"></a>

When adding jobs to a Render Queue, there are two new variables available:

* **Output Directory Override**: A quick and easy modification of the output location for multiple jobs at once
* **Split Shots Into Folders**: Allows for quick organisation by rendering each shot into its own “Shot Name” subfolder in the output directory.

<figure><img src="/files/Ym0fsSwvnOBEH3kolXxy" alt=""><figcaption></figcaption></figure>

<figure><img src="/files/8e66KZc1LyRwDQio8QOF" alt=""><figcaption></figcaption></figure>

### Result Messages <a href="#result-messages" id="result-messages"></a>

When a render finishes, it will show one of four messages:

* <mark style="color:green;">**Render Successful**</mark>: The whole render completed successfully and there were no crashes or interruptions.
* <mark style="color:yellow;">**Render Interrupted**</mark>: Generally appears when the render is cancelled by the user (ie, the 'x' button was pressed on the render window).
* <mark style="color:orange;">**Render Failure**</mark>: Generally appears when there is a write failure. Ie, the render is trying to overwrite a read-only file or the render output location does not exist for a shot/job.
* <mark style="color:red;">**Render Error**</mark>: Generally appears when a render crashes or finishes unsuccessfully.

<div><figure><img src="/files/f6MTCEfg0EhRD6lYXnqQ" alt=""><figcaption></figcaption></figure> <figure><img src="/files/4adPNKIGYEvI7DqQj3kJ" alt=""><figcaption></figcaption></figure></div>

### Results Screen Actions <a href="#results-screen-actions" id="results-screen-actions"></a>

#### **Overview Panel**

* **View Render Graph**: Open a line graph of all of the job render times.
* **Copy Text**: Copy the text in the Overview Panel to the platform clipboard so that it can be pasted somewhere else (eg, to keep track of render times or to show a manager how long it takes to render).
* **Show Individual Shot Times**: Toggle the individual shot render times on and off in the Shot Results Panel.

#### **Shot Results Panel**

* **Open Render Location (...)**: Open the Output Directory of this job in File Explorer.
* **Browse to Sequence (Magnifying Glass)**: Browse to this job's Level Sequence in the Content Browser.
* **View Job Render Graph (Page)**: Opens a line graph of all of the shot render times for this job.

#### **Bottom Toolbar**

* **Rerender Failed Shots**: Restart the render but disable all shots that have rendered successfully, so that the render can pick up from where it was interrupted. *Note: Not available when accessing the last results through the Osero Suite Menu.*
* **Rerender All Shots**: Restart the render to render all the active shots. *Note: Not available when accessing the last results through the Osero Suite Menu.*
* **Close Window**: Close this Render Results window.

### Settings <a href="#settings" id="settings"></a>

Access the settings by going to **Edit** > **Project Settings...** > **Plugins** > **Osero Suite: Render Results Screen Settings**.

<figure><img src="/files/wzAiu1iXeRau9oENAJs8" alt=""><figcaption></figcaption></figure>

<figure><img src="/files/CSWVM648fax5r8LMNJTD" alt=""><figcaption></figcaption></figure>

#### **Settings Definitions**

* *General*
  * **Use Osero Suite Movie Render Pipeline Classes**: Toggles the results screen on and off by changing the Movie Render Pipeline classes to the Osero Suite classes or the default editor classes.
  * **Default Date Time Format**: Changes the display format of dates and times across the plugin. Defaults to *YYMMDDHHMMSS*.
    * **DDMMYYHHMMSS**: 31/12/2022 15:34:00
    * **MMDDYYHHMMSS**: 12/31/2022 15:34:00
    * **YYMMDDHHMMSS**: 2022/12/31 15:34:00
    * **HHMMSSDDMMYY**: 15:34:00 31/12/2022
    * **HHMMSSMMDDYY**: 15:34:00 12/31/2022
    * **HHMMSSYYMMDD**: 15:34:00 2022/12/31
* *Accessibility*
  * **Reset Accessibility Colours**: Reset all of the colours back to default.
  * **Colour Success**: The colour used for successful renders.
  * **Colour Warning**: The colour used for interrupted renders.
  * **Colour Failure**: The colour used for failed renders.
  * **Colour Error**: The colour used for errored/crashed renders.
  * **Render Start Time Colour**: The display colour for start time strings.
  * **Render Total Time Colour**: The display colour for total time strings.
* *PIE Render Settings (5.2+ Only)*
  * **Resize PIE Window to Output Resolution**: Should the PIE Window be created at the same resolution as the MRQ Output? Note: This is copied from \[UMoviePipelinePIEExecutorSettings] because that class is private so we can't access it.

### Viewing the Last Render Results <a href="#viewing-the-last-render-results" id="viewing-the-last-render-results"></a>

The last render results can be brought up again by going to the **Osero Suite Menu** and selecting **Osero Suite: MRQ Last Render Results**.

<figure><img src="https://jerenosero.files.wordpress.com/2024/04/resultsscreen5.png?w=565" alt=""><figcaption></figcaption></figure>

Note: The Osero Suite Menu can be found in the Level Editor Toolbar (pictured above), or in the **Window** menu.


# Foreword

The technical notes here are my private notes compiled throughout some of my time working in Unreal Engine. Some have references, some do not. I do not claim to be entirely accurate with everything and things may change/may have changed in future versions of software since these notes were taken. I've added them here just in case anyone else finds them useful.

If you do find them useful, consider supporting me by purchasing an Unreal Engine asset from the Osero Suite, or even tagging me in a post or commenting on one of my socials.

{% hint style="success" %}
[Fab](https://www.fab.com/sellers/Jeren%20Osero) | [YouTube](https://www.youtube.com/@JerenOsero) | [Rumble](https://rumble.com/c/c-6746292) | [Twitter/X](https://twitter.com/JerenOsero) | [Instagram](https://www.instagram.com/jerenosero/) | [LinkedIn](https://www.linkedin.com/company/jeren-osero) | [Jeren Osero Website](https://jerenosero.com/)
{% endhint %}


# Unreal Engine Notes


# Actor Components


# Component Transforms

USceneComponent save their transform in separate FVectors rather than using an FTransform:

* RelativeLocation
* RelativeRotation
* RelativeScale3D

<figure><img src="/files/n5U5VgO5EyNgFMbe6HUC" alt=""><figcaption></figcaption></figure>

It also has three bools that tell whether these variables are relative or absolute:

* bAbsoluteLocation
* bAbsoluteRotation
* bAbsoluteScale

<figure><img src="/files/yQZWinmSAVBMmzHnzp20" alt=""><figcaption></figcaption></figure>

What is shown in the *Details Panel* to make it look like FTransform is customised here:

```cpp
FComponentTransformDetails::GenerateChildContent
```

<figure><img src="/files/gwuMw9RinpRY0Nk3KxbC" alt=""><figcaption></figcaption></figure>


# Blueprints


# Add Function to Promotable Operator Nodes

<figure><img src="/files/g0M3ETycwflLNJP2S0aA" alt=""><figcaption></figcaption></figure>

To add a function to these operator nodes, a function must have these things:

1. The function must be `static`.
2. The UFUNCTION must be `BlueprintPure`.
3. The UFUNCTION meta must contain `CompactNodeTitle = "{Node Title}"`.

```cpp
meta = (CompactNodeTitle = "==")
meta = (CompactNodeTitle = "!=")
```

4. The function name must start with one of the defined “OperatorNames” in `BlueprintTypePromotion.cpp`.

```cpp
namespace OperatorNames
{
	static const FName NoOp			= TEXT("NO_OP");
	static const FName Add			= TEXT("Add");
	static const FName Multiply		= TEXT("Multiply");
	static const FName Subtract		= TEXT("Subtract");
	static const FName Divide		= TEXT("Divide");
	static const FName Greater		= TEXT("Greater");
	static const FName GreaterEq		= TEXT("GreaterEqual");
	static const FName Less			= TEXT("Less");
	static const FName LessEq		= TEXT("LessEqual");
	static const FName NotEq		= TEXT("NotEqual");
	static const FName Equal		= TEXT("EqualEqual");
}
```

### Example <a href="#example" id="example"></a>

From “OS\_RRS\_RenderDataLibrary.h”:

```cpp
UFUNCTION(BlueprintPure, Category = "Osero Suite: Render Results Screen", meta = (DisplayName = "Equal (Render Job)", CompactNodeTitle = "==", Keywords = "== equal"))
	static bool EqualEqual_JobJob(FOS_RRS_JobData A, FOS_RRS_JobData B);
UFUNCTION(BlueprintPure, Category = "Osero Suite: Render Results Screen", meta = (DisplayName = "Not Equal (Render Job)", CompactNodeTitle = "!=", Keywords = "!= not equal"))
	static bool NotEqual_JobJob(FOS_RRS_JobData A, FOS_RRS_JobData B);
```

More examples can be found in "KismetMathLibrary.h".


# Compile Errors


# Implicit Capture of 'This' via '\[=]' is Deprecated

### Error <a href="#error" id="error"></a>

```
Error C4855 implicit capture of 'this' via '[=]' is deprecated in '/std:c++20'
```

### Cause <a href="#cause" id="cause"></a>

Lambdas change slighlty with the upgrade to c++20, which gets implemented in 5.3. This error happens when upgrading something from 5.2 to 5.3.

### Fix <a href="#fix" id="fix"></a>

In 5.2, a lambda is defined like this:

```cpp
auto TracePositive = [=]() -> FHitResult {};
```

But in 5.3, it needs to become this:

```cpp
auto TracePositive = [=, this]() -> FHitResult {};
```


# Specified Type Modifiers Are Not Allowed Here

### Error <a href="#error" id="error"></a>

<figure><img src="/files/q4a04HG1Cy1XIunNEdys" alt=""><figcaption></figcaption></figure>

<figure><img src="/files/8UyIOaScT57vnIh5z1HY" alt=""><figcaption></figcaption></figure>

### Solution <a href="#solution" id="solution"></a>

**BlueprintCallable** UFUNCTIONS are not allowed in an #if WITH\_EDITORONLY\_DATA block.

(**BlueprintPure** is allowed though.)


# Static Function in Namespace Not Defined

### Error <a href="#error" id="error"></a>

```
static function 'FString OS_MDC_Keys::ReplaceAll()' declared but not defined
```

```cpp
namespace OS_MDC_Keys
{
  static FString ReplaceAll();
}
```

### Cause <a href="#cause" id="cause"></a>

A function declared as static in a namespace needs to be defined in the header.

### Fix <a href="#fix" id="fix"></a>

Either move the function definition to the header OR remove the static specifier. Global functions in namespaces do not need to be static.

```cpp
namespace OS_MDC_Keys
{
  static FString ReplaceAll() {}
}
```

```cpp
namespace OS_MDC_Keys
{
  FString ReplaceAll();
}
```


# Circular Dependency Detected

### Error <a href="#error" id="error"></a>

```
Cicular Dependency Detected
```

### Cause <a href="#cause" id="cause"></a>

In some cases, it might be because a class is defined/forward declared without it being defined.

```cpp
virtual TArray<class USH_RV2_SplineComponent*> GetSplineSectionPaths();
```

In this case, `USH_RV2_SplineComponent` was not defined anywhere, and the class that this array was in had an Interface that thought this was a circular dependency.

### Fix <a href="#fix" id="fix"></a>

Make sure the correct #includes are added so that there is no “circular dependency”.

```cpp
#include "Components/SH_RV2_SplineComponent.h"
```

### Notes <a href="#notes" id="notes"></a>

* When I deleted the Binaries/Intermediate folders and regenerated fresh, this error becamse an “undefined class” error. The notes here are to remind me to check other errors because the initial error may not be what’s actually causing this error.


# Inconsistent Dll Linkage

### Error <a href="#error" id="error"></a>

```
Error C4273 'USH_FNC_SPD_Settings::GetPrivateStaticClass': inconsistent dll linkage
```

### Cause <a href="#cause" id="cause"></a>

An API macro is not named correctly for the module in which this class is declared.

```cpp
UINTERFACE()
class SH_FNC_SPD_RUNTIME_API USH_FNC_SPD_Settings : public UInterface
{
	GENERATED_BODY()
};
```

In this example, `USH_FNC_SPD_Settings` is actually in `SH_FNC_SPD_EDITOR_API`.

### Fix <a href="#fix" id="fix"></a>

Correct the incorrect API macro.

```cpp
UINTERFACE()
class SH_FNC_SPD_EDITOR_API USH_FNC_SPD_Settings : public UInterface
{
	GENERATED_BODY()
};
```


# Overloaded Member Function Note Found (Compile Error in .gen File)

### Error <a href="#error" id="error"></a>

```
Error	C2511	'void UPS_DFS_UI_PlayerHUD::TriggerTooltip_String(const FString &,bool,bool,FSH_RTT_TooltipSettings)': overloaded member function not found in 'UPS_DFS_UI_PlayerHUD' E:\PS_Projects\Deforestation\Intermediate\Build\Win64\UnrealEditor\Inc\Deforestation\UHT\PS_DFS_UI_PlayerHUD.gen.cpp	
```

### Cause <a href="#cause" id="cause"></a>

The compiler has added “const” and &” to one of the input paramaters in the function in the .gen file:

```cpp
void UPS_DFS_UI_PlayerHUD::TriggerTooltip_String(const FString& Tooltip, bool bPrintAlways, bool bSavetoHistory, FSH_RTT_TooltipSettings TooltipSettings) {}
```

### Fix <a href="#fix" id="fix"></a>

Add the “const” and &” to the definition in the main class’s code:

```cpp
UFUNCTION(BlueprintCallable, BlueprintImplementableEvent, Category = "Tooltips", meta = (DisplayName = "Trigger Tooltip (String)"))
	void TriggerTooltip_String(const FString& Tooltip, bool bPrintAlways = false, bool bSavetoHistory = true, FSH_RTT_TooltipSettings TooltipSettings = FSH_RTT_TooltipSettings());
```


# Config


# Config Saving/Loading Broken in UE 5.5

### Context

* Project: [Plugin Sync Tool](/supported-assets/plugin-sync-tool) and [Module Creator](/supported-assets/module-creator)
* Engine Version: 5.5

### Error

When exiting the editor and reopening it, saved config variables in custom configs are not loaded correctly.

### Cause

In Unreal Engine 5.5, the config system was modified and it broke some of the expected behaviour.

{% hint style="info" %}
This seems to be fixed in UE 5.6.
{% endhint %}

### Fix

Manually load the config into memory BEFORE calling LoadConfig() on our object.

```cpp
void UOS_PST_Settings::LoadFromConfig()
{
#if ENGINE_MAJOR_VERSION >= 5 && ENGINE_MINOR_VERSION >= 5
	//The config system is broken in 5.5, so we have to manually load the config into memory BEFORE calling LoadConfig() on our object
	FString ConfigPath = FPaths::ConvertRelativePathToFull(FPaths::Combine(FPaths::ProjectSavedDir(), TEXT("Config"), FPlatformProperties::PlatformName(), TEXT("OseroSuiteEditorSettings.ini")));
	// Attempt to load the config file
	GConfig->LoadFile(ConfigPath);
#endif

	LoadConfig();
	//...
}

void UOS_PST_Settings::SaveToConfig()
{
	//...
	SaveConfig();
}

```

{% hint style="info" %}
Even when using the UCLASS tag "defaultconfig", the config seems to be saved in the Project > Saved folder, rather than the Config > Saved folder.
{% endhint %}


# Crash Fixes


# Crash on Exit (Custom FEditorViewportClient): EditorModeManager.cpp (Line 727)

### Context

* Project: [SHADERSOURCE: Texture Tools](https://docs.shadersource.io/assets-and-plugins/texture-tools)
* Engine Version: 5.4

### Error

When exiting the editor, there is a crash in EditorModeManager.cpp on line 727:

```
InMode->Exit();
```

### Cause

On exiting the engine, the custom `FEditorViewportClient` is being cleaned up AFTER `FEditorModeTools` is being cleaned up, which `FEditorViewportClient` relies on in its destructor.

### Fix

Added `FShadersource_TextureToolsModule::OnEditorClose` function to `FCoreDelegates::OnEnginePreExit` to clean up the SharedPtr and trigger the destructors BEFORE the `FEditorModeTools`  is cleaned up.

```cpp
void FShadersource_TextureToolsModule::StartupModule()
{
	//...
	
	FCoreDelegates::OnEnginePreExit.AddRaw(this, &FShadersource_TextureToolsModule::OnEditorClose);
}

void FShadersource_TextureToolsModule::ShutdownModule()
{
	FCoreDelegates::OnEnginePreExit.RemoveAll(this);
	
	//...
}

void FShadersource_TextureToolsModule::OnEditorClose()
{
	if (ToolWidget.IsValid())
	{
		ToolWidget.Reset();
	}
}
```


# Debugging


# UIAction.h Line 139

Putting a breakpoint at UIAction.h Line 139 will pause the editor whenever a UI Action is triggered so that you can see where the code goes. Step into this function and into the next and it will show where the delegate points.

`FUIAction::Execute()`

```cpp
bool Execute( ) const
{
	// It's up to the programmer to ensure that the action is still valid by the time the user clicks on the
	// button.  Otherwise the user won't know why the action didn't take place!
	if( CanExecute() )
	{
		return ExecuteAction.ExecuteIfBound(); //--- THIS LINE ---
	}
	
	return false;
}
```


# Details Customisation


# Add External Property to Details Panel

To add an external property from an object that is not being customised to your *Detials Panel* use:

```cpp
IDetailPropertyRow* Row = <IDetailCategoryBuilder variable>.AddExternalObjectProperty({InObject}, PropertyName)
```

For the property name, you can use:

```cpp
GET_MEMBER_NAME_CHECKED(<Class>, <Variable Name>)
```

If the variable is protected or private, use the string property name.

&#x20;

The row that gets generated by the category can have its Display Name edited:

```cpp
Row.DisplayName(FText::FromString(VariableOverrideName));
```

&#x20;

To add it to a group rather than a category, generate the category row first, and then hide that row and use the property handle from the row to generate a new property row in the group.

```cpp
Row->Visibility(EVisibility::Collapsed);
IDetailPropertyRow& NewGroupRow = NewGroup.AddPropertyRow(Row->GetPropertyHandle().ToSharedRef());
```

The Display Name can be set the same as above with the new group-generated row.

&#x20;

Examples:

```cpp
TArray<UBoxComponent*> Killboxes = Settings->GetParentWaterfall()->GetAllKillboxes();
for (UBoxComponent* KillBox : Killboxes)
{
	IDetailGroup& NewGroup = Cat_Kill.AddGroup(KillBox->GetFName(), FText::FromString(FName::NameToDisplayString(KillBox->GetName(), false)));

	auto AddExternalPropertyToKillGroup = [&](FName PropertyName, FString VariableOverrideName = "")
	{
		IDetailPropertyRow* Row = Cat_Kill.AddExternalObjectProperty({ KillBox }, PropertyName);
		if (Row)
		{
			Row->Visibility(EVisibility::Collapsed);
			IDetailPropertyRow& NewGroupRow = NewGroup.AddPropertyRow(Row->GetPropertyHandle().ToSharedRef());

			if (!VariableOverrideName.IsEmpty()) NewGroupRow.DisplayName(FText::FromString(VariableOverrideName));
		}
	};

	AddExternalPropertyToKillGroup(USceneComponent::GetRelativeLocationPropertyName(), "Location");
	AddExternalPropertyToKillGroup(USceneComponent::GetRelativeRotationPropertyName(), "Rotation");
	AddExternalPropertyToKillGroup(USceneComponent::GetRelativeScale3DPropertyName(), "Scale");
	AddExternalPropertyToKillGroup("BoxExtent", "Extent");
}
```


# Default Slate Styles

Details Panel Name Font

```
FSlateFontInfo FontInfo = IDetailLayoutBuilder::GetDetailFont();
```


# Ed Modes


# Registering Editor Modes

**UEdModes** are registered automatically here: `UAssetEditorSubsystem::RegisterEditorModes`. This gets called based on info current to the engine at the end of the *PostDefault* loading phase, so anything loading after this won’t be registered.

Legacy **FEdModes** need to be registered and unregistered manually in the startup and shutdown of the modules.

```cpp
FEditorModeRegistry::Get().RegisterMode<FShadersource_RoadToolEdMode>(FShadersource_RoadToolEdMode::EM_SH_RoadToolEditorModeId, LOCTEXT("Shadersource_RoadToolEdModeName", "SHADERSOURCE: Road Tool"), RoadToolIcon, true);
FEditorModeRegistry::Get().UnregisterMode(FShadersource_RoadToolEdMode::EM_SH_RoadToolEditorModeId);
```


# Editor/Engine


# Get Engine Version in C++

```cpp
// #if ENGINE_MAJOR_VERSION >= 4 && ENGINE_MINOR_VERSION >= 19 || ENGINE_MAJOR_VERSION == 5
// Is equal to
#if UE_VERSION_NEWER_THAN(4, 19, -1)
// but whole block can be reversed using UE_VERSION_OLDER_THAN macro
#if ENGINE_MAJOR_VERSION >= 4 && ENGINE_MINOR_VERSION >= 19 || ENGINE_MAJOR_VERSION == 5
    // Some Code for UE4.19 and newer versions
#else
    // Some code for pre UE4.19 versions
#endif
// will be equivalent to
#if UE_VERSION_OLDER_THAN(4, 19, 0)
    // Some code for pre UE4.19 versions
#else 
    // Some Code for UE4.19 and newer versions
#endif
```

{% hint style="info" %}
\#define <mark style="color:purple;">ENGINE\_MAJOR\_VERSION</mark> 5\
\#define <mark style="color:purple;">ENGINE\_MINOR\_VERSION</mark> 2\
\#define <mark style="color:purple;">ENGINE\_PATCH\_VERSION</mark> 1

This means it’s version 5.2.1.
{% endhint %}

### Reference

{% embed url="<https://medium.com/@igor.karatayev/correct-way-to-check-unreal-engine-version-in-code-428c4adfa245>" %}


# Extending the Editor with FExtender

### Example <a href="#example" id="example"></a>

```cpp
TSharedPtr<FExtender> TestExtender = MakeShareable(new FExtender);
TestExtender->AddToolBarExtension("CommonActions", EExtensionHook::After, NULL, FToolBarExtensionDelegate::CreateStatic(&FOS_SLV_CommandsCallbacks::BuildToolbar));

FLevelEditorModule& LevelEditorModule = FModuleManager::LoadModuleChecked<FLevelEditorModule>("LevelEditor");
LevelEditorModule.GetToolBarExtensibilityManager()->AddExtender(TestExtender);
```

1. Create the extender.
2. Add the toolbar (or menu) extension, defining where it should be placed and the create function.
3. Find the correct module.
4. Add the extender to the Extensibility Manager

### Extensibility Managers <a href="#extensibility-managers" id="extensibility-managers"></a>

#### Global <a href="#global" id="global"></a>

Add to all asset editors - ie, Actor Blueprint, Animation Blueprint, Data Asset, etc

```cpp
FAssetEditorToolkit::GetSharedToolBarExtensibilityManager()->AddExtender(TestExtender);
```

#### Level Editor <a href="#level-editor" id="level-editor"></a>

```cpp
FLevelEditorModule& LevelEditorModule = FModuleManager::LoadModuleChecked<FLevelEditorModule>("LevelEditor");
LevelEditorModule.GetToolBarExtensibilityManager()->AddExtender(TestExtender);
```

#### Persona <a href="#persona" id="persona"></a>

```cpp
FPersonaModule& PersonaModule = FModuleManager::LoadModuleChecked<FPersonaModule>("PersonaModule");
PersonaModule.GetToolBarExtensibilityManager()->AddExtender(TestExtender);
```

#### Animation Blueprint <a href="#animation-blueprint" id="animation-blueprint"></a>

```cpp
IAnimationEditorModule& AnimationEditorModule = FModuleManager::GetModuleChecked<IAnimationEditorModule>("AnimationEditor");
AnimationEditorModule.GetToolBarExtensibilityManager()->AddExtender(TestExtender);
```

#### Actor/Object Blueprints <a href="#actor-object-blueprints" id="actor-object-blueprints"></a>

NOT Animations, Data Assets, etc - ones that have a normal Blueprint Graph

```cpp
FBlueprintEditorModule& BlueprintEditorModule = FModuleManager::LoadModuleChecked<FBlueprintEditorModule>("Kismet");
BlueprintEditorModule.GetMenuExtensibilityManager()->AddExtender(TestExtender);
```


# Exit FCoreDelegates

```cpp
// Called when the application is about to exit.
static CORE_API FSimpleMulticastDelegate OnExit;

// Called when before the application is exiting.
static CORE_API FSimpleMulticastDelegate OnPreExit;

// Called before the engine exits. Separate from OnPreExit as OnEnginePreExit occurs before shutting down any core modules.
static CORE_API FSimpleMulticastDelegate OnEnginePreExit;
```

### Example

(From SHADERSOURCE: Texture Tools)

```cpp
FCoreDelegates::OnEnginePreExit.AddRaw(this, &FShadersource_TextureToolsModule::OnEditorClose);
```

```cpp
void FShadersource_TextureToolsModule::OnEditorClose()
{
	if (ToolWidget.IsValid())
	{
		ToolWidget.Reset();
	}
}
```


# Input


# Get Key or Mouse Button in C++

InputCoreTypes.h has a static struct `EKeys`.

### Example <a href="#example" id="example"></a>

```cpp
const FPointerEvent& MouseEvent;
MouseEvent.IsMouseButtonDown(EKeys::RightMouseButton)
```


# Mouse Cursor Location in World (3D Space)

<figure><img src="/files/kb8clkev58EBvwXH6j3s" alt=""><figcaption></figcaption></figure>

<figure><img src="/files/THgtQsgevAfLI2HXcYy3" alt=""><figcaption></figcaption></figure>


# Level Editor


# Select Actor Component via C++

```cpp
USelection* SelectedComps = GEditor->GetSelectedComponents();
SelectedComps->DeselectAll();
GEditor->SelectComponent(Component, true, true, true);
GEditor->NoteSelectionChange();
```

{% hint style="warning" %}
If you don't call the deselect function then it adds the component to the selection rather than exclusively selecting it.
{% endhint %}

{% hint style="info" %}
`NoteSelectionChange()` updates the gizmo in the viewport and calls appropriate delegates.
{% endhint %}


# Meta Specifiers


# Reference

{% embed url="<https://benui.ca/unreal/uproperty/>" %}


# Edit Condition

**EditCondition** can be used with a bool OR an enum

```cpp
UPROPERTY(EditAnywhere, Category = "Emitter")
ENiagaraEmitterCalculateBoundMode CalculateBoundsMode = ENiagaraEmitterCalculateBoundMode::Dynamic;

UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Emitter", meta = (EditConditionHides, EditCondition = "CalculateBoundsMode == ENiagaraEmitterCalculateBoundMode::Fixed"))
FBox FixedBounds;
```

**EditConditionHides** auto-hides the variable if the EditCondition is not met.


# Bind Widget

```cpp
/* BindWidget meta means the Blueprint will not compile unless there is a child component in the UMG hierarchy that matches the exact name and type or child of type.
* Note: There is a possibility of this being nullptr if not using a blueprint class. */
UPROPERTY(EditAnywhere, BlueprintReadOnly, meta = (BindWidget))
    class UTextBlock* TXT_Tooltip = nullptr;
```

{% hint style="warning" %}
Note: This pointer isn’t assigned until AFTER the widget is made visible (ie, AddToViewport, AddToPlayerScreen, WidgetPointer->AddChild).
{% endhint %}


# Rendering


# Set Graphics Card Timeout

If you are going to be rendering on your PC, it’s recommended these steps are followed. This also generally helps with crashes when trying to work on heavier scenes.

**If the GPU crashes a lot, make sure the timeout values in the Windows Registry are set correctly.**

What this does is it tells Windows to not assume the GPU has timed out until 60 seconds have passed (default is 3 seconds, which is why renders crash a lot).

1. Using the **Windows Start menu search bar**, enter **regedit** to launch the **Registry Editor**.
2. Navigate to the category **Computer\HKEY\_LOCAL\_MACHINE\SYSTEM\CurrentControlSet\Control\GraphicsDrivers**.
3. *If the values **TdrDelay** and **TdrLevel** exist:*
   1. Select **TdrDelay** from the list, then right-click and select **Modify**.
   2. This value is measured in seconds. Select **Decimal**, set a **Value data** of **60**, then click **OK**.
4. *If the values **TdrDelay** and **TdrLevel** do not exist:*
   1. Right click in the Registry and select **New > DWORD (32-bit) Value**
   2. Name it **TdrDelay** (Case Sensitive)
   3. Double click on it and select **Decimal**, set a **Value data** of **60**, then click **OK**.
   4. Right click in the Registry and select **New > DWORD (32-bit) Value**
   5. Name it **TdrLevel** (Case Sensitive)
   6. Double click on it and select **Decimal**, set a **Value data** of **3**, then click **OK**.
   7. Restart your PC.

<figure><img src="/files/I8huwBpeKZLMbJYthkZ0" alt=""><figcaption></figcaption></figure>

<figure><img src="/files/Dm0uYlUe5HQoBGM585V6" alt=""><figcaption></figcaption></figure>


# Sequencer


# Project Default: Completion Mode

By default, the Completion Mode, aka “When Finished” variable for a UMovieSceneSkeletalAnimationSection is *Restore State*. To change it to *Keep State* for the whole project, add the following line to **DefaultEngine.ini**:

```
[/Script/LevelSequence.LevelSequence]
DefaultCompletionMode=KeepState
```

{% hint style="info" %}
There is **no** setting in either Project Settings or Editor Preferences for this - it’s a variable (*UMovieSceneSequence->DefaultCompletionMode*) that gets saved/loaded to/from the config on editor startup. If it’s changed, restart the editor for it to take effect.
{% endhint %}




---

[Next Page](/llms-full.txt/1)

