Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add KHR_interactivity draft #2293

Draft
wants to merge 52 commits into
base: main
Choose a base branch
from
Draft

Add KHR_interactivity draft #2293

wants to merge 52 commits into from

Conversation

lexaknyazev
Copy link
Member

@lexaknyazev lexaknyazev commented May 31, 2023

@bhouston
Copy link
Contributor

Great work! What sections are next? Also what could we release as a draft extension for SIGGRAPH 2023?

|===
| Type | `math/pi` | Ratio of a circle's circumference to its diameter
| Output value sockets | `float value` | 3.141592653589793
|===
Copy link
Contributor

@aaronfranke aaronfranke Oct 23, 2023

Choose a reason for hiding this comment

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

If we have Pi, we should also have Tau. https://tauday.com/tau-manifesto The value Tau is the circle constant (equal to 2*Pi, or rather, Pi is half of Tau). Using Tau usually results in more readable code. Tau is supported in many programming languages such as C#, Java, Python, GDScript, Rust, Unreal Blueprints, and more, so it's useful for interoperability with other languages, especially Unreal Blueprints which is conceptually similar.

===== Tau

[cols="1h,1,2"]
|===
| Type | `math/tau` | The circle constant, the circumference of the unit circle in radians.
| Output value sockets | `float value` | 6.2831853071795862
|===

Copy link
Contributor

@aaronfranke aaronfranke Jun 20, 2024

Choose a reason for hiding this comment

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

In case more justification is needed, the KHR_interactivity document currently contains Degrees-To-Radians (math/rad) and Radians-To-Degrees (math/deg). These allow converting between degrees and radians. Tau can be used for a similarly important purpose, dividing or multiplying by this number allows converting between turns and radians, where 1 turn is τ radians. Tau can be used for more than just this, but the point is, if math/rad and math/deg are justified as a part of KHR_interactivity for converting angles, then math/tau is also justified for converting angles.

@lexaknyazev lexaknyazev force-pushed the interactivity branch 2 times, most recently from dc870c5 to 29e8acc Compare March 6, 2024 23:10
| `T value` | The custom variable value
|===

This node gets a custom variable value using the variable index provided by the `variable` configuration value. The type `T` is determined by the referenced variable. The variable index **MUST** be non-negative and less than the total number of custom variables, otherwise the node is invalid.
Copy link
Contributor

Choose a reason for hiding this comment

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

Why are variables accessed by index instead of by name? It would make more sense to me to set a variable called "money" than one called 27.

@boguscoder

This comment was marked as off-topic.

@Hackn0214

This comment was marked as off-topic.

@Hackn0214
Copy link

When defining a custom event as shown below, if event/receive and event/send nodes refer to this custom event.

 "events": [
    {
      "id": "MyEvent",
      "values": [
        {
          "id": "Val_1",
          "type": 0
        },
        {
          "id": "Val_2",
          "type": 0
        }
      ]
    }
  ],

I think the generated node will have sockets as shown below, but what do you think?
gltfnode

@Hackn0214
Copy link

Is it possible to return the value pointed to by a pointer with the behavior graph?
For example, I would like to change the base color of a selected object's material.

/nodes/{nodeIdx}/mesh -> meshIdx
/meshes/{meshIdx}/primitibes/0/material -> materialIdx
/materials/{materialIdx}/pbrMetallicRoughness/baseColorFactor

@boguscoder
Copy link

If configuration value is array of length 2,3,4 or 16 it could be ambiguous if its vec2/vec3/vec4/vec4x4 or int[], this might not be a problem for JS but is a problem for strongly-typed implementations, is there any recommendation for them how to disambiguate?

@Hackn0214
Copy link

For example, how about specifying the type at the time of the call?
In fact, I would also like to have a feature that returns the number of elements as shown below.
/materials -> total material number in the scecne
/meshes/0/primitives -> Total primitive number

@boguscoder
Copy link

@Hackn0214 you already can get number of materials when using appropriate pointer , check out core pointers

@Hackn0214
Copy link

That's wonderful!
Thank you!

@Hackn0214
Copy link

I would appreciate it if you could add /meshes/{}/primitives.length

@javagl
Copy link
Contributor

javagl commented Jan 21, 2025

Is there a (reasonably up-to-date) machine-processable representation of this? (I.e. something like a schema or a "repository" of node structure descriptions)?

@lexaknyazev
Copy link
Member Author

Is there a (reasonably up-to-date) machine-processable representation of this? (I.e. something like a schema or a "repository" of node structure descriptions)?

Not yet, this document is the only normative source for now. We'll publish regular JSON schemas after confirming that the current early implementations are aligned with them.

That said, JSON schemas alone are not enough since most operations have their own predefined socket types and ids. Suggestions on the machine-readable node spec representations are welcome.

@javagl
Copy link
Contributor

javagl commented Jan 21, 2025

It could be something simple as a starter....

output-2025-01-21.json

One could/should probably group this based on the Section structure, maybe even include the headers like ===== Cross Product or so. One could also think about parsing and understanding the types...

@javagl
Copy link
Contributor

javagl commented Feb 10, 2025

What is the timeline for this and its review (beyond "as quickly as possible")? I have some smaller "pending" review comments, but am not sure when I find the time to continue. Is the preferred way "one complete review", or "comments as soon as they come up"?

@lexaknyazev
Copy link
Member Author

@javagl Feel free to post comments as soon as they come up.

Copy link
Contributor

@javagl javagl left a comment

Choose a reason for hiding this comment

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

OK, some minor comments inlined (I hope that I can continue here soon)

On the other hand, behavior graphs are a superset of trigger-action lists, meaning that the former can support everything that trigger-action lists can, and more. Behavior graphs support “Queries”, “Logic” and “Control Flow” nodes, making them more expressive and capable of creating more sophisticated behaviors. This makes behavior graphs the preferred method of choice for high-end game engines, as it offers an identical safety model as trigger-action lists while being more expressive.

=== Turing Completeness
The execution model and node choices for this extension mean that it is Turing-complete. This means that an implementation of this can execute any computation and it is also hard to predict if it will run forever, e.g., halt or not.
Copy link
Contributor

Choose a reason for hiding this comment

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

It's not "hard to predict", but rather "not always possible to predict" (I.e. semidecidable)


[cols="1h,1,2"]
|===
| Operation | `math/transform` | Vector transformation
Copy link
Contributor

@javagl javagl Feb 5, 2025

Choose a reason for hiding this comment

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

These nodes all have the name math/transform. This will cause trouble and ambiguities. They should be renamed to math/transform2, 3, 4, aligned with the naming of math/combineX.

The fact that the nodes and their types cannot be "templated" (despite what is suggested in math/transpose...), and the fact that nodes like math/sub exist once for int and once for "all float-based types" are a much broader issues with the type system, beyond the scope of a review comment)

Copy link
Member Author

Choose a reason for hiding this comment

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

This will cause trouble and ambiguities.

Please elaborate, i.e., propose an example graph that would be ambiguous but still conforming to the spec.

Copy link
Contributor

Choose a reason for hiding this comment

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

There currently does not seem to be a reasonable way to create a graph to begin with (except for a text editor)

The ambiguity mainly refers to the definitions and implementations of the nodes, and the authoring process, and maybe the validation. When there is a math/transform node, then it is not clear which type of node this is.

While the validation section contains a statement

(6.7, (7))
If the set of input value sockets defined by the declaration referenced by the declaration property does not match the set of input value sockets defined by the values property with regard to socket ids and types, reject the graph.

the declaration does not carry sufficient type information. Using math/transform with a float2 and a matrix3x3 is not valid, but it is not made explicit.

I know, this is one of the "back to the drawing board" comments, and it's unlikely to be addressed. So feel free to mark it as "resolved". (I'm looking forward to see how the authoring/tooling support will handle all this, eventually).

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

Successfully merging this pull request may close these issues.