diff --git a/unity/Runtime/Components/Shapes/MjGeomSettings.cs b/unity/Runtime/Components/Shapes/MjGeomSettings.cs index c06d3981..a78e6f88 100644 --- a/unity/Runtime/Components/Shapes/MjGeomSettings.cs +++ b/unity/Runtime/Components/Shapes/MjGeomSettings.cs @@ -22,6 +22,10 @@ namespace Mujoco { [Serializable] public struct MjGeomSettings { + public enum FluidShapeTypes { + None, + Ellipsoid, + } [Tooltip("Priority")] public int Priority; @@ -35,11 +39,15 @@ public struct MjGeomSettings { [Tooltip("Contact friction parameters for dynamically generated contact pairs.")] public GeomFriction Friction; + [Tooltip("Shape used for fluid simulation.")] + public FluidShapeTypes FluidShapeType; + // Default geom settings. public static MjGeomSettings Default = new MjGeomSettings() { Solver = GeomSolver.Default, Filtering = CollisionFiltering.Default, - Friction = GeomFriction.Default + Friction = GeomFriction.Default, + FluidShapeType = FluidShapeTypes.None }; public void FromMjcf(XmlElement mjcf) { @@ -76,6 +84,10 @@ public struct MjGeomSettings { Friction.Sliding = friction[0]; Friction.Torsional = friction[1]; Friction.Rolling = friction[2]; + + // Fluid shape settings. + FluidShapeType = mjcf.GetEnumAttribute( + "fluidshape", FluidShapeTypes.None, ignoreCase: true); } public void ToMjcf(XmlElement mjcf) { @@ -97,6 +109,9 @@ public struct MjGeomSettings { // Inertia and friction settings. mjcf.SetAttribute("friction", MjEngineTool.MakeLocaleInvariant($"{Friction.Sliding} {Friction.Torsional} {Friction.Rolling}")); + + // Fluid shape settings. + mjcf.SetAttribute("fluidshape", FluidShapeType.ToString().ToLower()); } } diff --git a/unity/Tests/Editor/Components/MjGeomSettingsTests.cs b/unity/Tests/Editor/Components/MjGeomSettingsTests.cs index 56471eab..786d3b09 100644 --- a/unity/Tests/Editor/Components/MjGeomSettingsTests.cs +++ b/unity/Tests/Editor/Components/MjGeomSettingsTests.cs @@ -109,6 +109,13 @@ public class MjGeomSettingsGenerationTests { _settings.ToMjcf(_mjcf); Assert.That(_doc.OuterXml, Does.Contain(@"friction=""5 6 7""")); } + + [Test] + public void FluidShapeTypeMjcf() { + _settings.FluidShapeType = MjGeomSettings.FluidShapeTypes.Ellipsoid; + _settings.ToMjcf(_mjcf); + Assert.That(_doc.OuterXml, Does.Contain(@"fluidshape=""ellipsoid""")); + } } [TestFixture] @@ -199,5 +206,14 @@ public class MjGeomSettingsParsingTests { Assert.That(_settings.Friction.Torsional, Is.EqualTo(6)); Assert.That(_settings.Friction.Rolling, Is.EqualTo(7)); } + + [Test] + public void FluidShapeTypeMjcf() { + _mjcf.SetAttribute("fluidshape", "ellipsoid"); + _settings.FromMjcf(_mjcf); + Assert.That(_settings.FluidShapeType, Is.EqualTo( + MjGeomSettings.FluidShapeTypes.Ellipsoid + )); + } } }