Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Conversation

@Soullnik
Copy link

Overview

This PR integrates Babylon.js Solid Particle System (SPS) into the Node Particle Editor, enabling users to create and manage SPS-based particle systems through a visual node graph interface. This brings the power of SPS (instanced rendering, shape-based particles) to the node-based workflow.

Important Note

This is a proposal for discussion and requires future refactoring. The current implementation is created for community discussion as I don't have sufficient knowledge of the node ecosystem architecture. The goal is to gather feedback on the best approach for integrating SPS into the existing node graph system.

Features Added

1. SPS Node Graph Integration

  • SPSSystemBlock: Main SPS system node for managing particle systems
  • SPSCreateBlock: Node for defining particle shapes and counts
  • SPSInitBlock: Node for particle initialization logic
  • SPSUpdateBlock: Node for particle update logic
  • SPSMeshSourceBlock: Node for mesh shape sources (Box, Sphere, etc.)

Technical Implementation

Core SPS Blocks:

// SPSSystemBlock - Main SPS system
public createSystem(state: NodeParticleBuildState): SolidParticleSystem

// SPSCreateBlock - Particle shape definition
public _build(state: NodeParticleBuildState): ISPSCreateData

// SPSInitBlock - Particle initialization
public _build(state: NodeParticleBuildState): SPSUpdateData

// SPSUpdateBlock - Particle updating
public _build(state: NodeParticleBuildState): SPSUpdateData

// SPSMeshSourceBlock - Mesh shape sources
public _build(state: NodeParticleBuildState): Mesh

Usage Example

// Create SPS system with multiple particle types
const spsSystem = new SPSSystemBlock("SPS System");
const createBox = new SPSCreateBlock("Create Box Particles");
const createSphere = new SPSCreateBlock("Create Sphere Particles");

// Connect multiple particle sources
createBox.solidParticle.connectTo(spsSystem.solidParticle);
createSphere.solidParticle.connectTo(spsSystem.solidParticle);

// Add mesh sources
const boxMesh = new SPSMeshSourceBlock("Box Mesh");
const sphereMesh = new SPSMeshSourceBlock("Sphere Mesh");
boxMesh.mesh.connectTo(createBox.mesh);
sphereMesh.mesh.connectTo(createSphere.mesh);

Current Challenges & Seeking Solutions

1. Multiple Connection Architecture (Incomplete)

Challenge: SPS requires multiple SPSCreateBlock inputs to one SPSSystemBlock.
Current Implementation:

  • Added allowMultipleConnections flag
  • Implemented connectedPoints array to store multiple connections
  • Modified NodeParticleBlock.build() to traverse all connected blocks
    Issues:
  • Visual representation of multiple connections is not fully working
  • Graph editor doesn't properly display all connections
    Question: What's the best architectural approach for handling multiple input connections in the node graph system?

Questions

  1. Multiple Connections Architecture: What's the best pattern for handling multiple inputs in the node graph system?

  2. SPS Integration: Are there any SPS-specific considerations we should be aware of the implementation?

  3. Future Extensibility: How can we make this system more extensible for other particle system?


The main goal is to bring SPS capabilities to the node-based workflow. Looking forward to feedback on the integration approach and suggestions for better solutions to the identified challenges!

Mikalai Lazitski added 9 commits October 10, 2025 19:53
This commit introduces several new blocks for the Solid Particle System (SPS) in the Node Particle Editor, enhancing the particle system capabilities. The following blocks have been added:

- SPSMeshSourceBlock: Defines the mesh shape for SPS.
- SPSCreateBlock: Creates an SPS with a base mesh.
- SPSSystemBlock: Configures the Solid Particle System.
- SPSInitParticleBlock: Initializes the update function for a specified range of particles.
- SPSUpdatePositionBlock: Updates the position of particles.
- SPSUpdateRotationBlock: Updates the rotation of particles.
- SPSUpdateScalingBlock: Updates the scaling of particles.
- SPSUpdateColorBlock: Updates the color of particles.
- SPSUpdateVelocityBlock: Updates the velocity of particles.
- SPSPhysicsBlock: Applies physics to particles.
- SPSGetParticlePropertyBlock: Retrieves properties of particles.

Additionally, the NodeParticleBuildState has been updated to include SPS context and delta time for physics calculations. The editor interface has been modified to accommodate these new blocks, improving the overall functionality and user experience of the particle system editor
This commit introduces several new blocks for the Solid Particle System (SPS) in the Node Particle Editor, improving the functionality and flexibility of the particle system. The following blocks have been added:

- SPSMeshSourceBlock: Defines the mesh shape for SPS.
- SPSCreateBlock: Creates an SPS with a base mesh.
- SPSSystemBlock: Configures the Solid Particle System.
- SPSInitBlock: Initializes particles with configurable parameters (position, velocity, color, etc.).
- SPSUpdateBlock: Generates update functions for particle properties.

Additionally, the connection point types have been updated to reflect the new Solid Particle System structure, and the editor interface has been modified to accommodate these enhancements, improving the overall user experience.
This commit enhances the Solid Particle System by ensuring that the mesh is built and particles are initialized before rendering. The `buildMesh` and `initParticles` methods are now called during the setup process, improving the overall functionality. Additionally, the cleanup process has been updated to properly dispose of the mesh when the system is stopped, ensuring better resource management.
…SystemSet

This commit modifies the initialization of the Node Particle System by changing the method from `setToDefaultSPS` to `setToDefault`, aligning it with the updated API and improving consistency in the codebase.
…icleBlock

This commit introduces an `isStarted` flag to the Solid Particle System to track its initialization state, preventing unnecessary operations when stopping the system. Additionally, the NodeParticleBlock has been updated to allow multiple connections for input points, improving flexibility. The SPSUpdateBlock has been integrated into various components, enhancing the Node Particle Editor's functionality and user experience.
This commit adds a new internal property `_connectedPoints` to the `NodeParticleConnectionPoint` class, allowing it to maintain multiple connections. The connection and disconnection logic has been updated to handle multiple connections appropriately. Additionally, a new getter method `connectedPoints` has been introduced to retrieve the array of connected points. In the `GraphCanvasComponent`, the connection check has been refined to consider the `allowMultipleConnections` property, improving the connection management logic.
…functionality

This commit enhances the Solid Particle System by streamlining the start and stop methods, ensuring proper initialization and cleanup of particles. The ISPSData interface has been updated to enforce required properties for SPS update data, while the SPSCreateBlock now defaults the particle count to 1. Additionally, the Node Particle Editor has been updated to introduce a mode selection feature, allowing users to switch between Standard and SPS modes, improving usability and flexibility in particle system management.
…ate logic

This commit simplifies the particle initialization and update processes within the SPSSystemBlock. The logic for creating and managing connected points has been optimized, allowing for a more efficient retrieval of connected values. Additionally, the updateParticle method has been enhanced to directly utilize shape IDs for better performance and clarity. These changes improve the overall functionality and maintainability of the Solid Particle System.
…isposal and multi-connection support

This commit updates the SolidParticleSystem to ensure proper disposal of the mesh when stopping the system, enhancing resource management. Additionally, the NodeParticleSystemSet has been modified to support multiple connections for input points, improving flexibility in particle system configurations. A new method, setToDefaultSPS, has been introduced to streamline the setup of Solid Particle Systems, further enhancing usability and functionality.
@bjsplat
Copy link
Collaborator

bjsplat commented Oct 20, 2025

Please make sure to label your PR with "bug", "new feature" or "breaking change" label(s).
To prevent this PR from going to the changelog marked it with the "skip changelog" label.

@deltakosh
Copy link
Contributor

  1. Multiple Connections Architecture: Look at what I did for the GradientBlock

  2. Future Extensibility: Not sure to follow. What are the other particle system? Note that NPE is based on the premise that the update loop is CPU side.

@deltakosh deltakosh marked this pull request as draft October 20, 2025 21:22
hasEndpoints: boolean;
endpoints: Nullable<IPortData[]>;
directValueDefinition?: IPortDirectValueDefinition;
allowMultipleConnections?: boolean;
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This won't work. We do not support multiple connection to one input. But look at GradientBlock in NPE. this is the way to go

@bjsplat
Copy link
Collaborator

bjsplat commented Oct 20, 2025

Building or testing the sandbox has failed.

If the tests failed, results can be found here:
https://snapshots-cvgtc2eugrd3cgfd.z01.azurefd.net/SANDBOX/refs/pull/17320/merge/testResults/

@bjsplat
Copy link
Collaborator

bjsplat commented Oct 20, 2025

Building or testing the playground has failed.

If the tests failed, results can be found here:
https://snapshots-cvgtc2eugrd3cgfd.z01.azurefd.net/PLAYGROUND/refs/pull/17320/merge/testResults/

@bjsplat
Copy link
Collaborator

bjsplat commented Oct 20, 2025

Graph tools CI has failed you can find the test results at:

https://snapshots-cvgtc2eugrd3cgfd.z01.azurefd.net/TOOLS/refs/pull/17320/merge/testResults/

@deltakosh
Copy link
Contributor

Question for you: How does it integrate with current update nodes that take a particle as parameter?

@deltakosh
Copy link
Contributor

Ok @Soullnik the more I think about it, the more I struggle to see it working. My main problem is that we cannot share anything with the main blocks. Which blocks will work in both mode? I feel like we are stuffing spa in but it makes not a lot of sense.

@deltakosh
Copy link
Contributor

Lol sorry I'm thinking too much lol. I think all the nodes working on base types will work still. But all nodes working on particles needs to be hidden. Then it means we need to provide an update node for sps. Same way: update position, etc...

@Soullnik
Copy link
Author

  1. Multiple Connections Architecture: Look at what I did for the GradientBlock
  2. Future Extensibility: Not sure to follow. What are the other particle system? Note that NPE is based on the premise that the update loop is CPU side.

i will check gradientBlock

The second question was about architecture - I had to modify NodeParticleSystemSet to support SPS:

private _systemBlocks: (SystemBlock | SPSSystemBlock)[] = [];

This union type works for now, but if we add more particle system types, we'd need:

private _systemBlocks: (SystemBlock | SPSSystemBlock | GPUSystemBlock)[] = [];

Mikalai Lazitski added 2 commits October 21, 2025 11:24
…y connection logic

This commit streamlines the connection management within the NodeParticleBlock and NodeParticleConnectionPoint classes by removing the support for multiple connections. The `registerInput` method has been simplified, and the logic for handling connected points has been optimized. Additionally, the GraphCanvasComponent has been updated to reflect these changes, enhancing the overall clarity and maintainability of the codebase.
…agement

This commit introduces the `unregisterInput` method to the NodeParticleBlock class, allowing for the dynamic removal of input connections. The method handles disconnection and notifies observers of input changes. Additionally, it removes commented-out code from the SPSCreateBlock and refines the input management logic in the SPSSystemBlock, enhancing overall clarity and maintainability of the particle system components.
@bjsplat
Copy link
Collaborator

bjsplat commented Oct 21, 2025

Please make sure to label your PR with "bug", "new feature" or "breaking change" label(s).
To prevent this PR from going to the changelog marked it with the "skip changelog" label.

…terface to simplify connection management. This change aligns with recent refactoring efforts to streamline connection logic across the node graph system.
@bjsplat
Copy link
Collaborator

bjsplat commented Oct 21, 2025

Please make sure to label your PR with "bug", "new feature" or "breaking change" label(s).
To prevent this PR from going to the changelog marked it with the "skip changelog" label.

@deltakosh
Copy link
Contributor

  1. Multiple Connections Architecture: Look at what I did for the GradientBlock
  2. Future Extensibility: Not sure to follow. What are the other particle system? Note that NPE is based on the premise that the update loop is CPU side.

i will check gradientBlock

The second question was about architecture - I had to modify NodeParticleSystemSet to support SPS:

private _systemBlocks: (SystemBlock | SPSSystemBlock)[] = [];

This union type works for now, but if we add more particle system types, we'd need:

private _systemBlocks: (SystemBlock | SPSSystemBlock | GPUSystemBlock)[] = [];

I think that works. Other option will be to have a NodeParticleSystemSet

…zation and update logic

This commit removes the `isStarted` flag from the SolidParticleSystem, streamlining the start and stop methods. The ISPSUpdateData interface has been updated to make properties optional, enhancing flexibility in particle updates. Additionally, the SPSInitBlock and SPSUpdateBlock have been refactored to only assign update functions when the corresponding properties are connected, optimizing performance. The SPSSystemBlock has been improved to manage the SolidParticleSystem lifecycle more effectively, ensuring proper disposal and initialization of particles.
@bjsplat
Copy link
Collaborator

bjsplat commented Oct 28, 2025

Please make sure to label your PR with "bug", "new feature" or "breaking change" label(s).
To prevent this PR from going to the changelog marked it with the "skip changelog" label.

@Soullnik
Copy link
Author

@deltakosh I’m running into an issue disposing previously created SPS instances. I see that _build inside SPSCreateBlock is called twice for different scenes. What’s the correct way to dispose the previouse SPS associated with the scene?

…ck and enhance particle configuration

This commit introduces the new SPSParticleConfigBlock for configuring particle parameters such as mesh, count, material, and initialization/update blocks. The SPSCreateBlock has been refactored to utilize this new block, streamlining the creation of particles. Additionally, the ISPSData interface has been updated to reflect the new configuration structure, and various blocks have been adjusted to improve their connection logic and overall functionality within the particle system.
Mikalai Lazitski added 21 commits November 14, 2025 18:26
This commit enhances the Solid Particle System by ensuring that the mesh is built and particles are initialized before rendering. The `buildMesh` and `initParticles` methods are now called during the setup process, improving the overall functionality. Additionally, the cleanup process has been updated to properly dispose of the mesh when the system is stopped, ensuring better resource management.
…SystemSet

This commit modifies the initialization of the Node Particle System by changing the method from `setToDefaultSPS` to `setToDefault`, aligning it with the updated API and improving consistency in the codebase.
…icleBlock

This commit introduces an `isStarted` flag to the Solid Particle System to track its initialization state, preventing unnecessary operations when stopping the system. Additionally, the NodeParticleBlock has been updated to allow multiple connections for input points, improving flexibility. The SPSUpdateBlock has been integrated into various components, enhancing the Node Particle Editor's functionality and user experience.
This commit adds a new internal property `_connectedPoints` to the `NodeParticleConnectionPoint` class, allowing it to maintain multiple connections. The connection and disconnection logic has been updated to handle multiple connections appropriately. Additionally, a new getter method `connectedPoints` has been introduced to retrieve the array of connected points. In the `GraphCanvasComponent`, the connection check has been refined to consider the `allowMultipleConnections` property, improving the connection management logic.
…functionality

This commit enhances the Solid Particle System by streamlining the start and stop methods, ensuring proper initialization and cleanup of particles. The ISPSData interface has been updated to enforce required properties for SPS update data, while the SPSCreateBlock now defaults the particle count to 1. Additionally, the Node Particle Editor has been updated to introduce a mode selection feature, allowing users to switch between Standard and SPS modes, improving usability and flexibility in particle system management.
…ate logic

This commit simplifies the particle initialization and update processes within the SPSSystemBlock. The logic for creating and managing connected points has been optimized, allowing for a more efficient retrieval of connected values. Additionally, the updateParticle method has been enhanced to directly utilize shape IDs for better performance and clarity. These changes improve the overall functionality and maintainability of the Solid Particle System.
…isposal and multi-connection support

This commit updates the SolidParticleSystem to ensure proper disposal of the mesh when stopping the system, enhancing resource management. Additionally, the NodeParticleSystemSet has been modified to support multiple connections for input points, improving flexibility in particle system configurations. A new method, setToDefaultSPS, has been introduced to streamline the setup of Solid Particle Systems, further enhancing usability and functionality.
…y connection logic

This commit streamlines the connection management within the NodeParticleBlock and NodeParticleConnectionPoint classes by removing the support for multiple connections. The `registerInput` method has been simplified, and the logic for handling connected points has been optimized. Additionally, the GraphCanvasComponent has been updated to reflect these changes, enhancing the overall clarity and maintainability of the codebase.
…agement

This commit introduces the `unregisterInput` method to the NodeParticleBlock class, allowing for the dynamic removal of input connections. The method handles disconnection and notifies observers of input changes. Additionally, it removes commented-out code from the SPSCreateBlock and refines the input management logic in the SPSSystemBlock, enhancing overall clarity and maintainability of the particle system components.
…terface to simplify connection management. This change aligns with recent refactoring efforts to streamline connection logic across the node graph system.
…zation and update logic

This commit removes the `isStarted` flag from the SolidParticleSystem, streamlining the start and stop methods. The ISPSUpdateData interface has been updated to make properties optional, enhancing flexibility in particle updates. Additionally, the SPSInitBlock and SPSUpdateBlock have been refactored to only assign update functions when the corresponding properties are connected, optimizing performance. The SPSSystemBlock has been improved to manage the SolidParticleSystem lifecycle more effectively, ensuring proper disposal and initialization of particles.
…ck and enhance particle configuration

This commit introduces the new SPSParticleConfigBlock for configuring particle parameters such as mesh, count, material, and initialization/update blocks. The SPSCreateBlock has been refactored to utilize this new block, streamlining the creation of particles. Additionally, the ISPSData interface has been updated to reflect the new configuration structure, and various blocks have been adjusted to improve their connection logic and overall functionality within the particle system.
…ement and remove unused observers

This commit refactors the SPSCreateBlock and SPSSystemBlock classes by removing unused observer properties and simplifying the lifecycle management of SolidParticleSystem instances. The changes enhance clarity and maintainability by eliminating redundant code related to rendering observers and disposal handlers, ensuring a more efficient handling of particle systems.
This commit updates the ParticleSystemSet class to accommodate SolidParticleSystem instances alongside traditional ParticleSystem objects. The systems array is modified to include both types, and conditional checks are added to ensure proper handling of emitters and serialization for SolidParticleSystems. These changes improve the flexibility and functionality of the particle system management.
…ticle integration

This commit updates the NodeParticleBuildState class to support both Particle and SolidParticle contexts, allowing for more flexible handling of particle data. The systemContext property is modified to accommodate both ThinParticleSystem and SolidParticleSystem. Additionally, the NodeParticleSystemSet class is enhanced with a new method, setToTetrahedronSPS, which sets up a SolidParticleSystem with a tetrahedron configuration, including random positioning, rotation, and color generation. These changes improve the overall functionality and versatility of the particle system management.
This commit refactors the SPSInitBlock and SPSUpdateBlock classes by removing redundant private methods for retrieving position, velocity, color, scaling, and rotation values. Instead, the blocks now directly use the getConnectedValue method for connected properties, optimizing performance and simplifying the code structure. These changes enhance clarity and maintainability within the SolidParticle system.
…tion handling

This commit updates the NodeParticleSystemSet class to simplify the random positioning and rotation of particles by utilizing Vector2 and Vector3 for combined input blocks. The previous individual random blocks for X, Y, and Z positions and rotations have been consolidated into more efficient structures, enhancing clarity and maintainability. Additionally, the random color generation has been updated to use Vector3, improving the overall functionality of the particle system.
… clarity

This commit cleans up the NodeParticleSystemSet class by removing outdated comments related to random positioning, rotation, and color generation steps. The removal of these comments enhances the readability of the code and focuses on the current implementation without unnecessary distractions.
…rty management in particles

This commit introduces two new blocks, ParticlePropsSetBlock and ParticlePropsGetBlock, to facilitate the setting and retrieval of custom properties in particle.props. The ParticlePropsSetBlock allows for storing values, while the ParticlePropsGetBlock enables reading these values dynamically. Additionally, the NodeParticleSystemSet class is updated to utilize these new blocks, enhancing the flexibility and functionality of the particle system. The node list component is also updated to include descriptions for the new blocks, improving user understanding and accessibility.
…play value retrieval

This commit adds support for String properties in the ParticlePropsGetBlock and ParticlePropsSetBlock, allowing for dynamic management of string-type properties in particle systems. The displayValue method is introduced to provide a user-friendly representation of the property name. Additionally, the InputDisplayManager is updated to handle string values appropriately, improving the overall functionality and user experience in the particle editor. The GenericPropertyTabComponent is also enhanced to include a text input for string properties, further streamlining property management.
@bjsplat
Copy link
Collaborator

bjsplat commented Nov 14, 2025

Please make sure to label your PR with "bug", "new feature" or "breaking change" label(s).
To prevent this PR from going to the changelog marked it with the "skip changelog" label.

@bjsplat
Copy link
Collaborator

bjsplat commented Nov 14, 2025

Building or testing the sandbox has failed.

If the tests failed, results can be found here:
https://snapshots-cvgtc2eugrd3cgfd.z01.azurefd.net/SANDBOX/refs/pull/17320/merge/testResults/

@bjsplat
Copy link
Collaborator

bjsplat commented Nov 14, 2025

Graph tools CI has failed you can find the test results at:

https://snapshots-cvgtc2eugrd3cgfd.z01.azurefd.net/TOOLS/refs/pull/17320/merge/testResults/

@bjsplat
Copy link
Collaborator

bjsplat commented Nov 14, 2025

Building or testing the playground has failed.

If the tests failed, results can be found here:
https://snapshots-cvgtc2eugrd3cgfd.z01.azurefd.net/PLAYGROUND/refs/pull/17320/merge/testResults/

@bjsplat
Copy link
Collaborator

bjsplat commented Nov 14, 2025

@Soullnik Soullnik changed the base branch from master to quick-fix November 14, 2025 16:21
@Soullnik Soullnik changed the base branch from quick-fix to master November 14, 2025 16:21
@bjsplat
Copy link
Collaborator

bjsplat commented Nov 14, 2025

Please make sure to label your PR with "bug", "new feature" or "breaking change" label(s).
To prevent this PR from going to the changelog marked it with the "skip changelog" label.

@deltakosh
Copy link
Contributor

deltakosh commented Nov 14, 2025

Nice work mate!! Now we need to make sure you filter the list of the available nodes on the left when in SPS mode (only keep the one working)

We are doing the same in NME. This way there is no need of a special SPS group. When in SPS we only display the SPS + available blocks

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants