diff --git a/ProjectObsidian/ProtoFlux/Math/CeilToInterval_Double.cs b/ProjectObsidian/ProtoFlux/Math/CeilToInterval_Double.cs new file mode 100644 index 0000000..e1c9e5d --- /dev/null +++ b/ProjectObsidian/ProtoFlux/Math/CeilToInterval_Double.cs @@ -0,0 +1,21 @@ +using Elements.Core; +using ProtoFlux.Core; +using ProtoFlux.Runtimes.Execution; +using FrooxEngine.ProtoFlux; + +namespace ProtoFlux.Runtimes.Execution.Nodes.Obsidian.Math +{ + [NodeName("Ceil To Interval")] + [NodeCategory("Obsidian/Math")] + public class CeilToInterval_Double : ValueFunctionNode + { + public ValueInput Value; + public ValueInput Interval; + + protected override double Compute(FrooxEngineContext context) + { + double interval = Interval.Evaluate(context); + return MathX.Ceil(Value.Evaluate(context) / interval) * interval; + } + } +} diff --git a/ProjectObsidian/ProtoFlux/Math/CeilToInterval_Float.cs b/ProjectObsidian/ProtoFlux/Math/CeilToInterval_Float.cs new file mode 100644 index 0000000..3f1c8ee --- /dev/null +++ b/ProjectObsidian/ProtoFlux/Math/CeilToInterval_Float.cs @@ -0,0 +1,21 @@ +using Elements.Core; +using ProtoFlux.Core; +using ProtoFlux.Runtimes.Execution; +using FrooxEngine.ProtoFlux; + +namespace ProtoFlux.Runtimes.Execution.Nodes.Obsidian.Math +{ + [NodeName("Ceil To Interval")] + [NodeCategory("Obsidian/Math")] + public class CeilToInterval_Float : ValueFunctionNode + { + public ValueInput Value; + public ValueInput Interval; + + protected override float Compute(FrooxEngineContext context) + { + float interval = Interval.Evaluate(context); + return MathX.Ceil(Value.Evaluate(context) / interval) * interval; + } + } +} diff --git a/ProjectObsidian/ProtoFlux/Math/FloorToInterval_Double.cs b/ProjectObsidian/ProtoFlux/Math/FloorToInterval_Double.cs new file mode 100644 index 0000000..5ab20af --- /dev/null +++ b/ProjectObsidian/ProtoFlux/Math/FloorToInterval_Double.cs @@ -0,0 +1,21 @@ +using Elements.Core; +using ProtoFlux.Core; +using ProtoFlux.Runtimes.Execution; +using FrooxEngine.ProtoFlux; + +namespace ProtoFlux.Runtimes.Execution.Nodes.Obsidian.Math +{ + [NodeName("Floor To Interval")] + [NodeCategory("Obsidian/Math")] + public class FloorToInterval_Double : ValueFunctionNode + { + public ValueInput Value; + public ValueInput Interval; + + protected override double Compute(FrooxEngineContext context) + { + double interval = Interval.Evaluate(context); + return MathX.Floor(Value.Evaluate(context) / interval) * interval; + } + } +} diff --git a/ProjectObsidian/ProtoFlux/Math/FloorToInterval_Float.cs b/ProjectObsidian/ProtoFlux/Math/FloorToInterval_Float.cs new file mode 100644 index 0000000..a5fbab1 --- /dev/null +++ b/ProjectObsidian/ProtoFlux/Math/FloorToInterval_Float.cs @@ -0,0 +1,21 @@ +using Elements.Core; +using ProtoFlux.Core; +using ProtoFlux.Runtimes.Execution; +using FrooxEngine.ProtoFlux; + +namespace ProtoFlux.Runtimes.Execution.Nodes.Obsidian.Math +{ + [NodeName("Floor To Interval")] + [NodeCategory("Obsidian/Math")] + public class FloorToInterval_Float : ValueFunctionNode + { + public ValueInput Value; + public ValueInput Interval; + + protected override float Compute(FrooxEngineContext context) + { + float interval = Interval.Evaluate(context); + return MathX.Floor(Value.Evaluate(context) / interval) * interval; + } + } +} diff --git a/ProjectObsidian/ProtoFlux/Math/RoundToInterval_Double.cs b/ProjectObsidian/ProtoFlux/Math/RoundToInterval_Double.cs new file mode 100644 index 0000000..21155ab --- /dev/null +++ b/ProjectObsidian/ProtoFlux/Math/RoundToInterval_Double.cs @@ -0,0 +1,21 @@ +using Elements.Core; +using ProtoFlux.Core; +using ProtoFlux.Runtimes.Execution; +using FrooxEngine.ProtoFlux; + +namespace ProtoFlux.Runtimes.Execution.Nodes.Obsidian.Math +{ + [NodeName("Round To Interval")] + [NodeCategory("Obsidian/Math")] + public class RoundToInterval_Double : ValueFunctionNode + { + public ValueInput Value; + public ValueInput Interval; + + protected override double Compute(FrooxEngineContext context) + { + double interval = Interval.Evaluate(context); + return MathX.Round(Value.Evaluate(context) / interval) * interval; + } + } +} diff --git a/ProjectObsidian/ProtoFlux/Math/RoundToInterval_Float.cs b/ProjectObsidian/ProtoFlux/Math/RoundToInterval_Float.cs new file mode 100644 index 0000000..44d40a5 --- /dev/null +++ b/ProjectObsidian/ProtoFlux/Math/RoundToInterval_Float.cs @@ -0,0 +1,21 @@ +using Elements.Core; +using ProtoFlux.Core; +using ProtoFlux.Runtimes.Execution; +using FrooxEngine.ProtoFlux; + +namespace ProtoFlux.Runtimes.Execution.Nodes.Obsidian.Math +{ + [NodeName("Round To Interval")] + [NodeCategory("Obsidian/Math")] + public class RoundToInterval_Float : ValueFunctionNode + { + public ValueInput Value; + public ValueInput Interval; + + protected override float Compute(FrooxEngineContext context) + { + float interval = Interval.Evaluate(context); + return MathX.Round(Value.Evaluate(context) / interval) * interval; + } + } +} diff --git a/ProjectObsidian/ProtoFlux/Users/Avatar/SlotToBodyNode.cs b/ProjectObsidian/ProtoFlux/Users/Avatar/SlotToBodyNode.cs new file mode 100644 index 0000000..1c774b4 --- /dev/null +++ b/ProjectObsidian/ProtoFlux/Users/Avatar/SlotToBodyNode.cs @@ -0,0 +1,40 @@ +using FrooxEngine; +using FrooxEngine.ProtoFlux; +using ProtoFlux.Core; +using ProtoFlux.Runtimes.Execution; +using Renderite.Shared; + +namespace ProtoFlux.Runtimes.Execution.Nodes.Obsidian.Users.Avatar +{ + [NodeCategory("Obsidian/Avatar")] + public class SlotToBodyNode : VoidNode + { + public ObjectArgument Slot; + + public readonly ValueOutput Node; + + protected override void ComputeOutputs(FrooxEngineContext context) + { + Slot slot = 0.ReadObject(context); + BodyNode result = BodyNode.NONE; + + if (slot != null && !slot.IsRemoved) + { + BipedRig rig = slot.GetComponentInParents(); + if (rig != null) + { + result = rig.GetBoneType(slot); + } + } + + Node.Write(result, context); + } + + public SlotToBodyNode() + { + Node = new ValueOutput(this); + } + } +} + +