A work-in-progress experimental image and 3D model processing application codename “Nodeller”, currently in early alpha stage.

It uses my own node editor system called NodeEngine – a C++ UI-less fully OOP state-machine graph for granular processing of data. Another project called NodeEngineImGui wraps it in ImGui calls for being used with ImGui immediate mode UI system.

Emphasis on speed and ability to process high-res imagery. Multithreading currently encompasses costly erosion computation. The program is able to process 16K textures very fast, also including the erosion algorithm with milion of passes. Images are stored and processed as floating-point vectors.

Model loader is my own OBJ-loader created from scratch. Eventually the meshes will be able to get also raytraced with ManTracer, experimental C++ raytracer.

Tech stack: C++ / OpenGL / ImGUI

Responsibility: everything

Nodeller v. 0.39 (pending iteration)

  • Added scene path to window title bar based on events
  • Add events set for scene new/loading/saving/closing
  • Added events to resize framebuffer once the render viewport is resized by dragging
  • Refactored viewport code
  • Added trivial scene graph for holding camera and mesh

Nodeller v. 0.38 (movie as soon as the iteration is closed)

  • Refactored main Application class, wrapped implementation specific calls into UI and Render classes
  • Added a pixel mask to Node_BlendColor to enable per-pixel blend mode masking (instead of industry-standard per-image ratio only) if the channel is connected; if not, regular ratio float value is used as before
  • Added freetype TrueType font rendering library support to render text using OpenGL
  • Added text rendering support – screen space text
  • Added WIP ManagerRenderer to oversee all shaders in a unified pipeline
  • Subclassed all renderers under an abstract class
  • Added WIP CalculateTangentsBitangents method plus a switch in Node_LoadModel to make it optional on load
  • Added option to render debug normals for vertices
  • Extended Node_RenderModel, added option to supply custom shaders via data path
  • Added geometry shader support
  • Unified shaders
  • Modified shaders to stick to the common uniforms convention (proj/view/model) instead of handling this from the camera class
  • Added utilities to convert between matrix and vector notation of mesh structures
  • Fixed performance bug that linked to displaying collections size in node view which made checking vector sizes each frame, costly for huge meshes/image sizes

Nodeller v. 0.37 (movie soon)

  • Added WIP Node_MeshCurvature with output range scaling according to an arbitrary range or an autoscale via min/max precomputation
  • Integrated libigl library for geometry processing tasks
  • Completely rewritten Mesh structures, flattened hierarchy, avoiding superfluous encapsulation, relying on raw data structures
  • Completely rewritten internal OBJ Loader
  • Integrated tinyobj obj loader mainly as a way of proof-checking internal loader
  • Completely rewritten loader code, added factory-style abstraction
  • Degraded assimp as default loader due to it being unable to provide unprocessed obj data
  • Added Node_Levels with gamma correction
  • Added Node_Quantize
  • Added Node_Threshold
  • Modified Node_LoadImage, added alpha channel support as separate output
  • Modified Node_LoadImage, added three modes of alpha channel interpretation (straight unmatted, premultiplied with color selection, ignored)
  • Fixed Node_ValueColor not having output node ports
  • Fix Node_Mask returning slightly wrong values
  • Made Settings window docked by default and on
  • Fixed Node_MapCurvature by applying clamping
  • Added (early WIP) custom in-house event system based on functor objects with behaviour similar to c# event system
  • Integrated Eigen matrix library for future mesh processing tasks
  • Integrated OpenMesh half-edge mesh data structure library for future mesh traversal tasks
  • Finished implementation of KDTree algorithm – specialized it to work with k=3 for glm::vec3 data types
  • Added nearest neighbour search algorithm for KDTree algorithm
  • Fixed assimp loader for meshes with vertex colors
  • Created custom cubemap for Render Model window pane
  • Added a multiline Node_Comment
  • Modified node serialization, added support for handling escape characters, viable especially for Node_Comment
  • Small bug fixes
  • Decided on making the consecutive revision numbering have smaller increments

Nodeller v. 0.35

  • Rewritten prototype node UI layout code from scratch to obey OOP rules
  • Modified UI widgets look to make sure each node port is properly displayed with node field at the proper position
  • Improved (still early WIP) AO node
  • WIP KDTree implementation as an acceleration structure for raycasting
  • Improved triangle rasterization algorithm
  • Bug fixing
  • A lot of code refactoring

Nodeller v. 0.3

  • Implemented inhouse logger
  • Added triangle rasterizer based on half-plane computations
  • Added color interpolation for triangle and Bresenham line rasterizer algorithms
  • Added [optional] assimp integration along with internal obj-loader
  • Implemented cubemap renderer
  • Implemented normal map support for OpenGL rendering
  • Added support for tangents/bitangents for vertices, along with algorithm to compute them for internal obj-loader (assimp already has that)
  • Added support for render node to tweak specular coefficients
  • Added early WIP ambient occlusion node (traditional occlusion-based approach)
  • Modified UVFromImage node to detect fed textures/colors and provide proper output
  • Added WIP image caching functionality via specialized node field, to be used with nodes like paint node
  • Added (late WIP) 2D paint node to paint over textures
  • Added RGB<>HSL conversion algorithm
  • Added Node_BrightnessContrast
  • Added Node_HSL for tweaking hue, saturation and luminance
  • Added colored erosion to Node_Erosion, added erosion value clamping
  • Fixed Node_Paint cursor off center
  • Added min and max values to node ports and node fields
  • A lot of code refactoring

Nodeller v. 0.2

Migrated ImGui backend to the docking branch, restructured UI to support docking and root node windows, modified model renderer to be the part of the nodal system and allow for vertex transformations. Added nodes: Math, VectorMath, VectorMath for std::vectors, ImageFromUV (WIP, as seen on video it’s upside down now). Added WIP node Colorize, Node_RenderModel & Node_Model for manipulating 3D triangulated meshes. Updated convolution filter node, WIP splash screen. Early WIP of node graph editor zooming in/out capability (not seen on the video).

Nodeller v. 0.1

Added convolution filters, image transformations (flips plus shift), fully working serialization, diffuse texture for models as input node, mouse input to render window, proper node state resetting on close/new scene including GL parts of the program, automatic/manual mode for node engine plus dozens of minor features and bug fixes. Added new font and totally changed UI style. A lot of code refactoring.

Nodeller 0.04

Added WIP topology maps support (for now curvature map), WIP normal map support, upgrade to node system (ability to delete node links and nodes).

Nodeller 0.03

Improved erosion node, added texture support for heightmap rendering, improved noise node

Nodeller 0.02

Added WIP erosion node, heightmap rendering, upgrade to node system.

Nodeller 0.01

Initial version of the software, capable of handling basic image loading and blending, using very early version of node engine system.