Note: This is an archived version of the Blender Developer Wiki (archived 2024). The current developer documentation is available on developer.blender.org/docs.

User:JacquesLucke/Reports/2019

Week 15 + Holidays: January 7 - 11

  • Fixed Bugs: T60342, T60338, T60327, T60282, T60291
  • Started working on a new project called derivedrepo. It's purpose is to generate a new repository based on some (git) repository using some derivation function. The primary goal is keep a repository of compiled Blender builds to make bisecting more efficient. However, the project tries to solve a more general problem.
  • Started working on nodes in Blender. So far I mostly implemented a node compiler that uses LLVM as backend. Will write more documentation this week. The code is currently in two separate repositories on Github: Blender Core and UI.

Week 16: January 14 - 18

  • Testing new ArrayBase data structure as a replacement for ListBase (linked lists should not be used when it can be avoided...) (D4225).
  • Fixed Bugs: T60591, T60383, T60304
  • Unfinished fixes: D4221
  • Started working on making vertices active using box/circle/lasso select, but stopped for UX reasons (D4217).
  • Wrote a wiki page for the Everything Nodes project.

Week 17: January 21 - 25

  • Fixed Bugs: rBA2eb519c, T60816, T58502, T59145, T60791, T60126, T60709
  • Wrote a small addon for the Spring team to copy drivers (Github).
  • Tried to help some new developers to do their first code contribution (Twitter -> D4258, D4260, D4261).
  • Tested a generic interface for function calls. Also learned a lot about C++ this week. Currently, the code is still on Github, but will push the branch to developer.blender.org soonish.

Week 18: January 28 - 01

  • Created an initial proposal for a Python Tool API. Many things have to be discussed still (T61105).
  • Removed deprecated ghosting code (D4271).
  • Fix T60996: Dyntopo flood fill fails due to missing ob->imat
  • Fix T60067: some modifiers don't use shape keys correctly
  • Fix T60226: Inset not working well on very small faces
  • Fix: allow curve of driver to be evaluated individually (f4c0dac).
  • Fixed some addons that were broken, because the object color does have an alpha value now (1ceaca7, 4e8ddec, 04dc7f2).
  • Fix: allow removal of addons that are symlinked (e6ba760).
  • Reviewed and merged: 9552d4b, d473d5b, 5348919
  • Started to update the bgl docs (D4280).
  • Committed to the Blender manual repository for the first time (4563).

Week 19: February 04 - 08

  • Fix T61275: recognize values with decimal separator in svg importer
  • Investigated D4312.
  • Cleanup: Remove deprecated ghosting code (4547815).
  • Fix T60935: More numerically stable distance to ray computation.
  • Some improvements/fixes for the Object Scatter addon (f40ec5d, 8e3a51e, 6f0deb3).
  • Don't split groups by default when importing .obj files (899c287).

Functions

Besides these things I also continued to work on the functions project. I'm spending quite some time learning how to do certain things in C++ (which I did not use for a serious project yet). I investigated/implemented the following:

  • Managing shared ownership over language boundaries.
  • Using dynamic composition instead of inheritance for some types.
  • How to use const so that it does not get in the way.

I also worked on some data structures that I want to work with. I put those into BLI for now. Feels like a good place for Blenders own C++ data structures. Most of them also have some unit tests already.

  • SmallVector<T>: Similar to std::vector, just that it does not have to allocate memory when it is small.
  • SmallSet<T>: Build on top of SmallVector but supports different operations.
  • SmallMap<K, V>: Similar to SmallSet.
  • SmallSetVector<T>: An vector that supports efficient membership testing.
  • Composition: Can be used in other objects to extend them dynamically. In my case I use it to have generic type and function objects that can be extended with backend specific information.
  • RefCounter<T>: Generic object that wraps another object and extends it with an atomic reference counter.
  • Shared<T>: Similar to std::shared_ptr but wraps a RefCounter object. Having it allows automatic shared ownership within C++, but still makes it possible to pass the RefCounter to C code.

Furthermore, I added a new node tree type, but it doesn't really do anything yet. I hope I'll get to that point next week.

Week 20: February 11 - 15

  • Make marker lines in sequencer and graph editor optional (D4348).
  • Tracked down some bugs I experienced when having references to node trees in a modifier. They were caused by user count problems of nodes (T61506, T61515). The bugs were fixed by Bastien.
  • Fix T61430: invoke_popup() does not respect ui scale.

Functions

I took two days off.

Week 21: February 18 - 22

  • Fix T61791: Motion path step is not taken into account
  • Fix T61702: obmat used incorrectly when calculating constant detail size
  • Fix T61707: Use id attribute to initialize object and curve names when importing .svg.
  • Fix T61666: missing NULL_UNIT that stops iteration over units.
  • FCurves: Remember active fcurve when selecting other bone (c598ad9).
  • Reviewed D4320: Port "Import BrushSet" addon to Blender 2.8.
  • Committed marker line patch from last week (3b3eba6).

Functions

  • Made some nodes a bit more generic (input/output/math).
  • Added possibility to use a generated function in the Displace modifier to calculate vertex weights.
  • Added a new driver variable that can evaluate a function (and also set-ups dependencies mostly correct).

Week 22: February 25 - 01

  • Fix T62050: Remove non-persistent timers in load-pre callback.
  • Fix T61994: Crash when box selecting instances.
  • Fix T61827: Operator align.selected2xyz was very slow.
  • Fix T61875: Wrong description of normalize node in manual.
  • Fix T61919: Rename "Smooth Vertex" -> "Smooth Vertices"
  • UI: Show marker lines in remaining animation spaces (d541430).
  • Reviewed D4401: Create new temperature unit.

Functions

  • Gave a presentation about Everything Nodes in the Studio.
  • Initial LLVM backend.
  • Major file structure cleanup.

Week 23: March 04 - 08

  • Fix T62319: Changing keyframe properties does not trigger update.
  • Fix T62305: Unconnected group vector inputs are mapped incorrectly.
  • Fix T61671: Too strong too dark text shadow in Blender Light theme.
  • Fix T61761: Randomize Transform is an object mode operator.
  • Fix T62112: Wrong curve face count.
  • Fix T62208: Constant detail picker not taking object scale into account.
  • Fix T62163: Duplicating particle system results in crash.
  • Fix T62202: Circle select does not work on hair points.
  • Refactor building the draw string for floats and ints (d617466).
  • Patch that allows displaying factors as percentages (D4462).
  • Found cause for T62210. Unfortunately applied wrong fix.
  • Went over old bug reports and closed 40+ that had too little information to reproduce the issue.

Functions

  • Mostly cleanup and small refactorings.
  • Further experiment with how to manage shared ownership.
  • Build LLVM IR for a function graph.
  • Allocate Tuple objects on the stack in C and LLVM IR.
  • Simplify node creation with automatic registration and automatic search menu.
  • New Function Points modifier that uses a function which outputs a list. This is mostly for testing purposes for non-trivial data types.
  • New "Append to List", "Get List Element" and "Combine Lists" node. They only work with Float Lists for now.

Week 24: March 11 - 15

  • Fix truncated text errors (T61300, T62594, T62678).
  • Fix T62614: Copy eevee settings when scene is copied.
  • Fix T58668: Misaligned text when editing multiple values.
  • Fix T61253: Wrong syntax highlighting when @ is used for multiplication.
  • Fix T62059: Driver not updating in Color Ramp.
  • Fix T59928: 'Radius' option does nothing when adding light probe.
  • New Option to display factors as percentages (107c94c3).
  • Remove functions from bgl docs, that don't exist anymore (D4280).
  • Produced a video showing my bug fixing process (YouTube).

Functions

Tried to find the right abstractions to allow for more complex socket declarations in nodes. I have a plan now, but still has to be implemented correctly. Examples for behaviors that should be supported:

  • Nodes that operate on lists adapt automatically based on what is connected.
  • Vectorized nodes that can switch between accepting lists and single values automatically.
  • Sockets that can accept any data type, but is still statically typed.
  • Variadic nodes that allow a dynamic amount of sockets (e.g. function input/output, but this is useful in many nodes).

Week 25: March 18 - 22

  • Fix T62587: Particle instances Use Count node saved correctly.
  • Fix T62636: Overlapping scrollbar in driver editor.
  • Fix T61226: Make hair editing (more?) thread safe.
  • Fix T62558: Certain IES file causes crash.
  • Fix T62758: Hair curves with UV mapped textures renders wrong.
  • Fix T62711: Incorrect motion path update.
  • Fix T62678: Better glyph clipping test.
  • Fix T62808: Hair shape cut crash.
  • D4553: Wrong user count after changing gpencil material.
  • D4563: Do not show full action range.
  • D4566: Incorrect context when selecting particles.

Functions

  • Unified socket declaration system.
  • More specialized automatic type inferencer.
  • New Pack List node (replaces "Append to List" and "Combine Lists").
  • Initial support for calling "subfunctions".
  • Custom search terms for nodes.
  • Initial body type for lazy input evaluation.
  • New Boolean type.
  • New Switch node that makes use of lazy input evaluation.

Week 26: March 25 - 29

  • Fix T62776: Face maps are initialized incorrectly.
  • Fix T62536: Incorrect context when selecting particles.
  • Fix T62958: Improve exponential easing formula.
  • Fix T62955: Missing panels in workbench engine.
  • Fix T62935: Missing tag when copying constraints.
  • Fix T62901: Bad handling of missing addon category.
  • Fix T63040: Resizing node has offset.
  • Fix T63015: Crash when using circle select tool in lattice edit mode.
  • Fix T63032: Increase camera properties precision in UI.
  • Fix idnames in addons after recent change (0f2207e).

Functions

  • Experimental lazy fgraph evaluation.
  • Manage execution stack and keep track of where functions come from.
  • Initial problems panel in node editor.
  • Use Blender's guarded allocator in more places.
  • Initial multipool allocator structure.
  • Wrap LLVM's IRBuilder to allow for cleaner code.
  • Utility functions to optimize and print generated code.
  • Refactor node declaration system.
  • Wrote some technical documentation for the stuff I've been working on in the last couple of weeks. Some topics are still missing, but that should give a good overview of the general architecture as it is right now.

Week 27: April 01 - 05

  • Fix T61830: Remove option to add new keymap item in search mode.
  • Fix T63256: Make Dupli Face was broken since there are collections.
  • Fix T60891: bgl docs still include deprecated opengl functions.
  • Fix T63000: Don't use original file name for autosave.
  • Started implementing a proposal for an Animation Editor Scrubbing Area (D4654).
  • Reviewed D4648: Fix T63227: import vertex colors from .ply file without alpha.
  • Reviewed D4601: Interface: New region type 'Footer', used by text editor.
  • Reviewed D4649: Cleanup: Replace deprecated finite with isfinite.
  • Reviewed D4479: Remember the last display mode in File Browser.
  • Reviewed D4629: Fix T62939: Incorrect cursor position when exiting UI slider.
  • Reviewed D4611: UI: Fix odd behavior in region sizing, simplify code.
  • Reviewed D4617: UI: Collapsed nodes have the same width as uncollapsed nodes.

Functions

  • Implement and use actual hash map/set instead of using linear search.
  • Support for vectorized nodes in the UI.
  • Generic automatic vectorization of functions.
  • New Vector Math node.
  • Splitup C API code into multiple files.
  • More robust node tree update after changes.
  • Simple cache to not build the same IR multiple times per module.
  • Support for reroute nodes.
  • Improve UI of Pack List node.
  • Simple operators to create function trees from modifier.

Week 28: April 08 - 12

This week was the "Homestretch Workshop" week, therefore there were a lot of meetings and less time for actual coding work.

  • UI: Do not show full action range (14e1a4e).
  • Refactor View2D number drawing (D4681).
  • Reviewed D4667: Fix add_search node operator to show custom nodes.
  • Reviewed D4479: Remember the last display mode in File Browser.

Functions

  • Implement MultiMap and ArrayRef data structure.
  • Experimented with some lazy non-recursive evaluation methods, but this still needs more work.
  • New Float Range node.

Week 29: April 15 - 19

  • Refactor View2D number drawing (7fdffd7).
  • Refactor boundbox handling of event handlers (D4705).
  • Refactor storage usage during fcurve modifier evaluation (81ce380).
  • Avoid autosave name collisions (5461a68).
  • Fix T63673: Wrong API documentation for Quaternion.dot(other).
  • Reviewed D4697: Incorrect poll methods in node category classes.

Functions

Week 30: April 22 - 26

  • Fix T63233: Set default blur kernel radius to 2.
  • Fix T63649: Action group expand setting for graph editor missing.
  • New BLI_NOINLINE macro (ea940bc).
  • Sequencer: Use Alpha Over blend mode by default (7c6c5b4).
  • UI: Simple confirm dialog when loading new file (ca41548).
  • Refactor: Allow event handlers to have a poll function (ea80264).
  • Refactor: Separate template selection from read_homefile operator (cfe9c7b).
  • Refactor: Separate scrollers from text drawing in API (D4747).
  • Refactor: Markers drawing (D4745).
  • Continued working on the Animation Editor Scrubbing Area (D4654).
  • Reviewed: New backdrop draw-callback for node editor (D4709).

Functions

  • Splitup DataFlowGraph into a dynamic DataFlowGraphBuilder and a very compact DataFlowGraph. This allows faster traversal of the graph for evaluation.
  • Initial unit tests or the function system. Still have to figure out how to link the tests correctly to be able to test everything.

The new data structure allowed me to implement a more efficient evaluation procedure with the following properties:

  • It uses no recursive calls.
  • It does no heap allocation in the common case (except when the tree depth is very large).
  • Support for lazy tuple calls (only calculate the inputs that are necessary).
  • Frees values that are no longer needed very early.
  • Copies are avoided in many cases by handing over ownership between nodes.
  • Very few hash map lookups (nodes and sockets are identified by an index in a long array in the new data structure).
  • Call stack information is maintained.

Week 31: April 29 - 03

  • Finished the animation editor scrubbing area (D4654).
  • Refactor: Support arbitrary y offset for channel list (fa59346).
  • Refactor: Grid and scale indicator text drawing (667af6c).
  • Reviewed D4759: A.N.T. Landscape addon broken after psutil API change.

Functions

  • Generate more readable IR by not calling hardcoded integer pointers directly but through a named wrapper function.
  • Automatic function vectorization using llvm.

Week 32: May 06 - 10

I only worked 2 days this week, but also found some time to work in the train.

  • UI: Animation editor scrubbing area (f2b7582).
  • Keymap: Special keymap for clip editor scrubbing area (c79fc71).
  • UI: Move scrollbars to the right in animation editors (3b9813f).
  • Experimented with multi-step-user-interaction-operators (D4829).
  • Reviewed D4844: Update io_anim_nuke_chan to 2.8.
  • Reviewed D4830: Timeline Playhead Scrubber.

Functions

  • Make it easier to build LLVM IR for common constructs like loops and if-then-else.
  • Make printf function easily accessible within LLVM IR for debugging purposes.
  • Start using ArrayRef in more places, as it really simplifies the code, avoids code duplication and reduces memory allocations.
  • Initial support for default values for auto-vectorized functions (necessary when one input list is empty).

Week 33: May 13 - 17

  • UI: Confirm dialog when closing an unsaved file (687385b).
  • UI: File Close Dialog (5ce3f69).
  • UI: Don't display markers in driver editor (86650b0).
  • Correct outliner width computation (D4887).
  • Fix T64721: Object Scatter addon broken after recent changes.
  • Fix T64634: Incorrect type casting in versioning code.
  • Interface: Callback to free popup arguments (c66a782).
  • Refactor: Simplify ID Property freeing (db51206, e608900).
  • BLI_memarena: Unpoison memory before freeing it (a7542b9).

Functions

  • Wrote some more comments for the C++ data structures in BLI.
  • New StringRef and StringRefNull class that can point to strings owned by another object (similar to ArrayRef).
  • Use StringRef and ArrayRef in many more places to decouple implementation details.
  • Remove Signature and Parameter classes. The data is now directly stored in the Function class.

Week 34: May 20 - 24

  • Fix T64776: Multiple close file dialogs.
  • Fix T64766: Use grid size from user preferences.
  • Fix T64941: Insert missing bpy. to access context after recent changes.
  • Fix T63443: Tool 'builtin_brush.draw' not found for space 'IMAGE_EDITOR'.
  • Fix T65071: Crash when selecting joined tracks.
  • GPU: Double uniform names buffer size (6f893d6).
  • BLI_memiter: unpoison memory before freeing it (aa02421).
  • Graph Editor: View-selected takes scrubbing and marker region into account (b03ee48).
  • Reviewed D4912: Update operator_modal_draw python template.

Functions

  • One cleanup pass over all new data structures.
  • Cache auto-vectorized functions.

Documents

This week I spent some time writing documents about various topics.

  • Guide for users on how to help triaging bugs (link).
  • Proposal for basic C++ data structures, that can be used in many places in Blender (link).
  • First steps towards making simulations "first-class" in Blender (link).
  • Patterns for how nodes can define their socket interfaces (link).
  • Proposal for how a particle system can be represented with nodes (link).

Week 35: May 27 - 31

I only worked on three days this week.

  • Fix T65080: Handle case when View2D has 0 scale.
  • Fix T65145: Draw curve draw tool settings in column.
  • Fix T65177: Camera frame visible in viewport render.
  • Fix T65275: Missing dereference.
  • Sequencer: Drag outside of sequence to initiate box select (8e125f2).
  • Sequencer: Fix box select using incorrect rectangles for sequences (f8f4318).
  • Outliner: Correct outliner width computation (a63ac42).
  • D4975: Click-drag in empty area to box select markers.
  • D4966: C++ data structures in BLI.

Week 36: June 03 - 07

  • API Docs: Fixed some examples (3a7af37).
  • Particles: Remove unused particle settings from UI (87fde57).
  • Python Templates: fix operator_mesh_uv template (54021da).
  • Dopesheet: drag to box select in dopesheet (b79976a).
  • Fix T65492: Make material slots popover wider.
  • NLA Editor: Drag in empty region to invoke box-select (8b1ca3e).
  • NLA Editor: Box-select was selecting wrong elements (7484ed9).
  • Fix T65303: Fix and improve autorun-scripts popup.
  • Graph Editor: Drag to box-select keyframes (04bac38).
  • Fix T65328: Offset when outliner gains focus.
  • Markers: Click-drag in empty area to box-select markers (ab5219a).

Functions Branch

  • Improve macros for functions that lazy-initialize data. The data is now freed before Blender's leak detection runs, avoiding false positives.
  • Started working on the new particle system. For now it is just be a modifier, that will hopefully change in the future.

Week 37: June 10 - 14

This week I almost exclusively worked on updating the Blender manual for 2.8. I worked on the following sections:

  • User Interface
  • Image Editor, UV Editor, Text Editor, Python console, Info Editor
  • Parts of Scene Layout
  • Physics
  • Compositing
  • Scripting
  • Compositor: fix linear feather falloff in dilate/erode node (abd2403).

Week 38: June 17 - 21

In the manual I updated the Forces section. Additionally, I updated all the screenshots in various sections, most notably for the compositor nodes. For that I developed a small script that automatically creates screenshots of all the nodes (Github Gist).

Most of the time this week was spent on a new particle system. The current state can be found in the functions branch. Note, that there is not really an UI yet. Instead there are just a few settings in the modifier that I use for testing. Some things I worked on this week:

  • Emitters: emit from point, curve and mesh surface.
  • Events: Initial generic event system for particles. So far there are two event types: Age Reached and Mesh Collision.
  • Multithreading: I already added initial multithreading support, because it is quite simple in the current design. Having it enabled will help make sure that nothing will break threadability.

Week 39: June 24 - 28

I took 1,5 days off during the week but worked some hours on the weekend. I worked almost exclusively on a new particle system this week. The general framework (particle container, event handling, ..) is in a fairly good shape now. So, I can start implementing some UI for it next week.

Notable changes:

  • The particle simulation can contain multiple types of particles.
  • An emitter can emit multiple types of particles.
  • New particles can be created when particles trigger certain events (e.g. age reached or mesh collision).
  • New Vector Adaptor data structure can be put on any memory buffer (the vector has a fixed max size).
  • New memory allocator that manages arrays of fixed lengths but with different element sizes.
  • Deletion of tagged particles is multithreaded now.
  • An event can generate information that can be used by the triggered action (e.g. to bounce off a surface).

Week 40: July 01 - 05

This week I worked on the new particle system almost all the time. Other than that I wrote the Shader Editor manual page and merged some small patches. As planned, I started implementing a node UI for the new particle system this week. I can show some of the WIP results next week.

Notable changes in the functions branch:

  • Some C++ API functions wrapping BLI_task.h to simplify threading code a bit.
  • Commented many important parts of the code: current internal particle system api, Type/Function/DataFlowGraph/FunctionGraph/... classes
  • New BParticles node tree type (this part is in Python).
  • New IndexedNodeTree structure that makes node tree related lookups more efficient (e.g. find neighbors or nodes with a specific bl_idname).
  • Tuples don't need to increment an atomic counter anymore, improving threadability.
  • Simplify construction of SmallVector instances from ListBase and keys/values of mappings.
  • Improved multi-map implementation, which now also supports small-object-optimization.
  • Initial nodes: point/mesh emitter, particle type, collision event, age reached event, kill particle, change direction, explode, gravity force, turbulence force, particle info.
  • Allow building a data flow graph from any node tree containing function nodes and data sockets.
  • Use the function system to compute inputs for actions when events happen.
  • Start generalizing how unlinked inputs in data flow nodes are converted to a data flow graph.
  • New monotonic allocator, and use it instead of more complex ones.

Week 41: July 08 - 12

I continued working on the new particle system, except for fixing one bug related to image saving.

Furthermore, I uploaded a video showing the current state of the system (Youtube).

Notable changes in the functions branch:

  • Simplify memory management using array allocator.
  • Parallelize distributing tetrahedons at particles.
  • Allow events to pass data actions following it.
  • Support specifying default values for input sockets.
  • Experimented with taking emitter velocity into account.
  • Lots of cleanup in the code that parses the node tree and produces the simulation description.
  • Very basic temporary caching system.
  • New Object socket type.
  • Particles have a size now.
  • Cache particle blocks for reuse.
  • Simplifications to the way particles are identified.
  • Support for running actions when new particles are born.
  • New StringMap type.
  • Testing a new approach to finding dependencies on objects statically.

Week 42: July 15 - 19

I started the week with a couple of hours on the bug tracker, mostly triaging bug reports that were created after RC1. Then I continued working on the particle system.

There is a new screen recording (Youtube).

Notable changes in the functions branch:

  • Initial custom emitter to test the concept.
  • Improve storage of previous object positions to interpolate them in a time step.
  • Functions can depend on the geometry of other objects now.
  • Store a color per particle.
  • Experimental Close By Points event.
  • Experimental Initial Grid emitter.
  • Introduce concept of Offset Handlers and create a Trail node using it.
  • Lots of cleanup and splitting up things into separate files.
  • Use another integrator when there are no forces acting on a particle type.
  • Show particle type names in nodes.

Week 43: July 22 - 26

I only worked for 3.5 days this week.

  • Reviewed D5333: Missing offset in markers names on current frame.
  • Fixed T67334: Blender does not exit after saving.
  • Wrote a document about some technical details of the new particle system (link).

Notable changes in the functions branch:

  • Data types of sockets correspond to socket type again.
  • New virtual node tree abstraction to simplify iteration over node trees and allow group-inlining more easily later.
  • Remove the "Small" prefix from many data structures.
  • Simplified how function bodies and type extensions are stored.
  • Improve error handling when invalid nodes are connected to certain inputs.
  • Expose collision info in separate node instead of in the event node.
  • Many input can be controlled per particle now.

Week 44: July 29 - 02

Notable changes in the functions branch:

  • More generic input providers for functions that are evaluated per particle.
  • Add some more particle attribute types.
  • Give particles a unique ID on creation.
  • New color socket type and Change Particle Color node.
  • Support compiling particle functions down to machine code.
  • New data graph builder providing better performance and functionality in less code.
  • Support for loading socket values only once instead of in every execution.
  • Initial texture color access after collision event.
  • Experimented with ways to group unlinked input sockets to reduce overhead.

Week 45: August 05 - 09

This week I only worked for three days.

  • Worked one day on the bug tracker triaging ~50 reports.
  • Wrote an new document that presents an updated particle system UI.

Notable changes in the functions branch:

  • Did some cleanup in blenlib.
  • Fixed a bug some users had with the node search.
  • Reimplemented the way lists with in functions.

Week 46: August 12 - 16

My main task for this week was to gather feedback on the particle nodes proposal. Furthermore, I thought about how to solve different problems that were brought up on devtalk. Next week, I'll present another updated proposal.

Created three new tasks:

  • Steps to get particle nodes into Blender 2.82 (T68636).
  • Math with Nodes (T68734).
  • Node Group Inputs (T68733).

Notable changes in the functions branch:

  • Do not reference count types.
  • Merged some patches that implement new math operations.
  • Simplify the way attributes are stored.
  • New Map, Set and SetVector implementation.

Week 47: August 19 - 23

  • I uploaded an updated particle nodes UI proposal. After some discussion I started updating the implementation.
  • RNA: Cleanup PointerRNA struct (a1aa4a2).
  • UI: Remove "Show Frame Indicator" option (ec07340).
  • Timeline: refactor cache drawing (34921e9).
  • Fix T68951: Incrementing int property causes overflow.
  • Memory: Fix guarded aligned malloc with small alignment (f2cab82).

Notable changes in the functions branch:

  • Started implementing the updated proposal.
  • Various cleanups and improvements for blenlib.

Week 48: August 26 - 30

I only worked three days this week.

  • Blenlib: New ArrayRef data structure (D5592).
  • Helped reviewing the shading nodes gsoc code.

Changes in functions branch:

  • Removed some abstractions that are not useful anymore.
  • Changed how the world state is tracked (e.g. to handle moving emitters).
  • Initial string socket type.
  • Initial support for vertex groups in mesh emitter to control the density.

Week 49: September 02 - 06

  • Wrote an addon for Andy (Github).
  • Mesh Batch Cache: Fix threading issue (05721cd).

Changes in functions branch:

  • Access surface data in mesh emitter action.
  • Improved Change Velocity node.
  • Initial variation input for Age Reached Event node.
  • New Change Size node.
  • New node to access vertex weights at emission or collision position.
  • Take face area into account in mesh emitter.
  • Support for selecting the uv map by name when accessing texture information on a mesh surface.
  • Initial Size Over Time node.
  • Initial Falloff implementation with new Constant and Point Distance Falloff nodes.
  • New BParticles Output modifier that can be used to splitup the simulated particles into multiple objects.

Week 50: September 09 - 13

This week the first code from the functions branch was committed to master, only generic C++ libraries though. In particular, the following data structures have been merged: Array, ArrayRef, MutableArrayRef, Set, VectorSet, Map, StringMap, StringRef, Vector, Stack and IndexRange.

Changes in the functions branch:

  • Updated attribute block storage which is in blenkernel now.
  • New Drag Force node.
  • Multiple density modes in Mesh Emitter node.
  • Project and Dot Product operation in vector math node.
  • Experiments with a mesh force node.
  • Initial Mesh Distance Falloff node.
  • Tested a BitArrayRef implementation.
  • New Custom Event node.
  • New Change Particle Position node.
  • Use falloff in Turbulence Force node.
  • Initial Always Execute node.
  • Tested new NamedTupleRef abstraction.
  • Changed naming from Particle Type to Particle System.

Week 51: September 16 - 20

Monday and Tuesday I mostly worked on the particle system to get it into a state that can be presented to the team. Wednesday, I made presented the current state of the particle system to the team in two 90 minute sessions. The remaining time on Wednesday, Thursday and Friday I worked on the bug tracker.

  • Outliner: Add descriptions to outliner.object_operation (D5852).
  • Fix T70060: Add bgl wrapper for glVertexAttribIPointer
  • Fix T70101: Displace modifier handles empty vertex group incorrectly
  • Reviewed and merged some smaller patches (D5847, D5744, D5716).

Changes in the functions branch:

  • Improved error handling when connecting wrong sockets.
  • More centralized ownership of many parts to allow for optimizations in the future.
  • Simplified adding a new particle simulation from the add menu.
  • New Execute input for Initial Grid and Point Emitter.
  • Added some node mockups (can be activated in the n panel).
  • Added missing nodes to the add menu.
  • New particle randomness input.
  • Improved collision detection with moving meshes.
  • Initial particle group implementation.

Week 52: September 23 - 27

Took two days off.

  • Fix T70101: Displace modifier handles empty vertex group incorrectly.
  • Fix T70177: Crash when calling to_track_quat() without arguments.
  • Uploaded a video showing some particle nodes (Youtube).

Changes in the functions branch:

  • Replace Falloff with weight input for more flexibility.
  • Various improvements in the functions system (e.g. improved ownership handling).

Week 53: October 14 - 18

  • Fix T70605: Incorrect darken and lighten rgb mix mode.
  • General bug tracker work.
  • Learned the basics of how to use the Thread Building Blocks library. That might become useful to do more efficient multithreading for particle nodes.
  • Wrote a document outlining the current core concepts for a node based particle system (link).

Right now I'm actually not working in the functions branch, but in the "functions-experimental-refactor" branch. The reason for that is that I want to do a major refactoring without breaking the current builds. Those can be used to play with the new system already. The goal of the refactor is to allow for more powerful particle functions and to increase the throughput when evaluating functions.

Week 54: October 21 - 25

Besides more refactoring work, this week was mostly covered by the Blender Conference.

Week 55: October 28 - 01

  • Object Scatter: new Use Normal rotation option (dbfabe3).

This week I continued to work on the refactoring. I'm almost done implementing the core structures for generic type handling and efficient function evaluation.

Next week I want to finish the refactor and delete the code that has been replaced. After that I will start working on features for the particle nodes system again.

Week 56: November 04 - 08

Finished the refactor I worked on the last couple of weeks. The old function system has been removed and the new code is now merged into the functions branch. The particle system has been updated to use the new system. I also updated the math nodes to test the approach explained in T68734. Furthermore, I started a design topic on data type names in T71384.

Next week I will work on features that affect users more directly again.

Week 57: November 11 - 15

  • Spent some time studying other particle nodes systems.
  • Changed the way forces work in bparticles. Instead of having individual force nodes, there is only one that takes a vector input now.
  • New Perlin Noise node.
  • New Closest Point on Object node.
  • Initial node groups implementation. Only works with data sockets for now. I continue to work on this next week.
  • General ongoing refactoring and experimentation in various parts of the code.

Week 58: November 18 - 22

I spent most of this week testing different ways to handle node groups of function/particle nodes internally. I tried a couple of different approaches, but most failed in one aspect or another. I ended up using the group-inlining strategy that is used for materials as well. However, I remember the where every inlined node comes from and handle unlinked group inputs differently. I'm not entirely done implementing this approach yet, so I'll continue to work on it next week.

As byproduct of this weeks work, I cleaned up quite some code again and added some utility functions on blenlib data structures. Lastly, I implemented a simple Dot file export library to be able to write graph visualizers more easily. I was going to write a dot exporter for the 4th time this week, so it was about time to make this a bit easier.

Week 59: November 25 - 29

  • Bought, built and setup my new workstation.
  • Reviewed D5827: Interpolation node.
  • Reviewed D5957: Additional math node functions.
  • Reviewed D5473: Add pressure forces to cloth sim.
  • Studied node systems in other software a bit more.
  • Improved the dot export library.
  • Started using the inlined node tree structure I developed last week.
  • Started experimenting with a persistent Surface Locations concept. This will allow e.g. particles to reference their birth position on a mesh and stick to it when the mesh moves.

Week 60: December 02 - 06

  • Reviewed D5788: Add ability to create internal springs to the cloth sim.
  • Experimented more with "Surface Hooks". Seems to work quite well so far.
  • One can access the position, normal, vertex weight and image colors at surface hooks now.
  • Execute and Influence sockets work in node groups now.
  • Experimented using a new IDHandle data structure. It's a handle to a Blender ID data-block that can be stored per particle more safely.
  • Simplified a bunch of particle node tree parsing code.
  • Improved node group user experience. There is a new (maybe temporary) shortcut V, that helps managing the node group interface.
  • Implemented a function evaluation optimization that reduces the amount of unnecessary computation (e.g. when some math node does not depend on any particle attribute).

Week 61: December 09 - 13

  • Optimized evaluation of math nodes.
  • Initial support custom particle attributes.
  • Initial Custom Emitter node.
  • New simple (internal) class ID system, to compare c++ types.
  • Vectorized and optimized various nodes that work with surface hooks.
  • New Emitter Time Info node.
  • New Sample Object Surface node with support for density control with vertex weights.
  • New Get List Elements node.
  • New Find Non Close Points node.
  • Fix crash when using Trails or Explode node with a single particle system (still need a better warning system).
  • New Select node (more general Switch node).
  • Extended the CPPType class with more functions that I use a lot.

Week 62: December 16 - 20

  • New Random Floats node.
  • New Random Vector node.
  • New Random Vectors node with multiple sampling methods.
  • New Vector from Value node.
  • New Multiply Vector with Value node.
  • New start-stop mode in Float Range node.
  • New Spawn Particles node.
  • New Join Text List node.
  • Made node groups look more similar to builtin nodes.
  • Support for removing execute sockets.
  • New (internal) IndexMask class that replaces the use of ArrayRef<uint> in many places.
  • Replaced many builtin nodes with groups.
  • Support for opening/closing groups with Tab.
  • Automatically show node groups from nodelib directory in the node search.
  • New Node Instance Identifier node. It outputs different identifier for this node when it is used in a group which is used multiple times.
  • Started using TBB (Intels Thread Building Blocks) in some places.

Week 63: December 23 - 27

This week I took two days off and was sick a couple of days. I did some work on the bug tracker and fixed some minor issues in the functions branch.

Week 64: December 30 - 03

  • Fix T72682: Regression when moving markers while holding ctrl.
  • Fix T72423: Incorrect tooltips in curve profile layout.
  • Some more generic bug tracker work.
  • Created some simple c++ wrappers for TBB to simplify multithreading in some cases.
  • Every particle attribute is now stored in a continuous array after the simulation, instead of being chunked in multiple smaller arrays. This makes many operations easier.
  • Parallelized more parts of the simulation.
  • New StringMultiMap data structure which maps strings to an array of values.
  • Changed how the function network is generated based on the node tree.
  • Implemented initial constant folding after the function network has been generated.

These changes are mostly internal. Their goal was to achieve better performance and to allow for new features like access to attributes of other particle systems. Furthermore, I'm also still brainstorming about how we could integrate the particle system with other simulation systems in the future, but I do not have a fully satisfying solution yet.