diff --git a/ProjectObsidian/ProtoFlux/Devices/ViveTrackerBattery.cs b/ProjectObsidian/ProtoFlux/Devices/ViveTrackerBattery.cs index 868b8df..3f0b5c1 100644 --- a/ProjectObsidian/ProtoFlux/Devices/ViveTrackerBattery.cs +++ b/ProjectObsidian/ProtoFlux/Devices/ViveTrackerBattery.cs @@ -9,7 +9,7 @@ using ProtoFlux.Runtimes.Execution; using Obsidian; -namespace ProtoFlux.Runtimes.Execution.Nodes.FrooxEngine.Input; +namespace ProtoFlux.Runtimes.Execution.Nodes.Obsidian.Devices; [NodeCategory("Obsidian/Devices")] public class ViveTrackerBattery : VoidNode diff --git a/ProjectObsidian/ProtoFlux/Strings/CountSubstring.cs b/ProjectObsidian/ProtoFlux/Strings/CountSubstring.cs index b6181f0..f3f81af 100644 --- a/ProjectObsidian/ProtoFlux/Strings/CountSubstring.cs +++ b/ProjectObsidian/ProtoFlux/Strings/CountSubstring.cs @@ -4,7 +4,7 @@ using ProtoFlux.Core; using ProtoFlux.Runtimes.Execution; -namespace ProtoFlux.Runtimes.Execution.Nodes.Strings +namespace ProtoFlux.Runtimes.Execution.Nodes.Obsidian.Strings { [NodeCategory("Obsidian/String")] public class CountSubstringNode : ValueFunctionNode diff --git a/ProjectObsidian/ProtoFlux/Strings/DecodeBase64Node.cs b/ProjectObsidian/ProtoFlux/Strings/DecodeBase64Node.cs index f27806f..93733ca 100644 --- a/ProjectObsidian/ProtoFlux/Strings/DecodeBase64Node.cs +++ b/ProjectObsidian/ProtoFlux/Strings/DecodeBase64Node.cs @@ -5,7 +5,7 @@ using ProtoFlux.Core; using ProtoFlux.Runtimes.Execution; -namespace ProtoFlux.Runtimes.Execution.Nodes.Strings +namespace ProtoFlux.Runtimes.Execution.Nodes.Obsidian.Strings { [NodeCategory("Obsidian/String")] public class DecodeBase64Node : ObjectFunctionNode diff --git a/ProjectObsidian/ProtoFlux/Strings/DecodeMorseNode.cs b/ProjectObsidian/ProtoFlux/Strings/DecodeMorseNode.cs index 37350ec..2501b93 100644 --- a/ProjectObsidian/ProtoFlux/Strings/DecodeMorseNode.cs +++ b/ProjectObsidian/ProtoFlux/Strings/DecodeMorseNode.cs @@ -6,7 +6,7 @@ using ProtoFlux.Core; using ProtoFlux.Runtimes.Execution; -namespace ProtoFlux.Runtimes.Execution.Nodes.Strings +namespace ProtoFlux.Runtimes.Execution.Nodes.Obsidian.Strings { [NodeCategory("Obsidian/String")] public class DecodeMorseNode : ObjectFunctionNode diff --git a/ProjectObsidian/ProtoFlux/Strings/EncodeBase64Node.cs b/ProjectObsidian/ProtoFlux/Strings/EncodeBase64Node.cs index cf147ef..7861080 100644 --- a/ProjectObsidian/ProtoFlux/Strings/EncodeBase64Node.cs +++ b/ProjectObsidian/ProtoFlux/Strings/EncodeBase64Node.cs @@ -5,7 +5,7 @@ using ProtoFlux.Core; using ProtoFlux.Runtimes.Execution; -namespace ProtoFlux.Runtimes.Execution.Nodes.Strings +namespace ProtoFlux.Runtimes.Execution.Nodes.Obsidian.Strings { [NodeCategory("Obsidian/String")] public class EncodeBase64Node : ObjectFunctionNode diff --git a/ProjectObsidian/ProtoFlux/Strings/EncodeMD5.cs b/ProjectObsidian/ProtoFlux/Strings/EncodeMD5.cs index 48de7be..573b164 100644 --- a/ProjectObsidian/ProtoFlux/Strings/EncodeMD5.cs +++ b/ProjectObsidian/ProtoFlux/Strings/EncodeMD5.cs @@ -6,7 +6,7 @@ using ProtoFlux.Core; using ProtoFlux.Runtimes.Execution; -namespace ProtoFlux.Runtimes.Execution.Nodes.Strings +namespace ProtoFlux.Runtimes.Execution.Nodes.Obsidian.Strings { [NodeCategory("Obsidian/String")] public class EncodeMD5Node : ObjectFunctionNode diff --git a/ProjectObsidian/ProtoFlux/Strings/EncodeMorse.cs b/ProjectObsidian/ProtoFlux/Strings/EncodeMorse.cs index cbe50aa..212277c 100644 --- a/ProjectObsidian/ProtoFlux/Strings/EncodeMorse.cs +++ b/ProjectObsidian/ProtoFlux/Strings/EncodeMorse.cs @@ -6,7 +6,7 @@ using ProtoFlux.Runtimes.Execution; using Obsidian; -namespace ProtoFlux.Runtimes.Execution.Nodes.Strings +namespace ProtoFlux.Runtimes.Execution.Nodes.Obsidian.Strings { [NodeCategory("Obsidian/String")] public class EncodeMorseNode : ObjectFunctionNode diff --git a/ProjectObsidian/ProtoFlux/Strings/EncodeSHA256.cs b/ProjectObsidian/ProtoFlux/Strings/EncodeSHA256.cs index bf5065e..0bedce3 100644 --- a/ProjectObsidian/ProtoFlux/Strings/EncodeSHA256.cs +++ b/ProjectObsidian/ProtoFlux/Strings/EncodeSHA256.cs @@ -6,7 +6,7 @@ using ProtoFlux.Core; using ProtoFlux.Runtimes.Execution; -namespace ProtoFlux.Runtimes.Execution.Nodes.Strings +namespace ProtoFlux.Runtimes.Execution.Nodes.Obsidian.Strings { [NodeCategory("Obsidian/String")] public class EncodeSha256Node : ObjectFunctionNode diff --git a/ProjectObsidian/ProtoFlux/Strings/HMAC.cs b/ProjectObsidian/ProtoFlux/Strings/HMAC.cs index b758901..398ac08 100644 --- a/ProjectObsidian/ProtoFlux/Strings/HMAC.cs +++ b/ProjectObsidian/ProtoFlux/Strings/HMAC.cs @@ -6,7 +6,7 @@ using ProtoFlux.Core; using ProtoFlux.Runtimes.Execution; -namespace ProtoFlux.Runtimes.Execution.Nodes.Strings +namespace ProtoFlux.Runtimes.Execution.Nodes.Obsidian.Strings { public enum HashFunction { diff --git a/ProjectObsidian/ProtoFlux/Strings/HammingDistanceNode.cs b/ProjectObsidian/ProtoFlux/Strings/HammingDistanceNode.cs index edcee5c..0a6dd1d 100644 --- a/ProjectObsidian/ProtoFlux/Strings/HammingDistanceNode.cs +++ b/ProjectObsidian/ProtoFlux/Strings/HammingDistanceNode.cs @@ -4,7 +4,7 @@ using ProtoFlux.Core; using ProtoFlux.Runtimes.Execution; -namespace ProtoFlux.Runtimes.Execution.Nodes.Strings +namespace ProtoFlux.Runtimes.Execution.Nodes.Obsidian.Strings { [NodeCategory("Obsidian/String")] public class HammingDistanceNode : ObjectFunctionNode diff --git a/ProjectObsidian/ProtoFlux/Strings/HammingDistanceNonNullableNode.cs b/ProjectObsidian/ProtoFlux/Strings/HammingDistanceNonNullableNode.cs index e0dd806..b4daba7 100644 --- a/ProjectObsidian/ProtoFlux/Strings/HammingDistanceNonNullableNode.cs +++ b/ProjectObsidian/ProtoFlux/Strings/HammingDistanceNonNullableNode.cs @@ -4,7 +4,7 @@ using ProtoFlux.Core; using ProtoFlux.Runtimes.Execution; -namespace ProtoFlux.Runtimes.Execution.Nodes.Strings +namespace ProtoFlux.Runtimes.Execution.Nodes.Obsidian.Strings { [NodeCategory("Obsidian/String")] public class HammingDistanceNonNullableNode : ValueFunctionNode diff --git a/ProjectObsidian/ProtoFlux/Users/Status/IsUserInNoclipNode.cs b/ProjectObsidian/ProtoFlux/Users/Status/IsUserInNoclipNode.cs index 9529250..dfefc82 100644 --- a/ProjectObsidian/ProtoFlux/Users/Status/IsUserInNoclipNode.cs +++ b/ProjectObsidian/ProtoFlux/Users/Status/IsUserInNoclipNode.cs @@ -3,7 +3,7 @@ using ProtoFlux.Core; using ProtoFlux.Runtimes.Execution; -namespace ProtoFlux.Runtimes.Execution.Nodes.FrooxEngine.Locomotion +namespace ProtoFlux.Runtimes.Execution.Nodes.Obsidian.Locomotion { [ContinuouslyChanging] [NodeCategory("Obsidian/Locomotion")] diff --git a/ProjectObsidian/ProtoFlux/Users/Status/IsUserInSeatedMode.cs b/ProjectObsidian/ProtoFlux/Users/Status/IsUserInSeatedMode.cs index 0b4862b..6d905de 100644 --- a/ProjectObsidian/ProtoFlux/Users/Status/IsUserInSeatedMode.cs +++ b/ProjectObsidian/ProtoFlux/Users/Status/IsUserInSeatedMode.cs @@ -3,7 +3,7 @@ using ProtoFlux.Core; using ProtoFlux.Runtimes.Execution; -namespace ProtoFlux.Runtimes.Execution.Nodes.FrooxEngine.Locomotion +namespace ProtoFlux.Runtimes.Execution.Nodes.Obsidian.Locomotion { [ContinuouslyChanging] [NodeCategory("Obsidian/Locomotion")] diff --git a/ProtoFlux/Interaction/FindGrabbableFromSlot.cs b/ProtoFlux/Interaction/FindGrabbableFromSlot.cs new file mode 100644 index 0000000..ee40b6f --- /dev/null +++ b/ProtoFlux/Interaction/FindGrabbableFromSlot.cs @@ -0,0 +1,19 @@ +using FrooxEngine; +using ProtoFlux.Core; +using ProtoFlux.Runtimes.Execution; + +namespace ProtoFlux.Users.Avatar +{ + [ContinuouslyChanging] + [NodeCategory("ProtoFlux/Obsidian/Avatar")] + public class FindGrabbableFromSlot : ObjectFunctionNode + { + public readonly ObjectInput Slot; + + protected override IGrabbable Compute(ExecutionContext context) + { + Slot slot = Slot.Evaluate(context); + return slot == null ? null : slot.GetComponentInParents(); + } + } +} \ No newline at end of file diff --git a/ProtoFlux/Slots/CreateEmptySlot.cs b/ProtoFlux/Slots/CreateEmptySlot.cs new file mode 100644 index 0000000..4767bfd --- /dev/null +++ b/ProtoFlux/Slots/CreateEmptySlot.cs @@ -0,0 +1,33 @@ +using FrooxEngine; +using FrooxEngine.ProtoFlux; +using ProtoFlux.Core; +using ProtoFlux.Runtimes.Execution; + +namespace ProtoFlux.Users.Avatar +{ + [ContinuouslyChanging] + [NodeCategory("ProtoFlux/Obsidian/Slots")] + public class CreateEmptySlot : ActionBreakableFlowNode + { + public readonly ObjectInput Parent; + public readonly ObjectInput Name; + public readonly ObjectInput Tag; + public readonly ValueInput Persistent; + public readonly ValueInput Active; + + public readonly ObjectOutput Slot; + + protected override bool Do(FrooxEngineContext context) + { + Slot slot = context.LocalUser.LocalUserSpace.AddSlot(); + slot.Parent = Parent.Evaluate(context); + slot.Name = Name.Evaluate(context); + slot.Tag = Tag.Evaluate(context); + slot.PersistentSelf = Persistent.Evaluate(context); + slot.ActiveSelf = Active.Evaluate(context); + + Slot.Write(slot, context); + return true; + } + } +} \ No newline at end of file diff --git a/ProtoFlux/Users/Avatar/AvatarRootSlot.cs b/ProtoFlux/Users/Avatar/AvatarRootSlot.cs new file mode 100644 index 0000000..e186e32 --- /dev/null +++ b/ProtoFlux/Users/Avatar/AvatarRootSlot.cs @@ -0,0 +1,24 @@ +using System.Collections.Generic; +using FrooxEngine; +using FrooxEngine.CommonAvatar; +using ProtoFlux.Core; +using ProtoFlux.Runtimes.Execution; + +namespace ProtoFlux.Users.Avatar +{ + [ContinuouslyChanging] + [NodeCategory("ProtoFlux/Obsidian/Avatar")] + public class AvatarRootSlot : ObjectFunctionNode + { + public readonly ObjectInput User; + + protected override Slot Compute(ExecutionContext context) + { + User user = User.Evaluate(context); + Slot slot = user.Root.Slot; + List list = new List(); + slot.GetFirstDirectComponentsInChildren(list); + return user == null || list.Count == 0 ? null : list[0].Slot; + } + } +} \ No newline at end of file diff --git a/ProtoFlux/Users/Status/IsUserInSeatedMode.cs b/ProtoFlux/Users/Status/IsUserInSeatedMode.cs new file mode 100644 index 0000000..b5ee204 --- /dev/null +++ b/ProtoFlux/Users/Status/IsUserInSeatedMode.cs @@ -0,0 +1,18 @@ +using ProtoFlux.Core; +using ProtoFlux.Runtimes.Execution; + +namespace FrooxEngine.ProtoFlux.Status +{ + [ContinuouslyChanging] + [NodeCategory("ProtoFlux/Obsidian/Status")] + public class IsUserInSeatedModeNode : ValueFunctionNode + { + public readonly ObjectInput User; + + protected override bool Compute(ExecutionContext context) + { + User user = User.Evaluate(context); + return user == null ? false : user.InputInterface.SeatedMode; + } + } +} \ No newline at end of file