Giter Site home page Giter Site logo

protongraph / protongraph Goto Github PK

View Code? Open in Web Editor NEW
1.3K 51.0 83.0 31.79 MB

Experimental node-based software for procedural content generation

License: MIT License

GDScript 99.77% GAP 0.23%
godot-engine node-graph standalone game-development

protongraph's Introduction

ProtonGraph

A node based software for procedural 3D content creation. By chaining simple nodes together, you can create a complex result. You can see it as a form of visual scripting, but for 3D models generation.

image

Goals

ProtonGraph aims to be easy to use, easy to expand, and centered around game development. The long term goal is, you can use it to create your content in advance, or embbed ProtonGraph in your game and generate content on the fly while playing.

Being open source and MIT licenced, ProtonGraph should allow that without legal headaches. We're not there yet though, and the goal is NOT to replace Houdini or Blender Geometry Nodes.

Current status

ProtonGraph is a "Godot game" as in, it's made using the Godot engine: you can clone the project and open it with the Godot editor. It used to be on version 3 and is now being ported to Godot 4. As a result, some features are currently missing or broken, but the bulk of the port is done already and we're now focusing on stability and content.

Roadmap

To track the work in progress and planned features, head over the project board

Build from source

Automated CI actions will be added back soon, in the meantime you can manually build the project like this:

  • Compile or download the latest Godot 4 build.
  • Clone this repository.
  • Open it in Godot 4.
  • From there, you can export the project to your target platform like any Godot project.

Downloads

Check the release tab to get access to officials builds and see the changelogs.

You can also download the latest nightly builds from this page.

Social medias

Head over to the Discord server if you want to ask for help or hear about every little update or work in progress. Head over to Youtube or LBRY to access video tutorials. (Most of them are outdated and will be updated once a stable release is available)

Licence

  • Unless stated otherwise, this project is available under the MIT licence.
  • Thirdparties library have their own licence but are all MIT friendly.
  • The unofficial Godot logo redesign featured on the splash screen is from marek95 and is used with permission.

protongraph's People

Contributors

bitsydoge avatar bryce-spiffmedia avatar chances avatar christinoleo avatar danreeves avatar dependabot[bot] avatar fire avatar follower avatar hungryproton avatar jummit avatar muzz avatar navett52 avatar tebys avatar thehelloflower avatar wojtekpil avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

protongraph's Issues

Multithreading crashes

So i took some time to do some debugging, and since there is no issue for that, im creating a new one to share some of my basic findings.
It seems like an issue with Node duplication, my first idea was that the nodes that are being duplicated are part of thread-unsafe tree, but that does not seem to be the case.
Simulation part seems to be woring, function returns status OK. It is something after that that is messed up.

Scale along curve

I was wondering if scaling along a curve was a feature you were considering. As an example: making the branches at the top of the tree smaller than the lower ones.

I made a rough implementation quickly, but I'm not sure if it's the best way:

tool
extends ConceptNode


func _init() -> void:
	unique_id = "scale_along_curve"
	display_name = "Scale along curve"
	category = "Transforms"
	description = "Scales nodes along a curve"

	set_input(0, "Nodes", ConceptGraphDataType.NODE_3D)
	set_input(1, "Curve", ConceptGraphDataType.CURVE_2D)
	set_output(0, "", ConceptGraphDataType.NODE_3D)

	mirror_slots_type(0, 0)


func _generate_outputs() -> void:
	var nodes := get_input(0)
	var curve: Curve = get_input_single(1, 0)
	var local_transform: bool = get_input_single(2, true)

	if not nodes or nodes.size() == 0:
		return
		
	for i in range(nodes.size()):
		var curve_point = curve.interpolate_baked(float(i) / float(nodes.size()))
		nodes[i].transform = nodes[i].transform.scaled(Vector3(curve_point, curve_point, curve_point))
	output[0] = nodes

Develop branch - saving a graph resets values!

Save a graph, close scene, reopen scene - all scalar and vector values are reset to default.

Was going to PR those noise and heightmap features, but this bug is messing up my example scene and making it hard to do some final testing.

Comment nodes, groups and other QoL features

  • It would be nice to have comments blocks similar to the ones in UE4
    image

  • Grouping nodes would be nice too but that's probably something we should add to the graphEdit node itself. That requires to modify the engine.

  • Rerouting nodes would be great but they also require a PR on godot itself
    image

Invalid set index 'visible' after install

Followed the instruction for installation on the wiki and am getting the following error when clicking on the ConceptGraph node:

image

In the image you can see my setup in terms of the project files. This is a fresh project and I have not edited any scripts prior to the above image.

Merge meshes - multiple inputs and single surface checkbox

I've only just started playing with the examples, so I might have missed something that gets the same result I'm about to outline? Anyway...

It would add a lot of flexibility if the Merge meshes node would allow for multiple inputs.
As well as having an As single surface checkbox that merges everything into a single surface on the mesh, in order to minimise draw calls (I'm guessing this is much more complex than just merging surfaces - which is something I've done in gdscript before).

So for the simple tree example:

  1. The trunk, branches, and sub-branches would all link their Extrude along curve outputs into Merge meshes with As single surface checked.
  2. The leaves would do the same on their own Merge meshes node.
  3. Then both of their outputs would go into another Merge meshes node without As single surface checked.

And now you have a single tree mesh with only 2 surfaces, which could be piped into a MultiMesh, or even just saved to disk via the inspector.

GraphNodes UI improvements

  • Allow local edition of Vector2 and Vector3
  • Improve the Spinbox style
  • Enforce nodes to always use as little amount of space as possible

Noise function / threshold interaction unclear

Was looking for documentation on the Wiki about Simplex Noise and how the white color coded output is used with functions like Exclude From Noise.

My initial assumption was that the noise was either on the domain [0:255] or [0..1) or maybe [0..1] - as a spatial noise I'm not sure if it's treated as a sort of static Random call that is going to return a noise value for some (x, y) coordinate, or if there's some hidden sampling / rastering going on, or if there's a dimension reduction from a transform to some UV space ? I see in one of the screen shots that a function uses a negative threshold in Exclude From Noise; I had to set threshold to small numbers to see any exclusion behavior.

Hang up with large grid sampling

I was using Create point grid and supplied (as a part of trying to figure out what to do) a large size vector (10,10,10) and a large density (might have also been 10?) and Godot went unresponsive.

Load and Create buttons next to Clear all

There's no way to load a graph on an already setup ConceptGraph node.

Originally I thought the Clear all button should show the Load and Create buttons you get when adding a ConceptGraph node to a scene?

But then I noticed that the Create button requires you to save the graph, so the Clear all button has a very different function.

So perhaps Load and Create buttons could be added next to the Clear all button?

Node Categories

So far the nodes are relatively organized but there is inconsistency.

I would like to see one core idea driving what category handles what.
For example, there is the input category, which only has generic input, and the curve input is in curves.

There is two competing ideas there, grouping by data type, or grouping by purpose. What do you see as being a better idea.

Thinking about it, both are really fine solutions, but I would like to open this discussion.

Deform mesh to curve

I'm already working on this and have a prototype happening.

DeformToCurve

Currently it maps the y axis along the curve, but i'll add the ability to customize that.

What's left to do before I pull request it:

  1. Fix UVS
  2. have a start and end percentage along curve.
  3. right now it's pretty sensitive to the curve twisting, so need to add some methods to combat that, or you get some messed up results. This will probably mean a lock rotation check box, and start end twist scalars.
  4. we need a merge mesh node to make the most use of this, might work on that too.
  5. taper along curve, relatively easy to add, so might as well, would be good for pre-modeled and textured tree trunks.

More ideas are welcome.

Merge some Transform nodes?

@HungryProton we discussed a Position from noise node here: #59 (comment)

But is adding a separate node for this a good idea?
Or should there be a Transform from Noise node that's like the Edit Transform node?

That brings me to the broader question in the title:

Should these Transform nodes (as well as the missing one):

  • Offset, Rotate, Scale
  • Jitter, Rotate random
  • Scale from noise

be merged into nodes that handle the complete Transform:

  • Transform (All) - just "Edit Transform" renamed
  • Transform (Random)
  • Transform (Noise)
  • Transform (Offset) - just an idea, but this one could transform each node with an Additive or Multiplicative offset, based on the nodes current position from a given vector

Then could/should the individual node be removed?
There's a bunch of pros and cons to this question, which I was going to list here, but wont unless you'd like to discuss them.

Note: I can work on this if you'd like?

Add a graph minimap

Not sure how feasible this one is, but adding a mini-map on the side of the graph edit would help navigating large graphs.

error graphnode not showing up

of some weird reason godot had to recompile the "concept_graph.gd" to recognize the class_name, which is awfully strange. A potetial fix would be tor register it it in the main plugin-script as a custom type, even though it is not recommended in the godot docs...

Error: Node type [custom node name] could not be found.

After reloading the plugin and opening a scene with a Concept Graph using a custom node I wrote it would delete that node from the graph with the warning Error: Node type scale_along_curve could not be found..

The node is in the library however, since I can add it again.

Not sure if this is a naming convention issue or something.

Mesh from Heightmap errors - possibly due to threading?

I'm getting these errors when generating Mesh from Heightmap:
Can't add child 'MeshInstance' to 'Output', already has a parent 'Output'.
and
res://addons/concept_graph/src/core/concept_graph.gd:230 - Invalid type in function 'add_child' in base 'Spatial'. The Object-derived class of argument 1 (previously freed instance) is not a subclass of the expected argument class.

Sometimes no MeshInstance is output, and sometime multiple are output.
And then eventually clicking replay will crash Godot.

Is this a threading issue?
That error on line 230 seems to imply the new output nodes have been freed, not the old ones.
Is it reusing references?
Or do we just have to wait for queue_free to actually free the output before doing add_child again.
I'm sure you know exactly what's wrong :)
https://github.com/HungryProton/concept_graph/blob/9600a39c4aeecc081f2af7adf4cc07f711f7531c/src/core/concept_graph.gd#L216-L232

Graph Editor not updating on some important Scene tree events

If you add a new ConceptGraph node to the scene, and then you delete it, undo, or click another ConceptGraph node, the Load/Create buttons don't disappear from the Graph Editor. This stops interaction with other graphs. This is the main issue!

If a ConceptGraph node with a graph loaded is removed from the scene (delete or undo), the graph still shows in the Graph Editor, until you add or click on another ConceptGraph node. Not a big issue.

Moving between Scene tree nodes with keyboard arrows doesn't update the Concept Graph Editor when ConceptGraph nodes are highlighted. Note sure if it should or not, but probably.

Click a ConceptGraph node in one scene, then click a non-ConceptGraph node, then switch to another scene. When switching back the Graph Editor now says "Select a ConceptGraph node". It would be nice if it kept showing the last selected Graph for that scene. Might be tricky / impossible?

Unable to use materials with the example ground graph

Hello, and thanks for opening this awesome tool. I have been playing around with it, and maybe I'm doing something wrong, but I am unable to make the default ground graph work with materials. Here is a picture of my graph.

graph

The material in the inspector never applies. Funny enough, when making the material anything other than a spatialmaterial the mesh completely disappears.

Terrain mesh generation/manipulation

@HungryProton we discussed a Plane Mesh from Transforms node for terrain here: #59 (comment)

The main idea is to be able to generate terrain meshes from noise.
But it would be nice to apply other operations/deformations as well.

You asked if it would need to be a perfectly aligned grid of transforms to generate a terrain?
Yes and no.

  • A uniform terrain mesh requires a single layer grid of points, where some jitter that's less than grid density is ok.
  • A triangulated mesh (Delauney) can be completely non-uniform, but still needs to be based on a 2D plane of points. Note: triangulation slows down generation considerably.

So yes the issue is that a NODE_3D input can be a very random set of 3D points.

Mesh from Transforms - Marching Cubes?
A proper Mesh from Transforms node would have to apply a marching cubes algorithm I think.
This would be very cool, but it's much more complex and possibly out of scope for this project?
It's definitely not what I'm intending here.

Plane Mesh options:
You pointed out that for a Plane Mesh node, a direct noise input might be better.
This solves the above problems, but it limits the possibilities.

Here's some examples of what I'd like to make possible:

  • Apply multiple Simplex Noises.
  • Apply 2D curves to each noise.
  • Apply 3D curves on top to add specific details (is CSG best here? I'm not familiar with it)
  • Start from a Voronoi diagram and apply Simplex Noise on top.
  • Simply generate a mesh from a heightmap

Some possible solutions:

  • Apply multiple noises - this could be partly solved with dynamic slots on the noise input, but that wouldn't allow for applying other manipulations as well.

    • A Merge Noises node might help here, and could be more widely useful? But if it wasn't working on a NODE_3D array (which it can't be here), I think it would have to pass a noise wrapper class around that encapsulates looping over multiple noises when sampling a point. This wrapper could also handle any new noise implementations we might get? (I've seen you mention that).
  • Apply a 2D curve to each noise - a CURVE_2D input on the Simplex Noise node could be worthwhile, as I can see it being useful elsewhere!?

    • A separate Smooth Noise node is another option, but again it has to be applied to a node array, or a noise wrapper class that applies the curve to the noise at sample time.

This comment is already way to long, so I'll stop there.
Let me know your thoughts.

Saving output as tscn

I did a little addition to my workflow by letting an output node to save the result as a .tscn file. It is useful to me and I believe it should be helpful for more people. I can send a pull request if deemed worthwhile.

Node 3d input clears Scalar and Boolean inputs (attach/detach/load)

Attaching and detaching a Node 3d input will clear Scalar and Boolean inputs on the same node to their default.

This clearing also happens on graph load, so it feels like state isn't saving, but if the Node 3d input isn't attached the Scalar and Boolean inputs will load their saved state.

Checked on Godot 3.2-stable with a new project and clean install of concept_graph 0.3-alpha.

Some example nodes and the inputs that get cleared:

  • Exclude from noise - Threshold, Invert, Local space
  • Set material - Override children
  • Rotate random - Seed, Local Space
  • Offset - Negative, Local space
  • Spawn random duplicates - Seed

Parent to node also bugs out when attaching/detaching inputs.

I'm guessing this has something to do with the new dynamic slot system?

Duplication of ConceptGraph node crashes Godot

When I try to duplicate two trees in example scene Godot ram usage constantly goes up, until oom-killer kills it.

dmesg:

[20671.001410] Tasks state (memory values in pages):
[20671.001410] [  pid  ]   uid  tgid total_vm      rss pgtables_bytes swapents oom_score_adj name
...
[20671.001600] [  25602]  1000 25602  3256586  1741972 22802432  1012200             0 Godot_v3.2-stab
...
[20671.001605] oom-kill:constraint=CONSTRAINT_NONE,nodemask=(null),cpuset=/,mems_allowed=0,global_oom,task_memcg=/,task=Godot_v3.2-stab,pid=25602,uid=1000
[20671.001628] Out of memory: Killed process 25602 (Godot_v3.2-stab) total-vm:13026344kB, anon-rss:6950188kB, file-rss:17392kB, shmem-rss:308kB

Steps to reproduce:

  1. open example project
  2. duplicate tree.
  3. Select both tree nodes and try to duplicate

Another method:

  1. open example project
  2. duplicate tree.
  3. Save project & restart

Godot logs:

OpenGL ES 3.0 Renderer: GeForce GTX 1660 Ti/PCIe/SSE2
 
Loaded Parent to node (parent_to_node.gd)
Loaded Box info (box_info.gd)
Loaded Jitter (jitter.gd)
Loaded Generic input (generic_input.gd)
Loaded Exclude from noise (exclude_from_noise.gd)
Loaded Simplex Noise (simplex_noise.gd)
Loaded Sample curve points (sample_points_constant.gd)
Loaded Smooth curve (smooth_curve.gd)
Loaded Tesselate curve (Curvature) (tessellate_curvature.gd)
Loaded To curve (points_to_curve.gd)
Loaded Tesselate curve (Exact) (tessellate_exact.gd)
Loaded Tesselate curve (Uniform) (tessellate_uniform.gd)
Loaded Midpoint displacement (midpoint_displacement.gd)
Loaded Expand curve (expand_curve.gd)
Loaded Make rectangle curve (create_square.gd)
Loaded Make multi line curves (create_line_multi.gd)
Loaded Make line curve (create_line.gd)
Loaded Make polygon curve (create_polygon.gd)
Loaded Curve Info (curve_info.gd)
Loaded Curve input (curve_input.gd)
Loaded Node Instancer (instancer.gd)
Loaded Make MultiMesh (make_multimesh.gd)
Loaded Palette (debug_palette.gd)
Loaded Offset (offset.gd)
Loaded Output (output.gd)
Loaded Divide scalars (divide_scalar.gd)
Loaded Mesh properties (edit_mesh_properties.gd)
Loaded Extrude polygon curve (extrude_straight.gd)
Loaded Extrude along curve (extrude_along_curve.gd)
Loaded Scale from noise (scale_from_noise.gd)
Loaded Boolean property (boolean.gd)
Loaded String property (string.gd)
Loaded Vector property (vector.gd)
Loaded Scalar property (scalar.gd)
Loaded Curve property (math_curve.gd)
Loaded Scalar (scalar.gd)
Loaded Create grid along curve (create_grid_along_curve.gd)
Loaded Spawn Duplicates (spawn_duplicates.gd)
Loaded Create point grid (create_grid.gd)
Loaded Points Array (points_array.gd)
Loaded Break Vector (break_vector.gd)
Loaded Exclude from curves (exclude_from_curve.gd)
Loaded Box input (box_input.gd)
Loaded Make vector (make_vector.gd)
Loaded Rotate (rotate.gd)
ERROR: get_tree: Condition "!data.tree" is true. Returned: __null
   At: scene/main/node.h:281.
ERROR: get_tree: Condition "!data.tree" is true. Returned: __null
   At: scene/main/node.h:281.
ERROR: get_tree: Condition "!data.tree" is true. Returned: __null
   At: scene/main/node.h:281.
ERROR: get_tree: Condition "!data.tree" is true. Returned: __null
   At: scene/main/node.h:281.
ERROR: get_tree: Condition "!data.tree" is true. Returned: __null
   At: scene/main/node.h:281.
Loaded Parent to node (parent_to_node.gd)
Loaded Box info (box_info.gd)
Loaded Jitter (jitter.gd)
Loaded Generic input (generic_input.gd)
Loaded Exclude from noise (exclude_from_noise.gd)
Loaded Simplex Noise (simplex_noise.gd)
Loaded Sample curve points (sample_points_constant.gd)
Loaded Smooth curve (smooth_curve.gd)
Loaded Tesselate curve (Curvature) (tessellate_curvature.gd)
Loaded To curve (points_to_curve.gd)
Loaded Tesselate curve (Exact) (tessellate_exact.gd)
Loaded Tesselate curve (Uniform) (tessellate_uniform.gd)
Loaded Midpoint displacement (midpoint_displacement.gd)
Loaded Expand curve (expand_curve.gd)
Loaded Make rectangle curve (create_square.gd)
Loaded Make multi line curves (create_line_multi.gd)
Loaded Make line curve (create_line.gd)
Loaded Make polygon curve (create_polygon.gd)
Loaded Curve Info (curve_info.gd)
Loaded Curve input (curve_input.gd)
Loaded Node Instancer (instancer.gd)
Loaded Make MultiMesh (make_multimesh.gd)
Loaded Palette (debug_palette.gd)
Loaded Offset (offset.gd)
Loaded Output (output.gd)
Loaded Divide scalars (divide_scalar.gd)
Loaded Mesh properties (edit_mesh_properties.gd)
Loaded Extrude polygon curve (extrude_straight.gd)
Loaded Extrude along curve (extrude_along_curve.gd)
Loaded Scale from noise (scale_from_noise.gd)
Loaded Boolean property (boolean.gd)
Loaded String property (string.gd)
Loaded Vector property (vector.gd)
Loaded Scalar property (scalar.gd)
Loaded Curve property (math_curve.gd)
Loaded Scalar (scalar.gd)
Loaded Create grid along curve (create_grid_along_curve.gd)
Loaded Spawn Duplicates (spawn_duplicates.gd)
Loaded Create point grid (create_grid.gd)
Loaded Points Array (points_array.gd)
Loaded Break Vector (break_vector.gd)
Loaded Exclude from curves (exclude_from_curve.gd)
Loaded Box input (box_input.gd)
Loaded Make vector (make_vector.gd)
Loaded Rotate (rotate.gd)
Memory MB : 99
ERROR: remove_child: Parameter "p_child" is null.
   At: scene/main/node.cpp:1232.
ERROR: add_child: Parameter "p_child" is null.
   At: scene/main/node.cpp:1174.
Memory MB : 110
ERROR: remove_child: Parameter "p_child" is null.
   At: scene/main/node.cpp:1232.
ERROR: add_child: Parameter "p_child" is null.
   At: scene/main/node.cpp:1174.
Memory MB : 115
ERROR: remove_child: Parameter "p_child" is null.
   At: scene/main/node.cpp:1232.
ERROR: add_child: Parameter "p_child" is null.
   At: scene/main/node.cpp:1174.
Memory MB : 120
ERROR: remove_child: Parameter "p_child" is null.
   At: scene/main/node.cpp:1232.
ERROR: add_child: Parameter "p_child" is null.
   At: scene/main/node.cpp:1174.
Memory MB : 125
Failed method: VScrollBar:_update_minimum_size target ID: 76936
Object was deleted while awaiting a callback
Object was deleted while awaiting a callback
Object was deleted while awaiting a callback
Object was deleted while awaiting a callback
Object was deleted while awaiting a callback
Object was deleted while awaiting a callback
Object was deleted while awaiting a callback
Object was deleted while awaiting a callback
Object was deleted while awaiting a callback
Object was deleted while awaiting a callback
Object was deleted while awaiting a callback
Object was deleted while awaiting a callback
Object was deleted while awaiting a callback
Object was deleted while awaiting a callback
Object was deleted while awaiting a callback
Object was deleted while awaiting a callback
Object was deleted while awaiting a callback
Object was deleted while awaiting a callback
Object was deleted while awaiting a callback
Object was deleted while awaiting a callback
Object was deleted while awaiting a callback
Object was deleted while awaiting a callback
Object was deleted while awaiting a callback
Object was deleted while awaiting a callback
Object was deleted while awaiting a callback
Object was deleted while awaiting a callback
Object was deleted while awaiting a callback
Object was deleted while awaiting a callback
Object was deleted while awaiting a callback
Object was deleted while awaiting a callback
Object was deleted while awaiting a callback
Object was deleted while awaiting a callback
Object was deleted while awaiting a callback
Object was deleted while awaiting a callback
Object was deleted while awaiting a callback
Object was deleted while awaiting a callback
Object was deleted while awaiting a callback
Object was deleted while awaiting a callback
Object was deleted while awaiting a callback
Object was deleted while awaiting a callback
Object was deleted while awaiting a callback
Object was deleted while awaiting a callback
Object was deleted while awaiting a callback
Object was deleted while awaiting a callback
Object was deleted while awaiting a callback
Object was deleted while awaiting a callback
Object was deleted while awaiting a callback
Object was deleted while awaiting a callback
Object was deleted while awaiting a callback
Object was deleted while awaiting a callback
Object was deleted while awaiting a callback
Object was deleted while awaiting a callback
Object was deleted while awaiting a callback
Object was deleted while awaiting a callback
Object was deleted while awaiting a callback
Object was deleted while awaiting a callback
Object was deleted while awaiting a callback
Object was deleted while awaiting a callback
Object was deleted while awaiting a callback
Object was deleted while awaiting a callback
Object was deleted while awaiting a callback
Object was deleted while awaiting a callback
Object was deleted while awaiting a callback
Object was deleted while awaiting a callback
...
Object was deleted while awaiting a callback
Object was deleted while awaiting a callback
Object was deleted while awaiting a callback
Object was deleted while awaiting a callback
Object was deleted while awaiting a callback
Object was deleted while awaiting a callback
Object was deleted while awaiting a callback
Object was deleted while awaiting a callback
Object was deleted while awaiting a callback
Object was deleted while awaiting a callback
Object was deleted while awaiting a callback
Object was deleted while awaiting a callback
Object was deleted while awaiting a callback
Object was deleted while awaiting a callback
Object was deleted while awaiting a callback
Object was deleted while awaiting a callback
Object was deleted while awaiting a callback
Object was deleted while awaiting a callback
Object was deleted while awaiting a callback
Object was deleted while awaiting a callback
Object was deleted while awaiting a callback
Object was deleted while awaiting a callback
Object was deleted while awaiting a callback
Object was deleted while awaiting a callback
Object was deleted while awaiting a callback
Object was deleted while awaiting a callback
Object was deleted while awaiting a callback
Object was deleted while awaiting a callback
Object was deleted while awaiting a callback
Object was deleted while awaiting a callback
Object was deleted while awaiting a callback
Object was deleted while awaiting a callback
Object was deleted while awaiting a callback
Object was deleted while awaiting a callback
Object was deleted while awaiting a callback
Object was deleted while awaiting a callback
Object was deleted while awaiting a callback
Object was deleted while awaiting a callback
Object was deleted while awaiting a callback
Object was deleted while awaiting a callback
Object was deleted while awaiting a callback
Object was deleted while awaiting a callback
Object was deleted while awaiting a callback
Object was deleted while awaiting a callback
Object was deleted while awaiting a callback
Object was deleted while awaiting a callback
Object was deleted while awaiting a callback
Object was deleted while awaiting a callback
Object was deleted while awaiting a callback
Object was deleted while awaiting a callback
Object was deleted while awaiting a callback
Object was deleted while awaiting a callback
Object was deleted while awaiting a callback
Object was deleted while awaiting a callback
Object was deleted while awaiting a callback
Object was deleted while awaiting a callback
Object was deleted while awaiting a callback
Object was deleted while awaiting a callback
Object was deleted while awaiting a callback

Some slot types should be dynamic

Some graphnodes operates on any type of Spatial nodes, but their output is always of type NODE, which means we lose information after going through them.

image

Example : After the rotate node we can no longer connect the output to the "Sample curve points" node because it expect a Curve, not a Node.

We could add converter nodes but that just adds unnecessary clutter to the graphs.

ConceptGraph nesting / reuse

@HungryProton we discussed ConceptGraph nesting here: #59 (comment)

Current ideas:

  1. The "Generic Input" GraphNode should return the output Spatial of a ConceptGraph:

    • Multiple instances of the same ConceptGraph (saved in it's own scene even) can have different template inspector properties set. So this would allow making unique outputs from each instance, but only in a manual way.
    • This is so simple to add, so I think it's a no-brainer.
  2. New GraphNode with input slots that match what the nested graph exposes to the inspector.

    • This allows exposed properties can be manipulated from within the parent graph
    • These properties can be easily re-exposed in the parent inspector.
    • Does it also need inputs that match the ConceptGraphs input nodes?
    • How would multiple outputs be handled? Just as a single node array? What if you wanted to pipe different outputs into different nodes? Perhaps we need an Array Functions node for this?
    • Idea 1 doesn't stop this being implemented as it's a separate Input node.
  3. New GraphNode that can directly load a graph and will show inspector properties, inputs, and outputs that match the graph:

    • This is just a step further than idea 2.
    • It would allow for direct modularisation of graphs as they no longer have to be coupled with scene nodes.

Clear Graph button

I loaded up a template just to see what it was, but now I don't want it and I have no way to clear the graph. I tried selecting a box and deleting the nodes with delete, like mentioned in this issue #9 , but I think it would also be helpful to have a "Clear Graph" button that would just allow you to reset the graph completely.

Duplicate/Copy/Paste nodes?

Doesn't seem like this is possible, and it would be awesome!
Copying multiple nodes from one graph to another is my use case.

Node Request: Arithmetic Math Node

Feel free to delete if this is not relevant.
I couldn't find a simple math node to do arithmetic operations like Add.

Trying to follow the palm tree tutorial, I'd like to combine the Aligned rotations from the "Sample Curve Points" node and the "Rotate Random" node by adding them, but there aren't any such math nodes.
Would that be a correct way to go?

We should be able to add Scalars, or Vectors or Matrices etc.

Rotate random is not an offset

I created a path of plank using a Sample Curve Points node with align rotation:

I wanted to add some random rotation, so I added a Random Rotation node in between Sample Curve Points and Make Multimesh, which resulted in this:

As you can see, the align rotation is completely ignored now.

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.