Looking for UE4 C++ Programmer for Graph Editor (FILLED)

Project Title
Recollect Plugin

Description
Looking for an experienced UE4 tools programmer to develop a UE4 graph editor that will be part of an experimental AI plugin. The graph editor will be used for connecting UProperties (pins) of different UClasses (nodes), like such:

0_grapheditor.png

In the above image, MyFactClass1+2/MyDerivedFactClass are UClasses and MyBool/MyInt etc are their UProperties. The above graph represents that if an instance of MyFactClass1 and MyFactClass2 exist in a knowledge base with matching values for the connected properties, then MyDerivedFactClass is also true for those properties. You could consider this a graph editor for SQL queries, where the above graph is analogous to to the MySQL query:



CREATE VIEW  MyDerivedClass AS 
SELECT * FROM MyFactClass1 INNER JOIN MyFactClass2 
WHERE MyFactClass1.MyBool == MyFactClass2.MyBool
AND MyFactClass1.MyInt == MyFactClass2.MyInt
AND MyFactClass1.MyFloat == MyFactClass2.MyFloat;


The graphs won’t be used to query SQL databases, but the game world and the history of player actions. However, the scope of this job is just to create the graph editor.

Tasks
You will be expected to program a graph editor using code of existing graph editors in UE4 such as the material editor as reference. The work involves using reflection to dynamically add and remove node pins, implementing undo/redo behavior and handle asset loading errors while preventing data loss.

  • Create a new uasset type *Rule Graph *and a graph editor that automatically opens when opening rule graph assets

  • Moving/adding/deleting nodes should support Undo/Redo

  • Making/breaking pin connections should support Undo/Redo

  • Rule graphs have one, non-deletable output node

  • User can add any number of nodes

  • User can connect any of a node’s UProperty pins to a different node’s UProperty pin as long as they are type compatible, i.e.:

  • Both are the same primitive type (float, int, bool, string)

  • Or both are the same UObject class

  • Or the classes of all (to-be) connected properties are equal/subclasses of each other.
    For example: three properties of type AActor, APawn and ACharacter can be connected, but AActor, APawn and APlayerController cannot because a UObject can never be both APawn and APlayerController.

  • User can change the UClass of any node (support Undo/Redo), including the output node, to any subclass of the empty class UFact : public UObject and the pins will rebuild to show all of the new class’ UProperties. Existing connections and related pins are never destroyed, rather:

  • if the new class has a property of the same name and type, all connections are transferred over to the new pin.

  • otherwise if the an old pin has connections, the old pin remains with the old connections but enters an error state (read further)

  • When loading a saved graph after restarting Unreal Editor, errors can occur if the referenced UClasses have changed in code. Pins with connections are never destroyed, rather:

  • If a node’s UClass no longer exists, the node will revert to represent the class UFact. Existing pins and connections are handled as if the user manually changed the class.

  • If a pin with connections was saved in the graph asset, but the property no longer exists, the pin enters an error state.

  • If a pin with connections was saved in the graph asset, but the classes of all connected properties are no longer equal/subclasses of each other (property classes changed), the pin enters an error state.

  • Pins in error state:

  • Pins in error state, their connections and all pins they are connect to recursively render in red.

  • Pins in error state are automatically removed when the last connection involving the pin is broken. You can observe the intended behavior in blueprint in the SpawnActor node with ExposeOnSpawn properties.

  • Graphs with errors are savable, but should cause packaging to fail

  • Module setup:

  • The graph editor should be in an editor only module

  • The graph asset class should be accessible to runtime modules

Requirements

  • Experience in UE4 C++
  • Experience creating custom editor tools (ideally graph editors) for UE4
  • [Desirable, not mandatory] Prior experience implementing Undo/Redo-able actions in UE4 or other software

Compensation
Your work will be paid. I’m open for hourly rate and lump sum payment in milestones. Given the requirements I expect your hourly rate to be upward of $50/h.

Contact
Email your relevant previous work and hourly rate for this work to zhikang.shao [at] gmail [dot] com.
If your preference is lump sum payment, email any questions you have to determine that sum.

License
I gain the right to copy, modify and sell delivered code as part of a plugin or game.

The position has been filled.