Nodes Module
      • Sharing URL Link copied
      • /edit
      • View mode
        • Edit mode
        • View mode
        • Book mode
        • Slide mode
        Edit mode View mode Book mode Slide mode
      • Customize slides
      • Note Permission
      • Read
        • Owners
        • Signed-in users
        • Everyone
        Owners Signed-in users Everyone
      • Write
        • Owners
        • Signed-in users
        • Everyone
        Owners Signed-in users Everyone
      • Engagement control Commenting, Suggest edit, Emoji Reply
    • Invite by email
      Invitee
    • Publish Note

      Share your work with the world Congratulations! 🎉 Your note is out in the world Publish Note

      Your note will be visible on your profile and discoverable by anyone.
      Your note is now live.
      This note is visible on your profile and discoverable online.
      Everyone on the web can find and read all notes of this public team.
      See published notes
      Unpublish note
      Please check the box to agree to the Community Guidelines.
      View profile
    • Commenting
      Permission
      Disabled Forbidden Owners Signed-in users Everyone
    • Enable
    • Permission
      • Forbidden
      • Owners
      • Signed-in users
      • Everyone
    • Suggest edit
      Permission
      Disabled Forbidden Owners Signed-in users Everyone
    • Enable
    • Permission
      • Forbidden
      • Owners
      • Signed-in users
    • Emoji Reply
    • Enable
    • Versions and GitHub Sync
    • Note settings
    • Engagement control
    • Transfer ownership
    • Delete this note
    • Insert from template
    • Import from
      • Dropbox
      • Google Drive
      • Gist
      • Clipboard
    • Export to
      • Dropbox
      • Google Drive
      • Gist
    • Download
      • Markdown
      • HTML
      • Raw HTML
Menu Note settings Versions and GitHub Sync Sharing URL Help
Menu
Options
Engagement control Transfer ownership Delete this note
Import from
Dropbox Google Drive Gist Clipboard
Export to
Dropbox Google Drive Gist
Download
Markdown HTML Raw HTML
Back
Sharing URL Link copied
/edit
View mode
  • Edit mode
  • View mode
  • Book mode
  • Slide mode
Edit mode View mode Book mode Slide mode
Customize slides
Note Permission
Read
Owners
  • Owners
  • Signed-in users
  • Everyone
Owners Signed-in users Everyone
Write
Owners
  • Owners
  • Signed-in users
  • Everyone
Owners Signed-in users Everyone
Engagement control Commenting, Suggest edit, Emoji Reply
  • Invite by email
    Invitee
  • Publish Note

    Share your work with the world Congratulations! 🎉 Your note is out in the world Publish Note

    Your note will be visible on your profile and discoverable by anyone.
    Your note is now live.
    This note is visible on your profile and discoverable online.
    Everyone on the web can find and read all notes of this public team.
    See published notes
    Unpublish note
    Please check the box to agree to the Community Guidelines.
    View profile
    Engagement control
    Commenting
    Permission
    Disabled Forbidden Owners Signed-in users Everyone
    Enable
    Permission
    • Forbidden
    • Owners
    • Signed-in users
    • Everyone
    Suggest edit
    Permission
    Disabled Forbidden Owners Signed-in users Everyone
    Enable
    Permission
    • Forbidden
    • Owners
    • Signed-in users
    Emoji Reply
    Enable
    Import from Dropbox Google Drive Gist Clipboard
       owned this note    owned this note      
    Published Linked with GitHub
    Subscribed
    • Any changes
      Be notified of any changes
    • Mention me
      Be notified of mention me
    • Unsubscribe
    Subscribe
    # Post BCON22 Workshop https://devtalk.blender.org/t/2022-10-31-geometry-nodes-post-bcon22-workshop/26491 ## Things * Simulation * Loops/Repeat * Asset containers * Node tools * Node operators * Procedural hair * Asset integration * Automatic caching * Freeze caching * Geometry Object * Time caching * Viewer node follow-up * Spreadsheet editing original data * Import nodes * Selection for procedural modeling * Dynamic socket count * Dynamic socket types * Usability topics ## Spreadsheet Editing * Selection * Only in modes that visualize the selection in the viewport (edit mode, weight paint, etc.) * Sync selection with viewport * Selection is displayed as a color * Active * Display the active element with the active color * Data * Editable in all modes * _Easy to tell what original means if you can always edit it_ * Display * In original mode, display derived data grayed out (normals, more in the future) ## Import Nodes * String socket file path subtype * Alembic * File string input * (Optional) object path * Frame input * Geometry output * New instance type (Alembic instance) * Validate meshes * OBJ * Validate meshes input * STL * USD * More options * CSV * Creates a point clouds * Also creates an instance because... ## Procedural Hair Workflows * Two basic questions * What new building blocks are needed to build the high level groups? * What high level group do we use to replace the building block? * Guide curve workflow * Like children in the particle system * Technically possible in the current system but very limited * Interpolating positions is possible, but affecting all attributes is impossible currently. * The density brush is similar to the children creation * Sample curve node (already finished) * "Ignore self" in proximity sampling * Needed generally but also sounds useful here * Something like "Use 2nd closest point" * UVs and surface object should be more easily accessible * High level groups * Clump * Scatter/Children * Frizz * Curl * Group index idea is important for interpolation * Parting and clumping should be index/id based * Distribution on the undeformed source mesh * Accessing the original geometry may be important * The rest positition attribute gives more control * Creation of curves inside a "tube" mesh * The algorithm isn't clear yet * The topology would be a tube but the deformation could be arbitrary * Maybe the ring index could be an attribute to make the topology clearer ## Attribute Editing * Mesh, curves, and point clouds * Edit mode * Use case is as an input for procedural generators * Miscellaneous features like randomize attributes, etc. * Operators act on the active attribute * All attributes are displayed for the active element in the viewport sidebar "Attributes" panel * For multiple selection * The buttons/sliders "offset" the mean value * Operator to set all selected elements to a value (prefilled with active value) * Attribute overlay for active attribute * Drawing edge attributes * Thick wireframe drawing like seams, bevel weights, etc. * Gizmos to edit original data (for later) * Checkboxes for booleans * For vectors: directions, offsets, etc. * Rotation gizmos * Connects to the node tools project a bit * Attribute paint modes * Artistic paint mode * Supports meshes * Point and corner domain and color types and float attributes/textures * Sculpt color implementation should apply to any attribute type (within reason) * Technical paint mode * Supports meshes, curves, points * Supports any domain and any type with special tools for some types, also supports textures * In between edit mode and the more artistic painting currently in sculpt mode * Choose a value of any type and paint it directly * More advanced painting * Flow maps * Face set interaction like sculpt mode * An option on the attribute chooses whether it shows in the more artistic mode * Paint canvas * Texture canvas * Choose between a list of all textures associated with an object * The canvas can be sourced from (1) material + layer stacks; (2) modifiers; (3) attributes * The source is used for filtering and visual clues * Embrace syncing the active texture between the node editor and the paint modes * Make setting the active texture canvas active an explicit action * UV is set per layer stack, or sourced automatically from the node texture * Multi-object texturing * Painting on the same texture across multiple objects * Bleeding should be smart about other users of the same texture ## Dynamic Socket Type * Initial type is "Unassigned", no values are shown for the dynamic sockets. * Dynamic sockets can be chained, preserving its unassigned type. * The first time a type is connected to a socket, the type is set for good * To set it to a different type go to node options or context menu * To reset to *Unassigned*, first disconnect the sockets then go to node options or context menu * Don't show the type option in the node by default * Have it in the node options * Optionally also in the context menu * Dynamic sockets are ignored in the modifier UI * It needs a design for how it looks when unassigned (e.g. rainbow) * When assigned they look like regular sockets and maybe when assigned (so users know they are dynamic) ## Dynamic Socket Count * Designed to allow encapsulation of complex behavior in a flexible way * Sockets are grouped together in clusters * The last entry in the cluster is like the group input/output sockets and makes a new connection * "Udon" noodles pass multiple sockets at the same time * It's basically a list of sockets of different types * Udons can be exposed to the group output as one of the inputs to the cluster * Corresponding inputs and outputs are aligned * Builtin nodes like capture, sampling, raycast, etc. * For group nodes, the alignment would happen whenever Blender can figure out that the mapping is clear * Join node * Joining attributes currently requires the hack of adding them later * Option 1 * Cluster socket of multi-input sockets * Requires ugliness for matching the order between multi-input sockets * Option 2 * Cluster of clusters that each contain the same socket types * Option 3 * Join in a separate node * Currently unresolved * Multi-input socket * Technically redundant now, though more elegant on a UI level * The join node might have to move away from multi-input sockets ## Simulation * Physics vs. simulation * Simulation is mostly about retrieving data from the previous frame * Physics is a subset of simulation, with specific solvers for physical phenonema * Global vs. local * Local is a single object * If we start with a local case, it should extend to the local case without completely changing the design * Local simulation design * Simulation input and output nodes * _People do so much with the currently available tools that just giving access to the previous frame's data would make so much possible_ * The design could be similar to the repeat loop design, but we need nested loops, not necessarily nested simulations. * Simulation input and output nodes control the simulation * Restricting simulation input and outputs * There is no reason to restrict inputs * For inputs that are only evaluated on the first frame, the simulation input node is used. * Outputs can only be connected through the simulation output, for improving the subframe workflow * Time * Simulation input node has an output for the time delta since the last evaluation * Scene time * Time of the animation system, tied to the scene * Simulation time * For the interactive mode, separate from the scene time * Specific per object * If you only need the delta, the absolute value isn't necessary * Simulation input node * Inputs * All inputs are evaluated only once at the start of the simulation * "Run" (True by default) * Outputs * All inputs but "Run" * Delta Simulation Time * Elapsed Simulation Time * Simulation output node * Inputs * All inputs but "Run" * A "Stop" value that breaks the simulation until the simulation clock is restarted * Output * All inputs but "Run" * "Simulation started" * "Simulation ended" * Elapsed Simulation time * Run and stop * The simulation still caches the final step on which the stop was set * The simulation always pass the final cached step * When the "Run" hasn't been on yet, the simulation pass the input data through * When the "Stop" is on, the simulation pass the final cached step * Cache * We cache on modifier similar to existing physics systems * We may version it to move the cache to a simulation datablock later * The caching itself (its data format) will focus on performance * It may even use .blend files for that * Because subframe mixing requires mixing between cached frames, it is impossible to pass links directly out of the simulation without connecting to the simulation output node. * Frame UI * The goal is to make it clear that links cannot pass out of the simulation, but they can pass in. * All simulation nodes go inside of a frame * On each side of the frame there are sliding input/output nodes with the simulation state sockets * ![](https://i.imgur.com/HvpFVL5.jpg) ## Automatic Caching * Anonymous attributes * Outputs can't depend on whether other outputs are needed * Higher level way of determining when anonymous attributes should be propagated * Anonymous attribute names derived from the compute context * Force the deletion of anonymous attributes when leaving geometry nodes * Heuristic for what to cache * One idea is that each thread would cache arbitrary data after a certain amount of time passed * A simpler node-based idea is to cache a node's output when it took a certain amount of time * Finding a good heuristic will require more testing * Detecting changed inputs * Compute a "proxy value" for each input, which is like a hash. Generally they shouldn't change when the data has changed, but it's okay when they do. * Propagate the proxy values through the node tree, mixing them together to determine when they changed from the cached value * Next steps * Anonymous attribute static analysis, making anonymous attribute handing more functional ## Freeze Caching * Also requires anonymous attribute static analysis for improved usability * Without the "edit mode node" functionality, the feature is relatively simple * When geometry is frozen, it is saved in the file by the modifier * Requires saving and loading non-main meshes * Anonymous attribute handling * The node tree automatically freezes fields used with the frozen geometry as necessary * Those fields are automatically populated in the checkpoint node and connected to their original nodes * The node has datablock slots for the different domains * The datablocks inside a nodetree are exposed in the modifier "Internal Depedencies" list * This node is used for the primitive objects (e.g., Cube) ## Geometry Object * _Related to Freeze Caching_ * All the geometry-related types are unified as a " Geometry" type * In the object panel there is a list of geometry slots * The list is read-only, based on the node-trees * Only one geometry can be active, and this is used to determine the available modes and panels (e.g., UV) ## Usability * Gesture operator to create capture attribute node like the mute or cut operators * If a geometry link is included, it is used, otherwise there is no geometry connected * In the toolbar and possibly as a shortcut * Field connection visualization * While dragging a field, differentiate sockets that lead to an evaluation in a non-compatible context (don't contain all necessary attributes) * Graying out sockets and links is preferrable over highlighting since many sockets would be highlighted * Field evaluation context inspection/visualization * In tooltips for field sockets, show information for evaluation contexts * Domain and the kind of context * Field input warnings * Vizualizing the context * Visualize the nodes that the field is evaluated in (and optionally the geometry socket) * Visualize the path to those nodes and sockets * Triggered explicitly by an operator or socket selection or delayed on a hover * Possibly toggled as an overlay option * Visualizing evaluation on sample nodes * Node panels can give a visual suggestion for many nodes * Organized in the node group sockets list as a tree * No header or dropdown in many cases, just a common background color or separate to group related sockets * Interpolate domain naming * It sounds like it's interpolating to the domain that's selected but that's not what it's doing * It used to be called "Field on Domain" which was clearer. "Evaluate on Domain" is better. * Add menu * Just start typing to open the search * Add multiple ways to access nodes with different properties in search * The add menu should use submenus more * Focus on searching ## Node UI * Subpanels * _Rational is keeping direct/immersive interaction but providing better grouping and hiding away unnecessary sockets_ * _The idea is to give users the framework Blender uses, with constraints if needed_ * Subpanels can be used for outputs and inputs * By default they can be expanded or collapsed * Subpanels are organized by a tree view in the sidebar * If a subpanel is closed but a socket is linked, it is still displayed but with no text * We need to collect use cases to map out the final solution * Hiding sockets * _Rational is clearing up the UI to the point where you have exactly the parameters exposed that you want to control_ * When every socket in a panel is hidden, the panel is hidden as well * Add a bar to the bottom of sockets to roll/unroll the node ## Math Nodes * Split up the math node a bit. The ideal segmentation is arbitrary. * We don't want to use a node per operation because that makes switching more complicated, but the current math node has too many responsibilities. * Math node * Does generic math operations * Uses dynamic types * Vector math * Only does operations that make sense on vectors * Compare node * Dynamic type, generic or type-specific comparison operations * Needs more discussion ## Preview Node * Currently the evaluator always calculates the output even if it isn't visible in the UI * The depsgraph doesn't know about the UI currently, but it should be able to skip evaluation when the result isn't visible * Take UI visibility into account for the depsgraph * A more manual solution is "pausing" evaluation, which is related to cancelling * A patch currently works on Linux, but the Blender needs to be okay when the evaluated state doesn't match the expectation ## Enum Sockets * Requires dynamic socket type * Design focuses on an "Menu Switch" node which is used to define the enum options in the sample place it switches * Has an enum selector and inputs for each option where the names are defined * Adding another enum is part of the node, it is not an udon * Sockets are called "Menu sockets" * To add and name the sockets users go to the node options * ![](https://i.imgur.com/4XzgkzJ.jpg) ## Comments * Comment node * Options for transparency * Edit the text directly in the node editor * It might be helpful to attach it to nodes * Resizable in all directions ## Loops * Serial Loops (Repeat Loops) * Very similar to the simulation design * Max iteration count input, current iteration is passed to the inside * "Stop" output on the inside to allow stopping iteration early, also outputted to the outside. * Debug iteration index in the UI for socket inspection and viewer nodes * It may make sense to add a switch to disable logging completely * Parallel Loops * Very similar to the serial loop * Two modes: count; elements * Count: * Input Input: Count * Input Output: Index * Output Input/Output: Geometry * Elements: * _The geometry is separated into groups_ * Option: Domain * Input Input: * Geometry * Geometry ID (fallback Index) * Selection * Input Output: * Loop Index * Loop Geometry * Output Input/Output: Geometry

    Import from clipboard

    Paste your markdown or webpage here...

    Advanced permission required

    Your current role can only read. Ask the system administrator to acquire write and comment permission.

    This team is disabled

    Sorry, this team is disabled. You can't edit this note.

    This note is locked

    Sorry, only owner can edit this note.

    Reach the limit

    Sorry, you've reached the max length this note can be.
    Please reduce the content or divide it to more notes, thank you!

    Import from Gist

    Import from Snippet

    or

    Export to Snippet

    Are you sure?

    Do you really want to delete this note?
    All users will lose their connection.

    Create a note from template

    Create a note from template

    Oops...
    This template has been removed or transferred.
    Upgrade
    All
    • All
    • Team
    No template.

    Create a template

    Upgrade

    Delete template

    Do you really want to delete this template?
    Turn this template into a regular note and keep its content, versions, and comments.

    This page need refresh

    You have an incompatible client version.
    Refresh to update.
    New version available!
    See releases notes here
    Refresh to enjoy new features.
    Your user state has changed.
    Refresh to load new user state.

    Sign in

    Forgot password

    or

    By clicking below, you agree to our terms of service.

    Sign in via Facebook Sign in via Twitter Sign in via GitHub Sign in via Dropbox Sign in with Wallet
    Wallet ( )
    Connect another wallet

    New to HackMD? Sign up

    Help

    • English
    • 中文
    • Français
    • Deutsch
    • 日本語
    • Español
    • Català
    • Ελληνικά
    • Português
    • italiano
    • Türkçe
    • Русский
    • Nederlands
    • hrvatski jezik
    • język polski
    • Українська
    • हिन्दी
    • svenska
    • Esperanto
    • dansk

    Documents

    Help & Tutorial

    How to use Book mode

    Slide Example

    API Docs

    Edit in VSCode

    Install browser extension

    Contacts

    Feedback

    Discord

    Send us email

    Resources

    Releases

    Pricing

    Blog

    Policy

    Terms

    Privacy

    Cheatsheet

    Syntax Example Reference
    # Header Header 基本排版
    - Unordered List
    • Unordered List
    1. Ordered List
    1. Ordered List
    - [ ] Todo List
    • Todo List
    > Blockquote
    Blockquote
    **Bold font** Bold font
    *Italics font* Italics font
    ~~Strikethrough~~ Strikethrough
    19^th^ 19th
    H~2~O H2O
    ++Inserted text++ Inserted text
    ==Marked text== Marked text
    [link text](https:// "title") Link
    ![image alt](https:// "title") Image
    `Code` Code 在筆記中貼入程式碼
    ```javascript
    var i = 0;
    ```
    var i = 0;
    :smile: :smile: Emoji list
    {%youtube youtube_id %} Externals
    $L^aT_eX$ LaTeX
    :::info
    This is a alert area.
    :::

    This is a alert area.

    Versions and GitHub Sync
    Get Full History Access

    • Edit version name
    • Delete

    revision author avatar     named on  

    More Less

    Note content is identical to the latest version.
    Compare
      Choose a version
      No search result
      Version not found
    Sign in to link this note to GitHub
    Learn more
    This note is not linked with GitHub
     

    Feedback

    Submission failed, please try again

    Thanks for your support.

    On a scale of 0-10, how likely is it that you would recommend HackMD to your friends, family or business associates?

    Please give us some advice and help us improve HackMD.

     

    Thanks for your feedback

    Remove version name

    Do you want to remove this version name and description?

    Transfer ownership

    Transfer to
      Warning: is a public team. If you transfer note to this team, everyone on the web can find and read this note.

        Link with GitHub

        Please authorize HackMD on GitHub
        • Please sign in to GitHub and install the HackMD app on your GitHub repo.
        • HackMD links with GitHub through a GitHub App. You can choose which repo to install our App.
        Learn more  Sign in to GitHub

        Push the note to GitHub Push to GitHub Pull a file from GitHub

          Authorize again
         

        Choose which file to push to

        Select repo
        Refresh Authorize more repos
        Select branch
        Select file
        Select branch
        Choose version(s) to push
        • Save a new version and push
        • Choose from existing versions
        Include title and tags
        Available push count

        Pull from GitHub

         
        File from GitHub
        File from HackMD

        GitHub Link Settings

        File linked

        Linked by
        File path
        Last synced branch
        Available push count

        Danger Zone

        Unlink
        You will no longer receive notification when GitHub file changes after unlink.

        Syncing

        Push failed

        Push successfully