A type describes a range of possible values. This includes numbers or other primitive types, but also more abstract concepts ranging from text, users, join requests up to just “parts of a world”.
Categorization
Types can be split into different categories. In many situations there is some kind of distinction between “simple” and “complex” types.
The specifics are dependent on the context you are talking about.
ProtoFlux
Execution of ProtoFlux is a local phenomenon that runs on the computer that started it. In fact the ProtoFlux implementation has been designed to be independent of FrooxEngine.[Citation needed]
In summary it stays close to the underlying C# standards. C# differentiates types based on where the value is stored:
Category (ProtoFlux) | Category (C#) | Description |
---|---|---|
Value Type | Value Type | The value is stored directly within the variable/property. |
Object Type | Reference Type | The value exists somewhere in memory. Variables/properties contain a reference to the memory location. Object types also form a hierarchy where an instance of a sub-type will always be an instance of a super-type. This allows a general concept (i.e. a collider) to be implemented in different ways. (BoxCollider, SphereCollider etc.) |
Also see: Enums, a subcategory of value types.
World Model
The world model of Resonite needs to be kept consistent for multiple users. Where a value is stored locally is far less important than how it is communicated across the network.
In effect this means that when dealing with components and their properties one has to differentiate among the following categories:
Category | All Types | Description |
---|---|---|
Values | Value Types, strings, URIs, Nullable and IEncodable | The value will be written into and read from a network message as-is. |
References | IWorldElement and all its derivatives (e.g. Slot) | The referenced object can be uniquely identified by a RefID which will be sent via the network. The receiver will then do a lookup to determine their own instance of that object. |
Types | Type | Types aren't just used in properties. They are also very important internally to inform other users of newly created components. Therefore they are preferrably encoded as a simple number to avoid wasting network traffic. If such a shorthand is not yet available the full type name will be transmitted instead. As of 2024.4.3.1170 the shorthand is lazily and asynchronously generated by the host. There is one lookup-table per Session.(Speculation: The requirement of session information may be the reason why this has a separate implementation to values.) |
Delegates | WorldDelegate | Delegates reference a method of a specific object instance. The network message contains the RefID to identify the instance and the name/declaring type of the method. |
Generic Types
Generic types are special in that they have type arguments which have to be filled with another type before you can use them. They allow a programmer to write code that can be specialised for a specific use-case without additional implementation. (written once, applied for many types)
They are often used for components that store or process values. Properties and many ProtoFlux nodes are also implemented via generic types. They can be identified by angle brackets (<>
) following their type name in the node browser, component attacher or Scene Inspector Dialog.
Subcategories
This category has the following 2 subcategories, out of 2 total.
E
- Enums (157 P)
V
- Value Types (42 P)