2 using System.Collections.Generic;
9 namespace droid.Runtime.Messaging.FBS {
12 public static class FbsReactionUtilities {
13 static List<Vector3> _vector_out =
new List<Vector3>();
14 static List<float> _float_out =
new List<float>();
19 static Reaction _null_reaction =
new Reaction(null, null, null, null, null,
"");
21 static List<Reaction> _out_reactions =
new List<Reaction>();
27 public static Tuple<Reaction[], bool, string, SimulatorConfigurationMessage> deserialise_reactions(
28 FReactions? reactions) {
29 _out_reactions.Clear();
35 if (reactions.HasValue) {
36 var rs = reactions.Value;
37 for (var i = 0; i < rs.ReactionsLength; i++) {
38 _out_reactions.Add(deserialise_reaction(rs.Reactions(i)));
42 api_version = rs.ApiVersion;
43 if (rs.SimulatorConfiguration.HasValue) {
44 simulator_configuration.FbsParse(rs.SimulatorConfiguration.Value);
48 if (_out_reactions.Count == 0) {
49 Debug.LogWarning(
"Empty reactions received");
52 return new Tuple<Reaction[], bool, String, SimulatorConfigurationMessage>(_out_reactions.ToArray(),
55 simulator_configuration);
62 public static Reaction deserialise_reaction(FReaction? reaction) {
63 if (reaction.HasValue) {
64 var r = reaction.Value;
65 var motions = deserialise_motions(r);
66 var configurations = deserialise_configurations(r);
67 var displayables = deserialise_displayables(r);
68 var unobservables = deserialise_unobservables(r);
69 var parameters = deserialise_parameters(r);
70 var serialised_message = deserialise_serialised_message(r);
81 Debug.LogWarning(
"Empty reaction received");
82 return _null_reaction;
87 #region PrivateMethods 89 static String deserialise_simulator_configuration(FReaction reaction_value) {
93 static String deserialise_serialised_message(FReaction reaction_value) {
94 return reaction_value.SerialisedMessage;
97 static Unobservables deserialise_unobservables(FReaction reaction) {
98 if (reaction.Unobservables.HasValue) {
99 var bodies = deserialise_bodies(reaction.Unobservables.Value);
101 var poses = deserialise_poses(reaction.Unobservables.Value);
110 if (reaction.Parameters.HasValue) {
112 reaction.Parameters.Value.Step,
113 reaction.Parameters.Value.Reset,
114 reaction.Parameters.Value.Configure,
115 reaction.Parameters.Value.Describe,
116 reaction.Parameters.Value.EpisodeCount);
119 return _null_reaction_parameters;
122 static Configuration[] deserialise_configurations(FReaction reaction) {
123 var l = reaction.ConfigurationsLength;
125 for (var i = 0; i < l; i++) {
126 configurations[i] = deserialise_configuration(reaction.Configurations(i));
129 return configurations;
132 static Displayable[] deserialise_displayables(FReaction reaction) {
133 var l = reaction.DisplayablesLength;
135 for (var i = 0; i < l; i++) {
136 configurations[i] = deserialise_displayable(reaction.Displayables(i));
139 return configurations;
142 static Displayable deserialise_displayable(FDisplayable? displayable) {
143 if (displayable.HasValue) {
144 var d = displayable.Value;
146 switch (d.DisplayableValueType) {
150 return new DisplayableFloat(d.DisplayableName, d.DisplayableValue<FValue>()?.Val);
153 var v3 = d.DisplayableValue<
FValues>().GetValueOrDefault();
155 for (var i = 0; i < v3.ValsLength; i++) {
156 _float_out.Add((
float)v3.Vals(i));
162 var v2 = d.DisplayableValue<
FVector3s>().GetValueOrDefault();
164 for (var i = 0; i < v2.PointsLength; i++) {
165 var p = v2.Points(i).GetValueOrDefault();
166 var v =
new Vector3((
float)p.X, (
float)p.Y, (
float)p.Z);
173 var flat_fvec3 = d.DisplayableValue<
FValuedVector3s>().GetValueOrDefault();
176 for (var i = 0; i < flat_fvec3.PointsLength; i++) {
177 var val = (float)flat_fvec3.Vals(i);
178 var p = flat_fvec3.Points(i).GetValueOrDefault();
179 var v =
new Points.
ValuePoint(
new Vector3((
float)p.X, (
float)p.Y, (
float)p.Z), val, 1);
186 return new DisplayableString(d.DisplayableName, d.DisplayableValue<FString>()?.Str);
189 default:
throw new ArgumentOutOfRangeException();
196 static IMotion[] deserialise_motions(FReaction reaction) {
197 var l = reaction.MotionsLength;
199 for (var i = 0; i < l; i++) {
200 motions[i] = deserialise_motion(reaction.Motions(i));
206 static Configuration deserialise_configuration(FConfiguration? configuration) {
207 if (configuration.HasValue) {
208 var c = configuration.Value;
209 var sample_random =
false;
210 return new Configuration(c.ConfigurableName, (
float)c.ConfigurableValue, sample_random);
217 if (motion.HasValue) {
219 motion.Value.ActuatorName,
220 (
float)motion.Value.Strength);
226 static Pose[] deserialise_poses(FUnobservables unobservables) {
227 var l = unobservables.PosesLength;
228 var poses =
new Pose[l];
229 for (var i = 0; i < l; i++) {
230 poses[i] = deserialise_pose(unobservables.Poses(i));
236 static Body[] deserialise_bodies(FUnobservables unobservables) {
237 var l = unobservables.BodiesLength;
238 var bodies =
new Body[l];
239 for (var i = 0; i < l; i++) {
240 bodies[i] = deserialise_body(unobservables.Bodies(i));
246 static Pose deserialise_pose(FQuaternionTransform? trans) {
247 if (trans.HasValue) {
248 var position = trans.Value.Position;
249 var rotation = trans.Value.Rotation;
250 var vec3_pos =
new Vector3((
float)position.X, (
float)position.Y, (
float)position.Z);
251 var quat_rot =
new Quaternion((
float)rotation.X,
255 return new Pose(vec3_pos, quat_rot);
261 static Body deserialise_body(FBody? body) {
264 var ang = body.Value.AngularVelocity;
265 var vec3_vel =
new Vector3((
float)vel.X, (
float)vel.Y, (
float)vel.Z);
266 var vec3_ang =
new Vector3((
float)ang.X, (
float)ang.Y, (
float)ang.Z);
267 return new Body(vec3_vel, vec3_ang);
Has a possible direction given by the sign of the float in strength