Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Are your IOType state methods violating the API of the core type by accessing private fields? #287

Closed
Tracked by #123
samreid opened this issue Jul 29, 2024 · 3 comments

Comments

@samreid
Copy link
Member

samreid commented Jul 29, 2024

From #123 I observed that InterpolatedPropertyIO and MassIO access private/protected members for state. Not sure why this is passing the type checker.

@samreid samreid mentioned this issue Jul 29, 2024
84 tasks
@samreid
Copy link
Member Author

samreid commented Aug 6, 2024

I tried to simplify InterpolatedPropertyIO but ran into problems specifying the IO type:

Subject: [PATCH] Simplify writeData and transformedEmitter, remove TODOs, see https://github.com/phetsims/density-buoyancy-common/issues/231
---
Index: density-buoyancy-common/js/common/view/DebugView.ts
IDEA additional info:
Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP
<+>UTF-8
===================================================================
diff --git a/density-buoyancy-common/js/common/view/DebugView.ts b/density-buoyancy-common/js/common/view/DebugView.ts
--- a/density-buoyancy-common/js/common/view/DebugView.ts	(revision a21ae4f2cab6795d4f3cadcc66711c15dcfefc8d)
+++ b/density-buoyancy-common/js/common/view/DebugView.ts	(date 1722951086912)
@@ -104,7 +104,7 @@
 
     let poolShape = Shape.bounds( new Bounds2(
       this.model.poolBounds.minX, this.model.poolBounds.minY,
-      this.model.poolBounds.maxX, this.model.pool.fluidYInterpolatedProperty.value
+      this.model.poolBounds.maxX, this.model.pool.fluidYInterpolatedProperty.value.y
     ) );
     this.model.masses.forEach( mass => {
       poolShape = this.mutatePoolShape( mass, poolShape );
Index: density-buoyancy-common/js/buoyancy/view/applications/ApplicationsDebugView.ts
IDEA additional info:
Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP
<+>UTF-8
===================================================================
diff --git a/density-buoyancy-common/js/buoyancy/view/applications/ApplicationsDebugView.ts b/density-buoyancy-common/js/buoyancy/view/applications/ApplicationsDebugView.ts
--- a/density-buoyancy-common/js/buoyancy/view/applications/ApplicationsDebugView.ts	(revision a21ae4f2cab6795d4f3cadcc66711c15dcfefc8d)
+++ b/density-buoyancy-common/js/buoyancy/view/applications/ApplicationsDebugView.ts	(date 1722950870902)
@@ -137,7 +137,7 @@
       // @ts-expect-error
       const block = this.model.block;
       const fluidListener = () => {
-        const y = mass.basin.fluidYInterpolatedProperty.value;
+        const y = mass.basin.fluidYInterpolatedProperty.value.y;
 
         if ( mass.basin.fluidVolumeProperty.value > 0 ) {
           const matrix = scratchMatrix.set( this.modelViewTransform.getMatrix() );
Index: density-buoyancy-common/js/common/model/Scale.ts
IDEA additional info:
Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP
<+>UTF-8
===================================================================
diff --git a/density-buoyancy-common/js/common/model/Scale.ts b/density-buoyancy-common/js/common/model/Scale.ts
--- a/density-buoyancy-common/js/common/model/Scale.ts	(revision a21ae4f2cab6795d4f3cadcc66711c15dcfefc8d)
+++ b/density-buoyancy-common/js/common/model/Scale.ts	(date 1722951207713)
@@ -26,6 +26,7 @@
 import PickOptional from '../../../../phet-core/js/types/PickOptional.js';
 import Tandem from '../../../../tandem/js/Tandem.js';
 import GravityProperty from './GravityProperty.js';
+import Vector2 from '../../../../dot/js/Vector2.js';
 
 // constants
 export const SCALE_WIDTH = 0.15;
@@ -71,8 +72,8 @@
 
 export default class Scale extends Mass {
 
-  // In Newtons.
-  public readonly measuredWeightInterpolatedProperty: InterpolatedProperty<number>;
+  // In Newtons. The y-coordinate holds the vertical weight.
+  public readonly measuredWeightInterpolatedProperty: InterpolatedProperty;
 
   // Just exist for phet-io, see https://github.com/phetsims/density/issues/97
   private readonly measuredMassProperty: TReadOnlyProperty<number>;
@@ -113,9 +114,8 @@
 
     super( engine, options );
 
-    this.measuredWeightInterpolatedProperty = new InterpolatedProperty( 0, { // eslint-disable-line tandem-name-should-match
-      interpolate: InterpolatedProperty.interpolateNumber,
-      phetioValueType: NumberIO,
+    this.measuredWeightInterpolatedProperty = new InterpolatedProperty( 0, 0, { // eslint-disable-line tandem-name-should-match
+      phetioValueType: Vector2.Vector2IO,
       tandem: options.tandem.createTandem( 'measuredWeightProperty' ),
       phetioDocumentation: 'Weight measured by the scale, in N.',
       phetioFeatured: true,
@@ -125,7 +125,7 @@
     } );
 
     this.measuredMassProperty = new DerivedProperty( [ this.measuredWeightInterpolatedProperty, gravityProperty.gravityValueProperty ], ( force, gravityValue ) => {
-      return gravityValue === 0 ? 0 : force / gravityValue;
+      return gravityValue === 0 ? 0 : force.y / gravityValue;
     }, {
       phetioValueType: NumberIO,
       tandem: options.tandem.createTandem( 'measuredMassProperty' ),
Index: density-buoyancy-common/js/buoyancy/view/applications/BuoyancyApplicationsScreenView.ts
IDEA additional info:
Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP
<+>UTF-8
===================================================================
diff --git a/density-buoyancy-common/js/buoyancy/view/applications/BuoyancyApplicationsScreenView.ts b/density-buoyancy-common/js/buoyancy/view/applications/BuoyancyApplicationsScreenView.ts
--- a/density-buoyancy-common/js/buoyancy/view/applications/BuoyancyApplicationsScreenView.ts	(revision a21ae4f2cab6795d4f3cadcc66711c15dcfefc8d)
+++ b/density-buoyancy-common/js/buoyancy/view/applications/BuoyancyApplicationsScreenView.ts	(date 1722950937292)
@@ -440,8 +440,8 @@
     let wasFilled = false;
 
     // This instance lives for the lifetime of the simulation, so we don't need to remove this listener
-    model.pool.fluidYInterpolatedProperty.link( y => {
-      wasFilled = this.fillFluidGeometry( y, fluidPositionArray, fluidGeometry, wasFilled );
+    model.pool.fluidYInterpolatedProperty.link( fluidYVector => {
+      wasFilled = this.fillFluidGeometry( fluidYVector.y, fluidPositionArray, fluidGeometry, wasFilled );
     } );
   }
 
Index: density-buoyancy-common/js/buoyancy/view/applications/BoatView.ts
IDEA additional info:
Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP
<+>UTF-8
===================================================================
diff --git a/density-buoyancy-common/js/buoyancy/view/applications/BoatView.ts b/density-buoyancy-common/js/buoyancy/view/applications/BoatView.ts
--- a/density-buoyancy-common/js/buoyancy/view/applications/BoatView.ts	(revision a21ae4f2cab6795d4f3cadcc66711c15dcfefc8d)
+++ b/density-buoyancy-common/js/buoyancy/view/applications/BoatView.ts	(date 1722951345128)
@@ -6,7 +6,6 @@
  * @author Jonathan Olson (PhET Interactive Simulations)
  */
 
-import TReadOnlyProperty from '../../../../../axon/js/TReadOnlyProperty.js';
 import Multilink from '../../../../../axon/js/Multilink.js';
 import densityBuoyancyCommon from '../../../densityBuoyancyCommon.js';
 import Boat from '../../model/applications/Boat.js';
@@ -15,6 +14,7 @@
 import MeasurableMassView from '../../../common/view/MeasurableMassView.js';
 import { THREEModelViewTransform } from '../../../common/view/DensityBuoyancyScreenView.js';
 import DisplayProperties from '../DisplayProperties.js';
+import InterpolatedProperty from '../../../common/model/InterpolatedProperty.js';
 
 type BoatDrawingData = {
   backMiddleMaterial: THREE.MeshBasicMaterial;
@@ -27,7 +27,7 @@
 
   public constructor( boat: Boat,
                       modelViewTransform: THREEModelViewTransform,
-                      fluidYInterpolatedProperty: TReadOnlyProperty<number>,
+                      fluidYInterpolatedProperty: InterpolatedProperty,
                       displayProperties: DisplayProperties ) {
 
     // @ts-expect-error
@@ -76,8 +76,9 @@
       boat.basin.fluidYInterpolatedProperty,
       boat.maxVolumeDisplacedProperty,
       boat.basin.fluidVolumeProperty
-    ], ( boatFluidY, boatDisplacement, boatFluidVolume ) => {
-      const poolFluidY = fluidYInterpolatedProperty.value;
+    ], ( boatFluidYVector, boatDisplacement, boatFluidVolume ) => {
+      const boatFluidY = boatFluidYVector.y;
+      const poolFluidY = fluidYInterpolatedProperty.value.y;
       const liters = boatDisplacement / 0.001;
 
       const relativeBoatFluidY = boatFluidY - boat.matrix.translation.y;
@@ -85,7 +86,7 @@
       const maximumVolume = boat.basin.getEmptyVolume( Number.POSITIVE_INFINITY );
       const volume = boat.basin.fluidVolumeProperty.value;
       const isFull = volume >= maximumVolume - VOLUME_TOLERANCE;
-      if ( boatFluidVolume > 0 && ( !isFull || BoatDesign.shouldBoatFluidDisplayIfFull( fluidYInterpolatedProperty.value - boat.matrix.translation.y, liters ) ) ) {
+      if ( boatFluidVolume > 0 && ( !isFull || BoatDesign.shouldBoatFluidDisplayIfFull( fluidYInterpolatedProperty.value.y - boat.matrix.translation.y, liters ) ) ) {
         BoatDesign.fillCrossSectionVertexArray( relativeBoatFluidY, liters, topFluidPositionArray );
       }
       else {
Index: density-buoyancy-common/js/common/view/PoolScaleHeightControl.ts
IDEA additional info:
Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP
<+>UTF-8
===================================================================
diff --git a/density-buoyancy-common/js/common/view/PoolScaleHeightControl.ts b/density-buoyancy-common/js/common/view/PoolScaleHeightControl.ts
--- a/density-buoyancy-common/js/common/view/PoolScaleHeightControl.ts	(revision a21ae4f2cab6795d4f3cadcc66711c15dcfefc8d)
+++ b/density-buoyancy-common/js/common/view/PoolScaleHeightControl.ts	(date 1722951345114)
@@ -15,7 +15,6 @@
 import Dimension2 from '../../../../dot/js/Dimension2.js';
 import Scale from '../model/Scale.js';
 import Utils from '../../../../dot/js/Utils.js';
-import TReadOnlyProperty from '../../../../axon/js/TReadOnlyProperty.js';
 import Bounds3 from '../../../../dot/js/Bounds3.js';
 import PrecisionSliderThumb from './PrecisionSliderThumb.js';
 import { THREEModelViewTransform } from './DensityBuoyancyScreenView.js';
@@ -28,6 +27,7 @@
 import WithRequired from '../../../../phet-core/js/types/WithRequired.js';
 import { Shape } from '../../../../kite/js/imports.js';
 import PoolScale from '../model/PoolScale.js';
+import InterpolatedProperty from '../model/InterpolatedProperty.js';
 
 // constants
 const DEFAULT_RANGE = new Range( 0, 1 );
@@ -39,7 +39,7 @@
 
   public constructor( poolScale: PoolScale,
                       poolBounds: Bounds3,
-                      fluidYInterpolatedProperty: TReadOnlyProperty<number>,
+                      fluidYInterpolatedProperty: InterpolatedProperty,
                       modelViewTransform: THREEModelViewTransform,
                       providedOptions: ScaleHeightSliderOptions ) {
 
@@ -59,7 +59,7 @@
     } );
 
     const minY = poolBounds.minY;
-    const maxY = fluidYInterpolatedProperty.value + Scale.SCALE_HEIGHT;
+    const maxY = fluidYInterpolatedProperty.value.y + Scale.SCALE_HEIGHT;
 
     const sliderTrackHeight = modelViewTransform.modelToViewDelta( new Vector3( SCALE_X_POSITION, maxY, poolBounds.maxZ ), new Vector3( SCALE_X_POSITION, minY, poolBounds.maxZ ) ).y;
 
Index: density-buoyancy-common/js/common/model/DensityBuoyancyModel.ts
IDEA additional info:
Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP
<+>UTF-8
===================================================================
diff --git a/density-buoyancy-common/js/common/model/DensityBuoyancyModel.ts b/density-buoyancy-common/js/common/model/DensityBuoyancyModel.ts
--- a/density-buoyancy-common/js/common/model/DensityBuoyancyModel.ts	(revision a21ae4f2cab6795d4f3cadcc66711c15dcfefc8d)
+++ b/density-buoyancy-common/js/common/model/DensityBuoyancyModel.ts	(date 1722951086906)
@@ -267,7 +267,7 @@
               }
             }
           } );
-          mass.measuredWeightInterpolatedProperty.setNextValue( scaleForce );
+          mass.measuredWeightInterpolatedProperty.setNextValue( new Vector2( 0, scaleForce ) );
         }
 
         const velocity = PhysicsEngine.bodyGetVelocity( mass.body );
@@ -282,7 +282,7 @@
 
         let submergedVolume = 0;
         if ( basin ) {
-          const displacedVolume = mass.getDisplacedVolume( basin.fluidYInterpolatedProperty.currentValue );
+          const displacedVolume = mass.getDisplacedVolume( basin.fluidYInterpolatedProperty.currentValue.y );
 
           // The submergedVolume of the mass cannot be more than the fluid volume in the basin. Bug fix for https://github.com/phetsims/buoyancy/issues/135
           submergedVolume = displacedVolume > basin.fluidVolumeProperty.value ? basin.fluidVolumeProperty.value : displacedVolume;
Index: density-buoyancy-common/js/common/model/Mass.ts
IDEA additional info:
Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP
<+>UTF-8
===================================================================
diff --git a/density-buoyancy-common/js/common/model/Mass.ts b/density-buoyancy-common/js/common/model/Mass.ts
--- a/density-buoyancy-common/js/common/model/Mass.ts	(revision a21ae4f2cab6795d4f3cadcc66711c15dcfefc8d)
+++ b/density-buoyancy-common/js/common/model/Mass.ts	(date 1722950738219)
@@ -129,9 +129,9 @@
   // the physics engine positional data, but instead appended here to this.matrix.
   protected readonly bodyOffsetProperty: Property<Vector2>;
 
-  public readonly gravityForceInterpolatedProperty: InterpolatedProperty<Vector2>;
-  public readonly buoyancyForceInterpolatedProperty: InterpolatedProperty<Vector2>;
-  public readonly contactForceInterpolatedProperty: InterpolatedProperty<Vector2>;
+  public readonly gravityForceInterpolatedProperty: InterpolatedProperty;
+  public readonly buoyancyForceInterpolatedProperty: InterpolatedProperty;
+  public readonly contactForceInterpolatedProperty: InterpolatedProperty;
 
   // A force with an interpolation to blend new values with old ones to avoid flickering
   public readonly contactForceBlendedProperty: BlendedVector2Property;
@@ -318,8 +318,7 @@
       tandem: Tandem.OPT_OUT
     } );
 
-    this.gravityForceInterpolatedProperty = new InterpolatedProperty( Vector2.ZERO, {
-      interpolate: InterpolatedProperty.interpolateVector2,
+    this.gravityForceInterpolatedProperty = new InterpolatedProperty( 0, 0, {
       valueComparisonStrategy: 'equalsFunction',
       tandem: tandem.createTandem( 'gravityForceInterpolatedProperty' ),
       phetioValueType: Vector2.Vector2IO,
@@ -328,8 +327,7 @@
       phetioHighFrequency: true
     } );
 
-    this.buoyancyForceInterpolatedProperty = new InterpolatedProperty( Vector2.ZERO, {
-      interpolate: InterpolatedProperty.interpolateVector2,
+    this.buoyancyForceInterpolatedProperty = new InterpolatedProperty( 0, 0, {
       valueComparisonStrategy: 'equalsFunction',
       tandem: tandem.createTandem( 'buoyancyForceInterpolatedProperty' ),
       phetioValueType: Vector2.Vector2IO,
@@ -338,8 +336,7 @@
       phetioHighFrequency: true
     } );
 
-    this.contactForceInterpolatedProperty = new InterpolatedProperty( Vector2.ZERO, {
-      interpolate: InterpolatedProperty.interpolateVector2,
+    this.contactForceInterpolatedProperty = new InterpolatedProperty( 0, 0, {
       valueComparisonStrategy: 'equalsFunction',
       tandem: tandem.createTandem( 'contactForceInterpolatedProperty' ),
       phetioValueType: Vector2.Vector2IO,
Index: density-buoyancy-common/js/common/view/DensityBuoyancyScreenView.ts
IDEA additional info:
Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP
<+>UTF-8
===================================================================
diff --git a/density-buoyancy-common/js/common/view/DensityBuoyancyScreenView.ts b/density-buoyancy-common/js/common/view/DensityBuoyancyScreenView.ts
--- a/density-buoyancy-common/js/common/view/DensityBuoyancyScreenView.ts	(revision a21ae4f2cab6795d4f3cadcc66711c15dcfefc8d)
+++ b/density-buoyancy-common/js/common/view/DensityBuoyancyScreenView.ts	(date 1722951138002)
@@ -492,8 +492,8 @@
     let wasFilled = false;
 
     // This instance lives for the lifetime of the simulation, so we don't need to remove this listener
-    model.pool.fluidYInterpolatedProperty.link( y => {
-      wasFilled = this.fillFluidGeometry( y, fluidPositionArray, fluidGeometry, wasFilled );
+    model.pool.fluidYInterpolatedProperty.link( fluidLevel => {
+      wasFilled = this.fillFluidGeometry( fluidLevel.y, fluidPositionArray, fluidGeometry, wasFilled );
     } );
 
     const onMassAdded = ( mass: Mass ) => {
@@ -522,8 +522,8 @@
 
     // TODO: Document the reason for this link: https://github.com/phetsims/density-buoyancy-common/issues/257
     // This instance lives for the lifetime of the simulation, so we don't need to remove this listener
-    model.pool.fluidYInterpolatedProperty.link( fluidY => {
-      const modelPoint = new Vector3( model.poolBounds.minX, fluidY, model.poolBounds.maxZ );
+    model.pool.fluidYInterpolatedProperty.link( fluidLevel => {
+      const modelPoint = new Vector3( model.poolBounds.minX, fluidLevel.y, model.poolBounds.maxZ );
       fluidLevelIndicator.translation = this.modelToViewPoint( modelPoint );
     } );
 
Index: phet-io-sim-specific/repos/buoyancy-basics/buoyancy-basics-phet-io-api.json
IDEA additional info:
Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP
<+>UTF-8
===================================================================
diff --git a/phet-io-sim-specific/repos/buoyancy-basics/buoyancy-basics-phet-io-api.json b/phet-io-sim-specific/repos/buoyancy-basics/buoyancy-basics-phet-io-api.json
--- a/phet-io-sim-specific/repos/buoyancy-basics/buoyancy-basics-phet-io-api.json	(revision ba0431b0c4a1c35fe66bc780f0759e69369d11db)
+++ b/phet-io-sim-specific/repos/buoyancy-basics/buoyancy-basics-phet-io-api.json	(date 1722956075007)
@@ -122,15 +122,6 @@
                 "buoyancyForceInterpolatedProperty": {
                   "_data": {
                     "initialState": {
-                      "currentValue": {
-                        "x": 0,
-                        "y": 0
-                      },
-                      "previousValue": {
-                        "x": 0,
-                        "y": 0
-                      },
-                      "ratio": 0,
                       "units": "N",
                       "validValues": null,
                       "value": {
@@ -142,21 +133,12 @@
                   "_metadata": {
                     "phetioHighFrequency": true,
                     "phetioReadOnly": true,
-                    "phetioTypeName": "InterpolatedPropertyIO<Vector2IO>"
+                    "phetioTypeName": "PropertyIO<Vector2IO>"
                   }
                 },
                 "contactForceInterpolatedProperty": {
                   "_data": {
                     "initialState": {
-                      "currentValue": {
-                        "x": 0,
-                        "y": 0
-                      },
-                      "previousValue": {
-                        "x": 0,
-                        "y": 0
-                      },
-                      "ratio": 0,
                       "units": "N",
                       "validValues": null,
                       "value": {
@@ -168,21 +150,12 @@
                   "_metadata": {
                     "phetioHighFrequency": true,
                     "phetioReadOnly": true,
-                    "phetioTypeName": "InterpolatedPropertyIO<Vector2IO>"
+                    "phetioTypeName": "PropertyIO<Vector2IO>"
                   }
                 },
                 "gravityForceInterpolatedProperty": {
                   "_data": {
                     "initialState": {
-                      "currentValue": {
-                        "x": 0,
-                        "y": 0
-                      },
-                      "previousValue": {
-                        "x": 0,
-                        "y": 0
-                      },
-                      "ratio": 0,
                       "units": "N",
                       "validValues": null,
                       "value": {
@@ -194,7 +167,7 @@
                   "_metadata": {
                     "phetioHighFrequency": true,
                     "phetioReadOnly": true,
-                    "phetioTypeName": "InterpolatedPropertyIO<Vector2IO>"
+                    "phetioTypeName": "PropertyIO<Vector2IO>"
                   }
                 },
                 "inputEnabledProperty": {
@@ -562,15 +535,6 @@
                 "buoyancyForceInterpolatedProperty": {
                   "_data": {
                     "initialState": {
-                      "currentValue": {
-                        "x": 0,
-                        "y": 0
-                      },
-                      "previousValue": {
-                        "x": 0,
-                        "y": 0
-                      },
-                      "ratio": 0,
                       "units": "N",
                       "validValues": null,
                       "value": {
@@ -582,21 +546,12 @@
                   "_metadata": {
                     "phetioHighFrequency": true,
                     "phetioReadOnly": true,
-                    "phetioTypeName": "InterpolatedPropertyIO<Vector2IO>"
+                    "phetioTypeName": "PropertyIO<Vector2IO>"
                   }
                 },
                 "contactForceInterpolatedProperty": {
                   "_data": {
                     "initialState": {
-                      "currentValue": {
-                        "x": 0,
-                        "y": 0
-                      },
-                      "previousValue": {
-                        "x": 0,
-                        "y": 0
-                      },
-                      "ratio": 0,
                       "units": "N",
                       "validValues": null,
                       "value": {
@@ -608,21 +563,12 @@
                   "_metadata": {
                     "phetioHighFrequency": true,
                     "phetioReadOnly": true,
-                    "phetioTypeName": "InterpolatedPropertyIO<Vector2IO>"
+                    "phetioTypeName": "PropertyIO<Vector2IO>"
                   }
                 },
                 "gravityForceInterpolatedProperty": {
                   "_data": {
                     "initialState": {
-                      "currentValue": {
-                        "x": 0,
-                        "y": 0
-                      },
-                      "previousValue": {
-                        "x": 0,
-                        "y": 0
-                      },
-                      "ratio": 0,
                       "units": "N",
                       "validValues": null,
                       "value": {
@@ -634,7 +580,7 @@
                   "_metadata": {
                     "phetioHighFrequency": true,
                     "phetioReadOnly": true,
-                    "phetioTypeName": "InterpolatedPropertyIO<Vector2IO>"
+                    "phetioTypeName": "PropertyIO<Vector2IO>"
                   }
                 },
                 "inputEnabledProperty": {
@@ -1054,15 +1000,6 @@
                 "buoyancyForceInterpolatedProperty": {
                   "_data": {
                     "initialState": {
-                      "currentValue": {
-                        "x": 0,
-                        "y": 0
-                      },
-                      "previousValue": {
-                        "x": 0,
-                        "y": 0
-                      },
-                      "ratio": 0,
                       "units": "N",
                       "validValues": null,
                       "value": {
@@ -1074,21 +1011,12 @@
                   "_metadata": {
                     "phetioHighFrequency": true,
                     "phetioReadOnly": true,
-                    "phetioTypeName": "InterpolatedPropertyIO<Vector2IO>"
+                    "phetioTypeName": "PropertyIO<Vector2IO>"
                   }
                 },
                 "contactForceInterpolatedProperty": {
                   "_data": {
                     "initialState": {
-                      "currentValue": {
-                        "x": 0,
-                        "y": 0
-                      },
-                      "previousValue": {
-                        "x": 0,
-                        "y": 0
-                      },
-                      "ratio": 0,
                       "units": "N",
                       "validValues": null,
                       "value": {
@@ -1100,21 +1028,12 @@
                   "_metadata": {
                     "phetioHighFrequency": true,
                     "phetioReadOnly": true,
-                    "phetioTypeName": "InterpolatedPropertyIO<Vector2IO>"
+                    "phetioTypeName": "PropertyIO<Vector2IO>"
                   }
                 },
                 "gravityForceInterpolatedProperty": {
                   "_data": {
                     "initialState": {
-                      "currentValue": {
-                        "x": 0,
-                        "y": 0
-                      },
-                      "previousValue": {
-                        "x": 0,
-                        "y": 0
-                      },
-                      "ratio": 0,
                       "units": "N",
                       "validValues": null,
                       "value": {
@@ -1126,7 +1045,7 @@
                   "_metadata": {
                     "phetioHighFrequency": true,
                     "phetioReadOnly": true,
-                    "phetioTypeName": "InterpolatedPropertyIO<Vector2IO>"
+                    "phetioTypeName": "PropertyIO<Vector2IO>"
                   }
                 },
                 "inputEnabledProperty": {
@@ -1494,15 +1413,6 @@
                 "buoyancyForceInterpolatedProperty": {
                   "_data": {
                     "initialState": {
-                      "currentValue": {
-                        "x": 0,
-                        "y": 0
-                      },
-                      "previousValue": {
-                        "x": 0,
-                        "y": 0
-                      },
-                      "ratio": 0,
                       "units": "N",
                       "validValues": null,
                       "value": {
@@ -1514,21 +1424,12 @@
                   "_metadata": {
                     "phetioHighFrequency": true,
                     "phetioReadOnly": true,
-                    "phetioTypeName": "InterpolatedPropertyIO<Vector2IO>"
+                    "phetioTypeName": "PropertyIO<Vector2IO>"
                   }
                 },
                 "contactForceInterpolatedProperty": {
                   "_data": {
                     "initialState": {
-                      "currentValue": {
-                        "x": 0,
-                        "y": 0
-                      },
-                      "previousValue": {
-                        "x": 0,
-                        "y": 0
-                      },
-                      "ratio": 0,
                       "units": "N",
                       "validValues": null,
                       "value": {
@@ -1540,21 +1441,12 @@
                   "_metadata": {
                     "phetioHighFrequency": true,
                     "phetioReadOnly": true,
-                    "phetioTypeName": "InterpolatedPropertyIO<Vector2IO>"
+                    "phetioTypeName": "PropertyIO<Vector2IO>"
                   }
                 },
                 "gravityForceInterpolatedProperty": {
                   "_data": {
                     "initialState": {
-                      "currentValue": {
-                        "x": 0,
-                        "y": 0
-                      },
-                      "previousValue": {
-                        "x": 0,
-                        "y": 0
-                      },
-                      "ratio": 0,
                       "units": "N",
                       "validValues": null,
                       "value": {
@@ -1566,7 +1458,7 @@
                   "_metadata": {
                     "phetioHighFrequency": true,
                     "phetioReadOnly": true,
-                    "phetioTypeName": "InterpolatedPropertyIO<Vector2IO>"
+                    "phetioTypeName": "PropertyIO<Vector2IO>"
                   }
                 },
                 "inputEnabledProperty": {
@@ -1986,15 +1878,6 @@
                 "buoyancyForceInterpolatedProperty": {
                   "_data": {
                     "initialState": {
-                      "currentValue": {
-                        "x": 0,
-                        "y": 0
-                      },
-                      "previousValue": {
-                        "x": 0,
-                        "y": 0
-                      },
-                      "ratio": 0,
                       "units": "N",
                       "validValues": null,
                       "value": {
@@ -2006,21 +1889,12 @@
                   "_metadata": {
                     "phetioHighFrequency": true,
                     "phetioReadOnly": true,
-                    "phetioTypeName": "InterpolatedPropertyIO<Vector2IO>"
+                    "phetioTypeName": "PropertyIO<Vector2IO>"
                   }
                 },
                 "contactForceInterpolatedProperty": {
                   "_data": {
                     "initialState": {
-                      "currentValue": {
-                        "x": 0,
-                        "y": 0
-                      },
-                      "previousValue": {
-                        "x": 0,
-                        "y": 0
-                      },
-                      "ratio": 0,
                       "units": "N",
                       "validValues": null,
                       "value": {
@@ -2032,21 +1906,12 @@
                   "_metadata": {
                     "phetioHighFrequency": true,
                     "phetioReadOnly": true,
-                    "phetioTypeName": "InterpolatedPropertyIO<Vector2IO>"
+                    "phetioTypeName": "PropertyIO<Vector2IO>"
                   }
                 },
                 "gravityForceInterpolatedProperty": {
                   "_data": {
                     "initialState": {
-                      "currentValue": {
-                        "x": 0,
-                        "y": 0
-                      },
-                      "previousValue": {
-                        "x": 0,
-                        "y": 0
-                      },
-                      "ratio": 0,
                       "units": "N",
                       "validValues": null,
                       "value": {
@@ -2058,7 +1923,7 @@
                   "_metadata": {
                     "phetioHighFrequency": true,
                     "phetioReadOnly": true,
-                    "phetioTypeName": "InterpolatedPropertyIO<Vector2IO>"
+                    "phetioTypeName": "PropertyIO<Vector2IO>"
                   }
                 },
                 "inputEnabledProperty": {
@@ -2426,15 +2291,6 @@
                 "buoyancyForceInterpolatedProperty": {
                   "_data": {
                     "initialState": {
-                      "currentValue": {
-                        "x": 0,
-                        "y": 0
-                      },
-                      "previousValue": {
-                        "x": 0,
-                        "y": 0
-                      },
-                      "ratio": 0,
                       "units": "N",
                       "validValues": null,
                       "value": {
@@ -2446,21 +2302,12 @@
                   "_metadata": {
                     "phetioHighFrequency": true,
                     "phetioReadOnly": true,
-                    "phetioTypeName": "InterpolatedPropertyIO<Vector2IO>"
+                    "phetioTypeName": "PropertyIO<Vector2IO>"
                   }
                 },
                 "contactForceInterpolatedProperty": {
                   "_data": {
                     "initialState": {
-                      "currentValue": {
-                        "x": 0,
-                        "y": 0
-                      },
-                      "previousValue": {
-                        "x": 0,
-                        "y": 0
-                      },
-                      "ratio": 0,
                       "units": "N",
                       "validValues": null,
                       "value": {
@@ -2472,21 +2319,12 @@
                   "_metadata": {
                     "phetioHighFrequency": true,
                     "phetioReadOnly": true,
-                    "phetioTypeName": "InterpolatedPropertyIO<Vector2IO>"
+                    "phetioTypeName": "PropertyIO<Vector2IO>"
                   }
                 },
                 "gravityForceInterpolatedProperty": {
                   "_data": {
                     "initialState": {
-                      "currentValue": {
-                        "x": 0,
-                        "y": 0
-                      },
-                      "previousValue": {
-                        "x": 0,
-                        "y": 0
-                      },
-                      "ratio": 0,
                       "units": "N",
                       "validValues": null,
                       "value": {
@@ -2498,7 +2336,7 @@
                   "_metadata": {
                     "phetioHighFrequency": true,
                     "phetioReadOnly": true,
-                    "phetioTypeName": "InterpolatedPropertyIO<Vector2IO>"
+                    "phetioTypeName": "PropertyIO<Vector2IO>"
                   }
                 },
                 "inputEnabledProperty": {
@@ -3037,19 +2875,19 @@
               "yInterpolatedProperty": {
                 "_data": {
                   "initialState": {
-                    "currentValue": -0.1388888888888889,
-                    "previousValue": -0.1388888888888889,
-                    "ratio": 0,
                     "units": null,
                     "validValues": null,
-                    "value": -0.1388888888888889
+                    "value": {
+                      "x": 0,
+                      "y": -0.1388888888888889
+                    }
                   }
                 },
                 "_metadata": {
                   "phetioDocumentation": "The y-value of the fluid in model coordinates (where 0 is the top of the pool)",
                   "phetioHighFrequency": true,
                   "phetioReadOnly": true,
-                  "phetioTypeName": "InterpolatedPropertyIO<NumberIO>"
+                  "phetioTypeName": "PropertyIO<Vector2IO>"
                 }
               }
             },
@@ -3130,15 +2968,6 @@
               "buoyancyForceInterpolatedProperty": {
                 "_data": {
                   "initialState": {
-                    "currentValue": {
-                      "x": 0,
-                      "y": 0
-                    },
-                    "previousValue": {
-                      "x": 0,
-                      "y": 0
-                    },
-                    "ratio": 0,
                     "units": "N",
                     "validValues": null,
                     "value": {
@@ -3150,21 +2979,12 @@
                 "_metadata": {
                   "phetioHighFrequency": true,
                   "phetioReadOnly": true,
-                  "phetioTypeName": "InterpolatedPropertyIO<Vector2IO>"
+                  "phetioTypeName": "PropertyIO<Vector2IO>"
                 }
               },
               "contactForceInterpolatedProperty": {
                 "_data": {
                   "initialState": {
-                    "currentValue": {
-                      "x": 0,
-                      "y": 0
-                    },
-                    "previousValue": {
-                      "x": 0,
-                      "y": 0
-                    },
-                    "ratio": 0,
                     "units": "N",
                     "validValues": null,
                     "value": {
@@ -3176,21 +2996,12 @@
                 "_metadata": {
                   "phetioHighFrequency": true,
                   "phetioReadOnly": true,
-                  "phetioTypeName": "InterpolatedPropertyIO<Vector2IO>"
+                  "phetioTypeName": "PropertyIO<Vector2IO>"
                 }
               },
               "gravityForceInterpolatedProperty": {
                 "_data": {
                   "initialState": {
-                    "currentValue": {
-                      "x": 0,
-                      "y": 0
-                    },
-                    "previousValue": {
-                      "x": 0,
-                      "y": 0
-                    },
-                    "ratio": 0,
                     "units": "N",
                     "validValues": null,
                     "value": {
@@ -3202,7 +3013,7 @@
                 "_metadata": {
                   "phetioHighFrequency": true,
                   "phetioReadOnly": true,
-                  "phetioTypeName": "InterpolatedPropertyIO<Vector2IO>"
+                  "phetioTypeName": "PropertyIO<Vector2IO>"
                 }
               },
               "heightProperty": {
@@ -3311,12 +3122,12 @@
               "measuredWeightProperty": {
                 "_data": {
                   "initialState": {
-                    "currentValue": 0,
-                    "previousValue": 0,
-                    "ratio": 0,
                     "units": "N",
                     "validValues": null,
-                    "value": 0
+                    "value": {
+                      "x": 0,
+                      "y": 0
+                    }
                   }
                 },
                 "_metadata": {
@@ -3324,7 +3135,7 @@
                   "phetioFeatured": true,
                   "phetioHighFrequency": true,
                   "phetioReadOnly": true,
-                  "phetioTypeName": "InterpolatedPropertyIO<NumberIO>"
+                  "phetioTypeName": "PropertyIO<Vector2IO>"
                 }
               },
               "percentSubmergedProperty": {
@@ -3539,15 +3350,6 @@
             "buoyancyForceInterpolatedProperty": {
               "_data": {
                 "initialState": {
-                  "currentValue": {
-                    "x": 0,
-                    "y": 0
-                  },
-                  "previousValue": {
-                    "x": 0,
-                    "y": 0
-                  },
-                  "ratio": 0,
                   "units": "N",
                   "validValues": null,
                   "value": {
@@ -3559,21 +3361,12 @@
               "_metadata": {
                 "phetioHighFrequency": true,
                 "phetioReadOnly": true,
-                "phetioTypeName": "InterpolatedPropertyIO<Vector2IO>"
+                "phetioTypeName": "PropertyIO<Vector2IO>"
               }
             },
             "contactForceInterpolatedProperty": {
               "_data": {
                 "initialState": {
-                  "currentValue": {
-                    "x": 0,
-                    "y": 0
-                  },
-                  "previousValue": {
-                    "x": 0,
-                    "y": 0
-                  },
-                  "ratio": 0,
                   "units": "N",
                   "validValues": null,
                   "value": {
@@ -3585,21 +3378,12 @@
               "_metadata": {
                 "phetioHighFrequency": true,
                 "phetioReadOnly": true,
-                "phetioTypeName": "InterpolatedPropertyIO<Vector2IO>"
+                "phetioTypeName": "PropertyIO<Vector2IO>"
               }
             },
             "gravityForceInterpolatedProperty": {
               "_data": {
                 "initialState": {
-                  "currentValue": {
-                    "x": 0,
-                    "y": 0
-                  },
-                  "previousValue": {
-                    "x": 0,
-                    "y": 0
-                  },
-                  "ratio": 0,
                   "units": "N",
                   "validValues": null,
                   "value": {
@@ -3611,7 +3395,7 @@
               "_metadata": {
                 "phetioHighFrequency": true,
                 "phetioReadOnly": true,
-                "phetioTypeName": "InterpolatedPropertyIO<Vector2IO>"
+                "phetioTypeName": "PropertyIO<Vector2IO>"
               }
             },
             "inputEnabledProperty": {
@@ -3699,12 +3483,12 @@
             "measuredWeightProperty": {
               "_data": {
                 "initialState": {
-                  "currentValue": 0,
-                  "previousValue": 0,
-                  "ratio": 0,
                   "units": "N",
                   "validValues": null,
-                  "value": 0
+                  "value": {
+                    "x": 0,
+                    "y": 0
+                  }
                 }
               },
               "_metadata": {
@@ -3712,7 +3496,7 @@
                 "phetioFeatured": true,
                 "phetioHighFrequency": true,
                 "phetioReadOnly": true,
-                "phetioTypeName": "InterpolatedPropertyIO<NumberIO>"
+                "phetioTypeName": "PropertyIO<Vector2IO>"
               }
             },
             "percentSubmergedProperty": {
@@ -7538,15 +7322,6 @@
               "buoyancyForceInterpolatedProperty": {
                 "_data": {
                   "initialState": {
-                    "currentValue": {
-                      "x": 0,
-                      "y": 0
-                    },
-                    "previousValue": {
-                      "x": 0,
-                      "y": 0
-                    },
-                    "ratio": 0,
                     "units": "N",
                     "validValues": null,
                     "value": {
@@ -7558,21 +7333,12 @@
                 "_metadata": {
                   "phetioHighFrequency": true,
                   "phetioReadOnly": true,
-                  "phetioTypeName": "InterpolatedPropertyIO<Vector2IO>"
+                  "phetioTypeName": "PropertyIO<Vector2IO>"
                 }
               },
               "contactForceInterpolatedProperty": {
                 "_data": {
                   "initialState": {
-                    "currentValue": {
-                      "x": 0,
-                      "y": 0
-                    },
-                    "previousValue": {
-                      "x": 0,
-                      "y": 0
-                    },
-                    "ratio": 0,
                     "units": "N",
                     "validValues": null,
                     "value": {
@@ -7584,21 +7350,12 @@
                 "_metadata": {
                   "phetioHighFrequency": true,
                   "phetioReadOnly": true,
-                  "phetioTypeName": "InterpolatedPropertyIO<Vector2IO>"
+                  "phetioTypeName": "PropertyIO<Vector2IO>"
                 }
               },
               "gravityForceInterpolatedProperty": {
                 "_data": {
                   "initialState": {
-                    "currentValue": {
-                      "x": 0,
-                      "y": 0
-                    },
-                    "previousValue": {
-                      "x": 0,
-                      "y": 0
-                    },
-                    "ratio": 0,
                     "units": "N",
                     "validValues": null,
                     "value": {
@@ -7610,7 +7367,7 @@
                 "_metadata": {
                   "phetioHighFrequency": true,
                   "phetioReadOnly": true,
-                  "phetioTypeName": "InterpolatedPropertyIO<Vector2IO>"
+                  "phetioTypeName": "PropertyIO<Vector2IO>"
                 }
               },
               "inputEnabledProperty": {
@@ -7988,15 +7745,6 @@
               "buoyancyForceInterpolatedProperty": {
                 "_data": {
                   "initialState": {
-                    "currentValue": {
-                      "x": 0,
-                      "y": 0
-                    },
-                    "previousValue": {
-                      "x": 0,
-                      "y": 0
-                    },
-                    "ratio": 0,
                     "units": "N",
                     "validValues": null,
                     "value": {
@@ -8008,21 +7756,12 @@
                 "_metadata": {
                   "phetioHighFrequency": true,
                   "phetioReadOnly": true,
-                  "phetioTypeName": "InterpolatedPropertyIO<Vector2IO>"
+                  "phetioTypeName": "PropertyIO<Vector2IO>"
                 }
               },
               "contactForceInterpolatedProperty": {
                 "_data": {
                   "initialState": {
-                    "currentValue": {
-                      "x": 0,
-                      "y": 0
-                    },
-                    "previousValue": {
-                      "x": 0,
-                      "y": 0
-                    },
-                    "ratio": 0,
                     "units": "N",
                     "validValues": null,
                     "value": {
@@ -8034,21 +7773,12 @@
                 "_metadata": {
                   "phetioHighFrequency": true,
                   "phetioReadOnly": true,
-                  "phetioTypeName": "InterpolatedPropertyIO<Vector2IO>"
+                  "phetioTypeName": "PropertyIO<Vector2IO>"
                 }
               },
               "gravityForceInterpolatedProperty": {
                 "_data": {
                   "initialState": {
-                    "currentValue": {
-                      "x": 0,
-                      "y": 0
-                    },
-                    "previousValue": {
-                      "x": 0,
-                      "y": 0
-                    },
-                    "ratio": 0,
                     "units": "N",
                     "validValues": null,
                     "value": {
@@ -8060,7 +7790,7 @@
                 "_metadata": {
                   "phetioHighFrequency": true,
                   "phetioReadOnly": true,
-                  "phetioTypeName": "InterpolatedPropertyIO<Vector2IO>"
+                  "phetioTypeName": "PropertyIO<Vector2IO>"
                 }
               },
               "inputEnabledProperty": {
@@ -8574,19 +8304,19 @@
               "yInterpolatedProperty": {
                 "_data": {
                   "initialState": {
-                    "currentValue": -0.1388888888888889,
-                    "previousValue": -0.1388888888888889,
-                    "ratio": 0,
                     "units": null,
                     "validValues": null,
-                    "value": -0.1388888888888889
+                    "value": {
+                      "x": 0,
+                      "y": -0.1388888888888889
+                    }
                   }
                 },
                 "_metadata": {
                   "phetioDocumentation": "The y-value of the fluid in model coordinates (where 0 is the top of the pool)",
                   "phetioHighFrequency": true,
                   "phetioReadOnly": true,
-                  "phetioTypeName": "InterpolatedPropertyIO<NumberIO>"
+                  "phetioTypeName": "PropertyIO<Vector2IO>"
                 }
               }
             },
@@ -8667,15 +8397,6 @@
               "buoyancyForceInterpolatedProperty": {
                 "_data": {
                   "initialState": {
-                    "currentValue": {
-                      "x": 0,
-                      "y": 0
-                    },
-                    "previousValue": {
-                      "x": 0,
-                      "y": 0
-                    },
-                    "ratio": 0,
                     "units": "N",
                     "validValues": null,
                     "value": {
@@ -8687,21 +8408,12 @@
                 "_metadata": {
                   "phetioHighFrequency": true,
                   "phetioReadOnly": true,
-                  "phetioTypeName": "InterpolatedPropertyIO<Vector2IO>"
+                  "phetioTypeName": "PropertyIO<Vector2IO>"
                 }
               },
               "contactForceInterpolatedProperty": {
                 "_data": {
                   "initialState": {
-                    "currentValue": {
-                      "x": 0,
-                      "y": 0
-                    },
-                    "previousValue": {
-                      "x": 0,
-                      "y": 0
-                    },
-                    "ratio": 0,
                     "units": "N",
                     "validValues": null,
                     "value": {
@@ -8713,21 +8425,12 @@
                 "_metadata": {
                   "phetioHighFrequency": true,
                   "phetioReadOnly": true,
-                  "phetioTypeName": "InterpolatedPropertyIO<Vector2IO>"
+                  "phetioTypeName": "PropertyIO<Vector2IO>"
                 }
               },
               "gravityForceInterpolatedProperty": {
                 "_data": {
                   "initialState": {
-                    "currentValue": {
-                      "x": 0,
-                      "y": 0
-                    },
-                    "previousValue": {
-                      "x": 0,
-                      "y": 0
-                    },
-                    "ratio": 0,
                     "units": "N",
                     "validValues": null,
                     "value": {
@@ -8739,7 +8442,7 @@
                 "_metadata": {
                   "phetioHighFrequency": true,
                   "phetioReadOnly": true,
-                  "phetioTypeName": "InterpolatedPropertyIO<Vector2IO>"
+                  "phetioTypeName": "PropertyIO<Vector2IO>"
                 }
               },
               "heightProperty": {
@@ -8848,12 +8551,12 @@
               "measuredWeightProperty": {
                 "_data": {
                   "initialState": {
-                    "currentValue": 0,
-                    "previousValue": 0,
-                    "ratio": 0,
                     "units": "N",
                     "validValues": null,
-                    "value": 0
+                    "value": {
+                      "x": 0,
+                      "y": 0
+                    }
                   }
                 },
                 "_metadata": {
@@ -8861,7 +8564,7 @@
                   "phetioFeatured": true,
                   "phetioHighFrequency": true,
                   "phetioReadOnly": true,
-                  "phetioTypeName": "InterpolatedPropertyIO<NumberIO>"
+                  "phetioTypeName": "PropertyIO<Vector2IO>"
                 }
               },
               "percentSubmergedProperty": {
@@ -9076,15 +8779,6 @@
             "buoyancyForceInterpolatedProperty": {
               "_data": {
                 "initialState": {
-                  "currentValue": {
-                    "x": 0,
-                    "y": 0
-                  },
-                  "previousValue": {
-                    "x": 0,
-                    "y": 0
-                  },
-                  "ratio": 0,
                   "units": "N",
                   "validValues": null,
                   "value": {
@@ -9096,21 +8790,12 @@
               "_metadata": {
                 "phetioHighFrequency": true,
                 "phetioReadOnly": true,
-                "phetioTypeName": "InterpolatedPropertyIO<Vector2IO>"
+                "phetioTypeName": "PropertyIO<Vector2IO>"
               }
             },
             "contactForceInterpolatedProperty": {
               "_data": {
                 "initialState": {
-                  "currentValue": {
-                    "x": 0,
-                    "y": 0
-                  },
-                  "previousValue": {
-                    "x": 0,
-                    "y": 0
-                  },
-                  "ratio": 0,
                   "units": "N",
                   "validValues": null,
                   "value": {
@@ -9122,21 +8807,12 @@
               "_metadata": {
                 "phetioHighFrequency": true,
                 "phetioReadOnly": true,
-                "phetioTypeName": "InterpolatedPropertyIO<Vector2IO>"
+                "phetioTypeName": "PropertyIO<Vector2IO>"
               }
             },
             "gravityForceInterpolatedProperty": {
               "_data": {
                 "initialState": {
-                  "currentValue": {
-                    "x": 0,
-                    "y": 0
-                  },
-                  "previousValue": {
-                    "x": 0,
-                    "y": 0
-                  },
-                  "ratio": 0,
                   "units": "N",
                   "validValues": null,
                   "value": {
@@ -9148,7 +8824,7 @@
               "_metadata": {
                 "phetioHighFrequency": true,
                 "phetioReadOnly": true,
-                "phetioTypeName": "InterpolatedPropertyIO<Vector2IO>"
+                "phetioTypeName": "PropertyIO<Vector2IO>"
               }
             },
             "inputEnabledProperty": {
@@ -9236,12 +8912,12 @@
             "measuredWeightProperty": {
               "_data": {
                 "initialState": {
-                  "currentValue": 0,
-                  "previousValue": 0,
-                  "ratio": 0,
                   "units": "N",
                   "validValues": null,
-                  "value": 0
+                  "value": {
+                    "x": 0,
+                    "y": 0
+                  }
                 }
               },
               "_metadata": {
@@ -9249,7 +8925,7 @@
                 "phetioFeatured": true,
                 "phetioHighFrequency": true,
                 "phetioReadOnly": true,
-                "phetioTypeName": "InterpolatedPropertyIO<NumberIO>"
+                "phetioTypeName": "PropertyIO<Vector2IO>"
               }
             },
             "percentSubmergedProperty": {
@@ -22439,42 +22115,6 @@
       "supertype": "ObjectIO",
       "typeName": "InputIO"
     },
-    "InterpolatedPropertyIO<NumberIO>": {
-      "dataDefaults": {},
-      "documentation": "Extends PropertyIO to interpolation (with a current/previous value, and a ratio between the two)",
-      "events": [],
-      "metadataDefaults": {},
-      "methodOrder": [],
-      "methods": {},
-      "parameterTypes": [
-        "NumberIO"
-      ],
-      "stateSchema": {
-        "currentValue": "NumberIO",
-        "previousValue": "NumberIO",
-        "ratio": "NumberIO"
-      },
-      "supertype": "PropertyIO<NumberIO>",
-      "typeName": "InterpolatedPropertyIO<NumberIO>"
-    },
-    "InterpolatedPropertyIO<Vector2IO>": {
-      "dataDefaults": {},
-      "documentation": "Extends PropertyIO to interpolation (with a current/previous value, and a ratio between the two)",
-      "events": [],
-      "metadataDefaults": {},
-      "methodOrder": [],
-      "methods": {},
-      "parameterTypes": [
-        "Vector2IO"
-      ],
-      "stateSchema": {
-        "currentValue": "Vector2IO",
-        "previousValue": "Vector2IO",
-        "ratio": "NumberIO"
-      },
-      "supertype": "PropertyIO<Vector2IO>",
-      "typeName": "InterpolatedPropertyIO<Vector2IO>"
-    },
     "LinkedElementIO": {
       "dataDefaults": {},
       "documentation": "A LinkedElement",
Index: phet-io-sim-specific/repos/density/js/density-migration-processors.ts
IDEA additional info:
Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP
<+>UTF-8
===================================================================
diff --git a/phet-io-sim-specific/repos/density/js/density-migration-processors.ts b/phet-io-sim-specific/repos/density/js/density-migration-processors.ts
--- a/phet-io-sim-specific/repos/density/js/density-migration-processors.ts	(revision ba0431b0c4a1c35fe66bc780f0759e69369d11db)
+++ b/phet-io-sim-specific/repos/density/js/density-migration-processors.ts	(date 1722955838604)
@@ -673,7 +673,31 @@
     new DeleteUninstrumentedPhetioElement( 'density.mysteryScreen.model.scale.inputEnabledProperty' ),
 
     // canRotate was removed in https://github.com/phetsims/density-buoyancy-common/issues/277
-    new DeleteStateKey( 'MassIO', 'canRotate' )
+    new DeleteStateKey( 'MassIO', 'canRotate' ),
+
+    new ChangeIOType( 'InterpolatedPropertyIO<NumberIO>', 'InterpolatedPropertyIO', state => {
+      state.currentValue = { x: 0, y: state.currentValue };
+      state.previousValue = { x: 0, y: state.previousValue };
+      // state.ratio = state.ratio;
+    }, {
+      ioTypesToAdd: {
+        InterpolatedPropertyIO: {
+          supertype: 'PropertyIO<Vector2IO>',
+          typeName: 'InterpolatedPropertyIO',
+          stateSchema: {
+            currentValue: 'Vector2IO',
+            previousValue: 'Vector2IO',
+            ratio: 'NumberIO'
+          }
+        }
+      }
+    } ),
+
+    new ChangeIOType( 'InterpolatedPropertyIO<Vector2IO>', 'InterpolatedPropertyIO', state => {
+      // state.currentValue = { x: 0, y: state.currentValue };
+      // state.previousValue = { x: 0, y: state.previousValue };
+    } )
+
   ]
 };
 
Index: density-buoyancy-common/js/buoyancy/model/applications/Boat.ts
IDEA additional info:
Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP
<+>UTF-8
===================================================================
diff --git a/density-buoyancy-common/js/buoyancy/model/applications/Boat.ts b/density-buoyancy-common/js/buoyancy/model/applications/Boat.ts
--- a/density-buoyancy-common/js/buoyancy/model/applications/Boat.ts	(revision a21ae4f2cab6795d4f3cadcc66711c15dcfefc8d)
+++ b/density-buoyancy-common/js/buoyancy/model/applications/Boat.ts	(date 1722950870905)
@@ -244,7 +244,7 @@
   }
 
   public updateVerticalMotion( pool: Pool, dt: number ): void {
-    this.setSubmergedState( pool.fluidYInterpolatedProperty.currentValue );
+    this.setSubmergedState( pool.fluidYInterpolatedProperty.currentValue.y );
     const nextBoatVerticalVelocity = PhysicsEngine.bodyGetVelocity( this.body ).y;
     this.verticalAcceleration = ( nextBoatVerticalVelocity - this.verticalVelocity ) / dt;
     this.verticalVelocity = nextBoatVerticalVelocity;
Index: phet-io-sim-specific/repos/buoyancy/buoyancy-phet-io-api.json
IDEA additional info:
Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP
<+>UTF-8
===================================================================
diff --git a/phet-io-sim-specific/repos/buoyancy/buoyancy-phet-io-api.json b/phet-io-sim-specific/repos/buoyancy/buoyancy-phet-io-api.json
--- a/phet-io-sim-specific/repos/buoyancy/buoyancy-phet-io-api.json	(revision ba0431b0c4a1c35fe66bc780f0759e69369d11db)
+++ b/phet-io-sim-specific/repos/buoyancy/buoyancy-phet-io-api.json	(date 1722956074994)
@@ -189,15 +189,6 @@
               "buoyancyForceInterpolatedProperty": {
                 "_data": {
                   "initialState": {
-                    "currentValue": {
-                      "x": 0,
-                      "y": 0
-                    },
-                    "previousValue": {
-                      "x": 0,
-                      "y": 0
-                    },
-                    "ratio": 0,
                     "units": "N",
                     "validValues": null,
                     "value": {
@@ -209,21 +200,12 @@
                 "_metadata": {
                   "phetioHighFrequency": true,
                   "phetioReadOnly": true,
-                  "phetioTypeName": "InterpolatedPropertyIO<Vector2IO>"
+                  "phetioTypeName": "PropertyIO<Vector2IO>"
                 }
               },
               "contactForceInterpolatedProperty": {
                 "_data": {
                   "initialState": {
-                    "currentValue": {
-                      "x": 0,
-                      "y": 0
-                    },
-                    "previousValue": {
-                      "x": 0,
-                      "y": 0
-                    },
-                    "ratio": 0,
                     "units": "N",
                     "validValues": null,
                     "value": {
@@ -235,21 +217,12 @@
                 "_metadata": {
                   "phetioHighFrequency": true,
                   "phetioReadOnly": true,
-                  "phetioTypeName": "InterpolatedPropertyIO<Vector2IO>"
+                  "phetioTypeName": "PropertyIO<Vector2IO>"
                 }
               },
               "gravityForceInterpolatedProperty": {
                 "_data": {
                   "initialState": {
-                    "currentValue": {
-                      "x": 0,
-                      "y": 0
-                    },
-                    "previousValue": {
-                      "x": 0,
-                      "y": 0
-                    },
-                    "ratio": 0,
                     "units": "N",
                     "validValues": null,
                     "value": {
@@ -261,7 +234,7 @@
                 "_metadata": {
                   "phetioHighFrequency": true,
                   "phetioReadOnly": true,
-                  "phetioTypeName": "InterpolatedPropertyIO<Vector2IO>"
+                  "phetioTypeName": "PropertyIO<Vector2IO>"
                 }
               },
               "inputEnabledProperty": {
@@ -652,15 +625,6 @@
               "buoyancyForceInterpolatedProperty": {
                 "_data": {
                   "initialState": {
-                    "currentValue": {
-                      "x": 0,
-                      "y": 0
-                    },
-                    "previousValue": {
-                      "x": 0,
-                      "y": 0
-                    },
-                    "ratio": 0,
                     "units": "N",
                     "validValues": null,
                     "value": {
@@ -672,21 +636,12 @@
                 "_metadata": {
                   "phetioHighFrequency": true,
                   "phetioReadOnly": true,
-                  "phetioTypeName": "InterpolatedPropertyIO<Vector2IO>"
+                  "phetioTypeName": "PropertyIO<Vector2IO>"
                 }
               },
               "contactForceInterpolatedProperty": {
                 "_data": {
                   "initialState": {
-                    "currentValue": {
-                      "x": 0,
-                      "y": 0
-                    },
-                    "previousValue": {
-                      "x": 0,
-                      "y": 0
-                    },
-                    "ratio": 0,
                     "units": "N",
                     "validValues": null,
                     "value": {
@@ -698,21 +653,12 @@
                 "_metadata": {
                   "phetioHighFrequency": true,
                   "phetioReadOnly": true,
-                  "phetioTypeName": "InterpolatedPropertyIO<Vector2IO>"
+                  "phetioTypeName": "PropertyIO<Vector2IO>"
                 }
               },
               "gravityForceInterpolatedProperty": {
                 "_data": {
                   "initialState": {
-                    "currentValue": {
-                      "x": 0,
-                      "y": 0
-                    },
-                    "previousValue": {
-                      "x": 0,
-                      "y": 0
-                    },
-                    "ratio": 0,
                     "units": "N",
                     "validValues": null,
                     "value": {
@@ -724,7 +670,7 @@
                 "_metadata": {
                   "phetioHighFrequency": true,
                   "phetioReadOnly": true,
-                  "phetioTypeName": "InterpolatedPropertyIO<Vector2IO>"
+                  "phetioTypeName": "PropertyIO<Vector2IO>"
                 }
               },
               "inputEnabledProperty": {
@@ -1047,15 +993,6 @@
               "buoyancyForceInterpolatedProperty": {
                 "_data": {
                   "initialState": {
-                    "currentValue": {
-                      "x": 0,
-                      "y": 0
-                    },
-                    "previousValue": {
-                      "x": 0,
-                      "y": 0
-                    },
-                    "ratio": 0,
                     "units": "N",
                     "validValues": null,
                     "value": {
@@ -1067,21 +1004,12 @@
                 "_metadata": {
                   "phetioHighFrequency": true,
                   "phetioReadOnly": true,
-                  "phetioTypeName": "InterpolatedPropertyIO<Vector2IO>"
+                  "phetioTypeName": "PropertyIO<Vector2IO>"
                 }
               },
               "contactForceInterpolatedProperty": {
                 "_data": {
                   "initialState": {
-                    "currentValue": {
-                      "x": 0,
-                      "y": 0
-                    },
-                    "previousValue": {
-                      "x": 0,
-                      "y": 0
-                    },
-                    "ratio": 0,
                     "units": "N",
                     "validValues": null,
                     "value": {
@@ -1093,21 +1021,12 @@
                 "_metadata": {
                   "phetioHighFrequency": true,
                   "phetioReadOnly": true,
-                  "phetioTypeName": "InterpolatedPropertyIO<Vector2IO>"
+                  "phetioTypeName": "PropertyIO<Vector2IO>"
                 }
               },
               "gravityForceInterpolatedProperty": {
                 "_data": {
                   "initialState": {
-                    "currentValue": {
-                      "x": 0,
-                      "y": 0
-                    },
-                    "previousValue": {
-                      "x": 0,
-                      "y": 0
-                    },
-                    "ratio": 0,
                     "units": "N",
                     "validValues": null,
                     "value": {
@@ -1119,7 +1038,7 @@
                 "_metadata": {
                   "phetioHighFrequency": true,
                   "phetioReadOnly": true,
-                  "phetioTypeName": "InterpolatedPropertyIO<Vector2IO>"
+                  "phetioTypeName": "PropertyIO<Vector2IO>"
                 }
               },
               "inputEnabledProperty": {
@@ -1731,19 +1650,19 @@
               "yInterpolatedProperty": {
                 "_data": {
                   "initialState": {
-                    "currentValue": -0.1388888888888889,
-                    "previousValue": -0.1388888888888889,
-                    "ratio": 0,
                     "units": null,
                     "validValues": null,
-                    "value": -0.1388888888888889
+                    "value": {
+                      "x": 0,
+                      "y": -0.1388888888888889
+                    }
                   }
                 },
                 "_metadata": {
                   "phetioDocumentation": "The y-value of the fluid in model coordinates (where 0 is the top of the pool)",
                   "phetioHighFrequency": true,
                   "phetioReadOnly": true,
-                  "phetioTypeName": "InterpolatedPropertyIO<NumberIO>"
+                  "phetioTypeName": "PropertyIO<Vector2IO>"
                 }
               }
             },
@@ -1824,15 +1743,6 @@
               "buoyancyForceInterpolatedProperty": {
                 "_data": {
                   "initialState": {
-                    "currentValue": {
-                      "x": 0,
-                      "y": 0
-                    },
-                    "previousValue": {
-                      "x": 0,
-                      "y": 0
-                    },
-                    "ratio": 0,
                     "units": "N",
                     "validValues": null,
                     "value": {
@@ -1844,21 +1754,12 @@
                 "_metadata": {
                   "phetioHighFrequency": true,
                   "phetioReadOnly": true,
-                  "phetioTypeName": "InterpolatedPropertyIO<Vector2IO>"
+                  "phetioTypeName": "PropertyIO<Vector2IO>"
                 }
               },
               "contactForceInterpolatedProperty": {
                 "_data": {
                   "initialState": {
-                    "currentValue": {
-                      "x": 0,
-                      "y": 0
-                    },
-                    "previousValue": {
-                      "x": 0,
-                      "y": 0
-                    },
-                    "ratio": 0,
                     "units": "N",
                     "validValues": null,
                     "value": {
@@ -1870,21 +1771,12 @@
                 "_metadata": {
                   "phetioHighFrequency": true,
                   "phetioReadOnly": true,
-                  "phetioTypeName": "InterpolatedPropertyIO<Vector2IO>"
+                  "phetioTypeName": "PropertyIO<Vector2IO>"
                 }
               },
               "gravityForceInterpolatedProperty": {
                 "_data": {
                   "initialState": {
-                    "currentValue": {
-                      "x": 0,
-                      "y": 0
-                    },
-                    "previousValue": {
-                      "x": 0,
-                      "y": 0
-                    },
-                    "ratio": 0,
                     "units": "N",
                     "validValues": null,
                     "value": {
@@ -1896,7 +1788,7 @@
                 "_metadata": {
                   "phetioHighFrequency": true,
                   "phetioReadOnly": true,
-                  "phetioTypeName": "InterpolatedPropertyIO<Vector2IO>"
+                  "phetioTypeName": "PropertyIO<Vector2IO>"
                 }
               },
               "heightProperty": {
@@ -2005,12 +1897,12 @@
               "measuredWeightProperty": {
                 "_data": {
                   "initialState": {
-                    "currentValue": 0,
-                    "previousValue": 0,
-                    "ratio": 0,
                     "units": "N",
                     "validValues": null,
-                    "value": 0
+                    "value": {
+                      "x": 0,
+                      "y": 0
+                    }
                   }
                 },
                 "_metadata": {
@@ -2018,7 +1910,7 @@
                   "phetioFeatured": true,
                   "phetioHighFrequency": true,
                   "phetioReadOnly": true,
-                  "phetioTypeName": "InterpolatedPropertyIO<NumberIO>"
+                  "phetioTypeName": "PropertyIO<Vector2IO>"
                 }
               },
               "percentSubmergedProperty": {
@@ -2233,15 +2125,6 @@
             "buoyancyForceInterpolatedProperty": {
               "_data": {
                 "initialState": {
-                  "currentValue": {
-                    "x": 0,
-                    "y": 0
-                  },
-                  "previousValue": {
-                    "x": 0,
-                    "y": 0
-                  },
-                  "ratio": 0,
                   "units": "N",
                   "validValues": null,
                   "value": {
@@ -2253,21 +2136,12 @@
               "_metadata": {
                 "phetioHighFrequency": true,
                 "phetioReadOnly": true,
-                "phetioTypeName": "InterpolatedPropertyIO<Vector2IO>"
+                "phetioTypeName": "PropertyIO<Vector2IO>"
               }
             },
             "contactForceInterpolatedProperty": {
               "_data": {
                 "initialState": {
-                  "currentValue": {
-                    "x": 0,
-                    "y": 0
-                  },
-                  "previousValue": {
-                    "x": 0,
-                    "y": 0
-                  },
-                  "ratio": 0,
                   "units": "N",
                   "validValues": null,
                   "value": {
@@ -2279,21 +2153,12 @@
               "_metadata": {
                 "phetioHighFrequency": true,
                 "phetioReadOnly": true,
-                "phetioTypeName": "InterpolatedPropertyIO<Vector2IO>"
+                "phetioTypeName": "PropertyIO<Vector2IO>"
               }
             },
             "gravityForceInterpolatedProperty": {
               "_data": {
                 "initialState": {
-                  "currentValue": {
-                    "x": 0,
-                    "y": 0
-                  },
-                  "previousValue": {
-                    "x": 0,
-                    "y": 0
-                  },
-                  "ratio": 0,
                   "units": "N",
                   "validValues": null,
                   "value": {
@@ -2305,7 +2170,7 @@
               "_metadata": {
                 "phetioHighFrequency": true,
                 "phetioReadOnly": true,
-                "phetioTypeName": "InterpolatedPropertyIO<Vector2IO>"
+                "phetioTypeName": "PropertyIO<Vector2IO>"
               }
             },
             "internalVisibleProperty": {
@@ -2379,12 +2244,12 @@
             "measuredWeightProperty": {
               "_data": {
                 "initialState": {
-                  "currentValue": 0,
-                  "previousValue": 0,
-                  "ratio": 0,
                   "units": "N",
                   "validValues": null,
-                  "value": 0
+                  "value": {
+                    "x": 0,
+                    "y": 0
+                  }
                 }
               },
               "_metadata": {
@@ -2392,7 +2257,7 @@
                 "phetioFeatured": true,
                 "phetioHighFrequency": true,
                 "phetioReadOnly": true,
-                "phetioTypeName": "InterpolatedPropertyIO<NumberIO>"
+                "phetioTypeName": "PropertyIO<Vector2IO>"
               }
             },
             "percentSubmergedProperty": {
@@ -9032,15 +8897,6 @@
                 "buoyancyForceInterpolatedProperty": {
                   "_data": {
                     "initialState": {
-                      "currentValue": {
-                        "x": 0,
-                        "y": 0
-                      },
-                      "previousValue": {
-                        "x": 0,
-                        "y": 0
-                      },
-                      "ratio": 0,
                       "units": "N",
                       "validValues": null,
                       "value": {
@@ -9052,21 +8908,12 @@
                   "_metadata": {
                     "phetioHighFrequency": true,
                     "phetioReadOnly": true,
-                    "phetioTypeName": "InterpolatedPropertyIO<Vector2IO>"
+                    "phetioTypeName": "PropertyIO<Vector2IO>"
                   }
                 },
                 "contactForceInterpolatedProperty": {
                   "_data": {
                     "initialState": {
-                      "currentValue": {
-                        "x": 0,
-                        "y": 0
-                      },
-                      "previousValue": {
-                        "x": 0,
-                        "y": 0
-                      },
-                      "ratio": 0,
                       "units": "N",
                       "validValues": null,
                       "value": {
@@ -9078,21 +8925,12 @@
                   "_metadata": {
                     "phetioHighFrequency": true,
                     "phetioReadOnly": true,
-                    "phetioTypeName": "InterpolatedPropertyIO<Vector2IO>"
+                    "phetioTypeName": "PropertyIO<Vector2IO>"
                   }
                 },
                 "gravityForceInterpolatedProperty": {
                   "_data": {
                     "initialState": {
-                      "currentValue": {
-                        "x": 0,
-                        "y": 0
-                      },
-                      "previousValue": {
-                        "x": 0,
-                        "y": 0
-                      },
-                      "ratio": 0,
                       "units": "N",
                       "validValues": null,
                       "value": {
@@ -9104,7 +8942,7 @@
                   "_metadata": {
                     "phetioHighFrequency": true,
                     "phetioReadOnly": true,
-                    "phetioTypeName": "InterpolatedPropertyIO<Vector2IO>"
+                    "phetioTypeName": "PropertyIO<Vector2IO>"
                   }
                 },
                 "inputEnabledProperty": {
@@ -9472,15 +9310,6 @@
                 "buoyancyForceInterpolatedProperty": {
                   "_data": {
                     "initialState": {
-                      "currentValue": {
-                        "x": 0,
-                        "y": 0
-                      },
-                      "previousValue": {
-                        "x": 0,
-                        "y": 0
-                      },
-                      "ratio": 0,
                       "units": "N",
                       "validValues": null,
                       "value": {
@@ -9492,21 +9321,12 @@
                   "_metadata": {
                     "phetioHighFrequency": true,
                     "phetioReadOnly": true,
-                    "phetioTypeName": "InterpolatedPropertyIO<Vector2IO>"
+                    "phetioTypeName": "PropertyIO<Vector2IO>"
                   }
                 },
                 "contactForceInterpolatedProperty": {
                   "_data": {
                     "initialState": {
-                      "currentValue": {
-                        "x": 0,
-                        "y": 0
-                      },
-                      "previousValue": {
-                        "x": 0,
-                        "y": 0
-                      },
-                      "ratio": 0,
                       "units": "N",
                       "validValues": null,
                       "value": {
@@ -9518,21 +9338,12 @@
                   "_metadata": {
                     "phetioHighFrequency": true,
                     "phetioReadOnly": true,
-                    "phetioTypeName": "InterpolatedPropertyIO<Vector2IO>"
+                    "phetioTypeName": "PropertyIO<Vector2IO>"
                   }
                 },
                 "gravityForceInterpolatedProperty": {
                   "_data": {
                     "initialState": {
-                      "currentValue": {
-                        "x": 0,
-                        "y": 0
-                      },
-                      "previousValue": {
-                        "x": 0,
-                        "y": 0
-                      },
-                      "ratio": 0,
                       "units": "N",
                       "validValues": null,
                       "value": {
@@ -9544,7 +9355,7 @@
                   "_metadata": {
                     "phetioHighFrequency": true,
                     "phetioReadOnly": true,
-                    "phetioTypeName": "InterpolatedPropertyIO<Vector2IO>"
+                    "phetioTypeName": "PropertyIO<Vector2IO>"
                   }
                 },
                 "inputEnabledProperty": {
@@ -9964,15 +9775,6 @@
                 "buoyancyForceInterpolatedProperty": {
                   "_data": {
                     "initialState": {
-                      "currentValue": {
-                        "x": 0,
-                        "y": 0
-                      },
-                      "previousValue": {
-                        "x": 0,
-                        "y": 0
-                      },
-                      "ratio": 0,
                       "units": "N",
                       "validValues": null,
                       "value": {
@@ -9984,21 +9786,12 @@
                   "_metadata": {
                     "phetioHighFrequency": true,
                     "phetioReadOnly": true,
-                    "phetioTypeName": "InterpolatedPropertyIO<Vector2IO>"
+                    "phetioTypeName": "PropertyIO<Vector2IO>"
                   }
                 },
                 "contactForceInterpolatedProperty": {
                   "_data": {
                     "initialState": {
-                      "currentValue": {
-                        "x": 0,
-                        "y": 0
-                      },
-                      "previousValue": {
-                        "x": 0,
-                        "y": 0
-                      },
-                      "ratio": 0,
                       "units": "N",
                       "validValues": null,
                       "value": {
@@ -10010,21 +9803,12 @@
                   "_metadata": {
                     "phetioHighFrequency": true,
                     "phetioReadOnly": true,
-                    "phetioTypeName": "InterpolatedPropertyIO<Vector2IO>"
+                    "phetioTypeName": "PropertyIO<Vector2IO>"
                   }
                 },
                 "gravityForceInterpolatedProperty": {
                   "_data": {
                     "initialState": {
-                      "currentValue": {
-                        "x": 0,
-                        "y": 0
-                      },
-                      "previousValue": {
-                        "x": 0,
-                        "y": 0
-                      },
-                      "ratio": 0,
                       "units": "N",
                       "validValues": null,
                       "value": {
@@ -10036,7 +9820,7 @@
                   "_metadata": {
                     "phetioHighFrequency": true,
                     "phetioReadOnly": true,
-                    "phetioTypeName": "InterpolatedPropertyIO<Vector2IO>"
+                    "phetioTypeName": "PropertyIO<Vector2IO>"
                   }
                 },
                 "inputEnabledProperty": {
@@ -10404,15 +10188,6 @@
                 "buoyancyForceInterpolatedProperty": {
                   "_data": {
                     "initialState": {
-                      "currentValue": {
-                        "x": 0,
-                        "y": 0
-                      },
-                      "previousValue": {
-                        "x": 0,
-                        "y": 0
-                      },
-                      "ratio": 0,
                       "units": "N",
                       "validValues": null,
                       "value": {
@@ -10424,21 +10199,12 @@
                   "_metadata": {
                     "phetioHighFrequency": true,
                     "phetioReadOnly": true,
-                    "phetioTypeName": "InterpolatedPropertyIO<Vector2IO>"
+                    "phetioTypeName": "PropertyIO<Vector2IO>"
                   }
                 },
                 "contactForceInterpolatedProperty": {
                   "_data": {
                     "initialState": {
-                      "currentValue": {
-                        "x": 0,
-                        "y": 0
-                      },
-                      "previousValue": {
-                        "x": 0,
-                        "y": 0
-                      },
-                      "ratio": 0,
                       "units": "N",
                       "validValues": null,
                       "value": {
@@ -10450,21 +10216,12 @@
                   "_metadata": {
                     "phetioHighFrequency": true,
                     "phetioReadOnly": true,
-                    "phetioTypeName": "InterpolatedPropertyIO<Vector2IO>"
+                    "phetioTypeName": "PropertyIO<Vector2IO>"
                   }
                 },
                 "gravityForceInterpolatedProperty": {
                   "_data": {
                     "initialState": {
-                      "currentValue": {
-                        "x": 0,
-                        "y": 0
-                      },
-                      "previousValue": {
-                        "x": 0,
-                        "y": 0
-                      },
-                      "ratio": 0,
                       "units": "N",
                       "validValues": null,
                       "value": {
@@ -10476,7 +10233,7 @@
                   "_metadata": {
                     "phetioHighFrequency": true,
                     "phetioReadOnly": true,
-                    "phetioTypeName": "InterpolatedPropertyIO<Vector2IO>"
+                    "phetioTypeName": "PropertyIO<Vector2IO>"
                   }
                 },
                 "inputEnabledProperty": {
@@ -10896,15 +10653,6 @@
                 "buoyancyForceInterpolatedProperty": {
                   "_data": {
                     "initialState": {
-                      "currentValue": {
-                        "x": 0,
-                        "y": 0
-                      },
-                      "previousValue": {
-                        "x": 0,
-                        "y": 0
-                      },
-                      "ratio": 0,
                       "units": "N",
                       "validValues": null,
                       "value": {
@@ -10916,21 +10664,12 @@
                   "_metadata": {
                     "phetioHighFrequency": true,
                     "phetioReadOnly": true,
-                    "phetioTypeName": "InterpolatedPropertyIO<Vector2IO>"
+                    "phetioTypeName": "PropertyIO<Vector2IO>"
                   }
                 },
                 "contactForceInterpolatedProperty": {
                   "_data": {
                     "initialState": {
-                      "currentValue": {
-                        "x": 0,
-                        "y": 0
-                      },
-                      "previousValue": {
-                        "x": 0,
-                        "y": 0
-                      },
-                      "ratio": 0,
                       "units": "N",
                       "validValues": null,
                       "value": {
@@ -10942,21 +10681,12 @@
                   "_metadata": {
                     "phetioHighFrequency": true,
                     "phetioReadOnly": true,
-                    "phetioTypeName": "InterpolatedPropertyIO<Vector2IO>"
+                    "phetioTypeName": "PropertyIO<Vector2IO>"
                   }
                 },
                 "gravityForceInterpolatedProperty": {
                   "_data": {
                     "initialState": {
-                      "currentValue": {
-                        "x": 0,
-                        "y": 0
-                      },
-                      "previousValue": {
-                        "x": 0,
-                        "y": 0
-                      },
-                      "ratio": 0,
                       "units": "N",
                       "validValues": null,
                       "value": {
@@ -10968,7 +10698,7 @@
                   "_metadata": {
                     "phetioHighFrequency": true,
                     "phetioReadOnly": true,
-                    "phetioTypeName": "InterpolatedPropertyIO<Vector2IO>"
+                    "phetioTypeName": "PropertyIO<Vector2IO>"
                   }
                 },
                 "inputEnabledProperty": {
@@ -11336,15 +11066,6 @@
                 "buoyancyForceInterpolatedProperty": {
                   "_data": {
                     "initialState": {
-                      "currentValue": {
-                        "x": 0,
-                        "y": 0
-                      },
-                      "previousValue": {
-                        "x": 0,
-                        "y": 0
-                      },
-                      "ratio": 0,
                       "units": "N",
                       "validValues": null,
                       "value": {
@@ -11356,21 +11077,12 @@
                   "_metadata": {
                     "phetioHighFrequency": true,
                     "phetioReadOnly": true,
-                    "phetioTypeName": "InterpolatedPropertyIO<Vector2IO>"
+                    "phetioTypeName": "PropertyIO<Vector2IO>"
                   }
                 },
                 "contactForceInterpolatedProperty": {
                   "_data": {
                     "initialState": {
-                      "currentValue": {
-                        "x": 0,
-                        "y": 0
-                      },
-                      "previousValue": {
-                        "x": 0,
-                        "y": 0
-                      },
-                      "ratio": 0,
                       "units": "N",
                       "validValues": null,
                       "value": {
@@ -11382,21 +11094,12 @@
                   "_metadata": {
                     "phetioHighFrequency": true,
                     "phetioReadOnly": true,
-                    "phetioTypeName": "InterpolatedPropertyIO<Vector2IO>"
+                    "phetioTypeName": "PropertyIO<Vector2IO>"
                   }
                 },
                 "gravityForceInterpolatedProperty": {
                   "_data": {
                     "initialState": {
-                      "currentValue": {
-                        "x": 0,
-                        "y": 0
-                      },
-                      "previousValue": {
-                        "x": 0,
-                        "y": 0
-                      },
-                      "ratio": 0,
                       "units": "N",
                       "validValues": null,
                       "value": {
@@ -11408,7 +11111,7 @@
                   "_metadata": {
                     "phetioHighFrequency": true,
                     "phetioReadOnly": true,
-                    "phetioTypeName": "InterpolatedPropertyIO<Vector2IO>"
+                    "phetioTypeName": "PropertyIO<Vector2IO>"
                   }
                 },
                 "inputEnabledProperty": {
@@ -11956,19 +11659,19 @@
               "yInterpolatedProperty": {
                 "_data": {
                   "initialState": {
-                    "currentValue": -0.1388888888888889,
-                    "previousValue": -0.1388888888888889,
-                    "ratio": 0,
                     "units": null,
                     "validValues": null,
-                    "value": -0.1388888888888889
+                    "value": {
+                      "x": 0,
+                      "y": -0.1388888888888889
+                    }
                   }
                 },
                 "_metadata": {
                   "phetioDocumentation": "The y-value of the fluid in model coordinates (where 0 is the top of the pool)",
                   "phetioHighFrequency": true,
                   "phetioReadOnly": true,
-                  "phetioTypeName": "InterpolatedPropertyIO<NumberIO>"
+                  "phetioTypeName": "PropertyIO<Vector2IO>"
                 }
               }
             },
@@ -12049,15 +11752,6 @@
               "buoyancyForceInterpolatedProperty": {
                 "_data": {
                   "initialState": {
-                    "currentValue": {
-                      "x": 0,
-                      "y": 0
-                    },
-                    "previousValue": {
-                      "x": 0,
-                      "y": 0
-                    },
-                    "ratio": 0,
                     "units": "N",
                     "validValues": null,
                     "value": {
@@ -12069,21 +11763,12 @@
                 "_metadata": {
                   "phetioHighFrequency": true,
                   "phetioReadOnly": true,
-                  "phetioTypeName": "InterpolatedPropertyIO<Vector2IO>"
+                  "phetioTypeName": "PropertyIO<Vector2IO>"
                 }
               },
               "contactForceInterpolatedProperty": {
                 "_data": {
                   "initialState": {
-                    "currentValue": {
-                      "x": 0,
-                      "y": 0
-                    },
-                    "previousValue": {
-                      "x": 0,
-                      "y": 0
-                    },
-                    "ratio": 0,
                     "units": "N",
                     "validValues": null,
                     "value": {
@@ -12095,21 +11780,12 @@
                 "_metadata": {
                   "phetioHighFrequency": true,
                   "phetioReadOnly": true,
-                  "phetioTypeName": "InterpolatedPropertyIO<Vector2IO>"
+                  "phetioTypeName": "PropertyIO<Vector2IO>"
                 }
               },
               "gravityForceInterpolatedProperty": {
                 "_data": {
                   "initialState": {
-                    "currentValue": {
-                      "x": 0,
-                      "y": 0
-                    },
-                    "previousValue": {
-                      "x": 0,
-                      "y": 0
-                    },
-                    "ratio": 0,
                     "units": "N",
                     "validValues": null,
                     "value": {
@@ -12121,7 +11797,7 @@
                 "_metadata": {
                   "phetioHighFrequency": true,
                   "phetioReadOnly": true,
-                  "phetioTypeName": "InterpolatedPropertyIO<Vector2IO>"
+                  "phetioTypeName": "PropertyIO<Vector2IO>"
                 }
               },
               "heightProperty": {
@@ -12230,12 +11906,12 @@
               "measuredWeightProperty": {
                 "_data": {
                   "initialState": {
-                    "currentValue": 0,
-                    "previousValue": 0,
-                    "ratio": 0,
                     "units": "N",
                     "validValues": null,
-                    "value": 0
+                    "value": {
+                      "x": 0,
+                      "y": 0
+                    }
                   }
                 },
                 "_metadata": {
@@ -12243,7 +11919,7 @@
                   "phetioFeatured": true,
                   "phetioHighFrequency": true,
                   "phetioReadOnly": true,
-                  "phetioTypeName": "InterpolatedPropertyIO<NumberIO>"
+                  "phetioTypeName": "PropertyIO<Vector2IO>"
                 }
               },
               "percentSubmergedProperty": {
@@ -12458,15 +12134,6 @@
             "buoyancyForceInterpolatedProperty": {
               "_data": {
                 "initialState": {
-                  "currentValue": {
-                    "x": 0,
-                    "y": 0
-                  },
-                  "previousValue": {
-                    "x": 0,
-                    "y": 0
-                  },
-                  "ratio": 0,
                   "units": "N",
                   "validValues": null,
                   "value": {
@@ -12478,21 +12145,12 @@
               "_metadata": {
                 "phetioHighFrequency": true,
                 "phetioReadOnly": true,
-                "phetioTypeName": "InterpolatedPropertyIO<Vector2IO>"
+                "phetioTypeName": "PropertyIO<Vector2IO>"
               }
             },
             "contactForceInterpolatedProperty": {
               "_data": {
                 "initialState": {
-                  "currentValue": {
-                    "x": 0,
-                    "y": 0
-                  },
-                  "previousValue": {
-                    "x": 0,
-                    "y": 0
-                  },
-                  "ratio": 0,
                   "units": "N",
                   "validValues": null,
                   "value": {
@@ -12504,21 +12162,12 @@
               "_metadata": {
                 "phetioHighFrequency": true,
                 "phetioReadOnly": true,
-                "phetioTypeName": "InterpolatedPropertyIO<Vector2IO>"
+                "phetioTypeName": "PropertyIO<Vector2IO>"
               }
             },
             "gravityForceInterpolatedProperty": {
               "_data": {
                 "initialState": {
-                  "currentValue": {
-                    "x": 0,
-                    "y": 0
-                  },
-                  "previousValue": {
-                    "x": 0,
-                    "y": 0
-                  },
-                  "ratio": 0,
                   "units": "N",
                   "validValues": null,
                   "value": {
@@ -12530,7 +12179,7 @@
               "_metadata": {
                 "phetioHighFrequency": true,
                 "phetioReadOnly": true,
-                "phetioTypeName": "InterpolatedPropertyIO<Vector2IO>"
+                "phetioTypeName": "PropertyIO<Vector2IO>"
               }
             },
             "inputEnabledProperty": {
@@ -12618,12 +12267,12 @@
             "measuredWeightProperty": {
               "_data": {
                 "initialState": {
-                  "currentValue": 0,
-                  "previousValue": 0,
-                  "ratio": 0,
                   "units": "N",
                   "validValues": null,
-                  "value": 0
+                  "value": {
+                    "x": 0,
+                    "y": 0
+                  }
                 }
               },
               "_metadata": {
@@ -12631,7 +12280,7 @@
                 "phetioFeatured": true,
                 "phetioHighFrequency": true,
                 "phetioReadOnly": true,
-                "phetioTypeName": "InterpolatedPropertyIO<NumberIO>"
+                "phetioTypeName": "PropertyIO<Vector2IO>"
               }
             },
             "percentSubmergedProperty": {
@@ -16457,15 +16106,6 @@
               "buoyancyForceInterpolatedProperty": {
                 "_data": {
                   "initialState": {
-                    "currentValue": {
-                      "x": 0,
-                      "y": 0
-                    },
-                    "previousValue": {
-                      "x": 0,
-                      "y": 0
-                    },
-                    "ratio": 0,
                     "units": "N",
                     "validValues": null,
                     "value": {
@@ -16477,21 +16117,12 @@
                 "_metadata": {
                   "phetioHighFrequency": true,
                   "phetioReadOnly": true,
-                  "phetioTypeName": "InterpolatedPropertyIO<Vector2IO>"
+                  "phetioTypeName": "PropertyIO<Vector2IO>"
                 }
               },
               "contactForceInterpolatedProperty": {
                 "_data": {
                   "initialState": {
-                    "currentValue": {
-                      "x": 0,
-                      "y": 0
-                    },
-                    "previousValue": {
-                      "x": 0,
-                      "y": 0
-                    },
-                    "ratio": 0,
                     "units": "N",
                     "validValues": null,
                     "value": {
@@ -16503,21 +16134,12 @@
                 "_metadata": {
                   "phetioHighFrequency": true,
                   "phetioReadOnly": true,
-                  "phetioTypeName": "InterpolatedPropertyIO<Vector2IO>"
+                  "phetioTypeName": "PropertyIO<Vector2IO>"
                 }
               },
               "gravityForceInterpolatedProperty": {
                 "_data": {
                   "initialState": {
-                    "currentValue": {
-                      "x": 0,
-                      "y": 0
-                    },
-                    "previousValue": {
-                      "x": 0,
-                      "y": 0
-                    },
-                    "ratio": 0,
                     "units": "N",
                     "validValues": null,
                     "value": {
@@ -16529,7 +16151,7 @@
                 "_metadata": {
                   "phetioHighFrequency": true,
                   "phetioReadOnly": true,
-                  "phetioTypeName": "InterpolatedPropertyIO<Vector2IO>"
+                  "phetioTypeName": "PropertyIO<Vector2IO>"
                 }
               },
               "inputEnabledProperty": {
@@ -16913,15 +16535,6 @@
               "buoyancyForceInterpolatedProperty": {
                 "_data": {
                   "initialState": {
-                    "currentValue": {
-                      "x": 0,
-                      "y": 0
-                    },
-                    "previousValue": {
-                      "x": 0,
-                      "y": 0
-                    },
-                    "ratio": 0,
                     "units": "N",
                     "validValues": null,
                     "value": {
@@ -16933,21 +16546,12 @@
                 "_metadata": {
                   "phetioHighFrequency": true,
                   "phetioReadOnly": true,
-                  "phetioTypeName": "InterpolatedPropertyIO<Vector2IO>"
+                  "phetioTypeName": "PropertyIO<Vector2IO>"
                 }
               },
               "contactForceInterpolatedProperty": {
                 "_data": {
                   "initialState": {
-                    "currentValue": {
-                      "x": 0,
-                      "y": 0
-                    },
-                    "previousValue": {
-                      "x": 0,
-                      "y": 0
-                    },
-                    "ratio": 0,
                     "units": "N",
                     "validValues": null,
                     "value": {
@@ -16959,21 +16563,12 @@
                 "_metadata": {
                   "phetioHighFrequency": true,
                   "phetioReadOnly": true,
-                  "phetioTypeName": "InterpolatedPropertyIO<Vector2IO>"
+                  "phetioTypeName": "PropertyIO<Vector2IO>"
                 }
               },
               "gravityForceInterpolatedProperty": {
                 "_data": {
                   "initialState": {
-                    "currentValue": {
-                      "x": 0,
-                      "y": 0
-                    },
-                    "previousValue": {
-                      "x": 0,
-                      "y": 0
-                    },
-                    "ratio": 0,
                     "units": "N",
                     "validValues": null,
                     "value": {
@@ -16985,7 +16580,7 @@
                 "_metadata": {
                   "phetioHighFrequency": true,
                   "phetioReadOnly": true,
-                  "phetioTypeName": "InterpolatedPropertyIO<Vector2IO>"
+                  "phetioTypeName": "PropertyIO<Vector2IO>"
                 }
               },
               "inputEnabledProperty": {
@@ -17577,19 +17172,19 @@
               "yInterpolatedProperty": {
                 "_data": {
                   "initialState": {
-                    "currentValue": -0.1388888888888889,
-                    "previousValue": -0.1388888888888889,
-                    "ratio": 0,
                     "units": null,
                     "validValues": null,
-                    "value": -0.1388888888888889
+                    "value": {
+                      "x": 0,
+                      "y": -0.1388888888888889
+                    }
                   }
                 },
                 "_metadata": {
                   "phetioDocumentation": "The y-value of the fluid in model coordinates (where 0 is the top of the pool)",
                   "phetioHighFrequency": true,
                   "phetioReadOnly": true,
-                  "phetioTypeName": "InterpolatedPropertyIO<NumberIO>"
+                  "phetioTypeName": "PropertyIO<Vector2IO>"
                 }
               }
             },
@@ -17670,15 +17265,6 @@
               "buoyancyForceInterpolatedProperty": {
                 "_data": {
                   "initialState": {
-                    "currentValue": {
-                      "x": 0,
-                      "y": 0
-                    },
-                    "previousValue": {
-                      "x": 0,
-                      "y": 0
-                    },
-                    "ratio": 0,
                     "units": "N",
                     "validValues": null,
                     "value": {
@@ -17690,21 +17276,12 @@
                 "_metadata": {
                   "phetioHighFrequency": true,
                   "phetioReadOnly": true,
-                  "phetioTypeName": "InterpolatedPropertyIO<Vector2IO>"
+                  "phetioTypeName": "PropertyIO<Vector2IO>"
                 }
               },
               "contactForceInterpolatedProperty": {
                 "_data": {
                   "initialState": {
-                    "currentValue": {
-                      "x": 0,
-                      "y": 0
-                    },
-                    "previousValue": {
-                      "x": 0,
-                      "y": 0
-                    },
-                    "ratio": 0,
                     "units": "N",
                     "validValues": null,
                     "value": {
@@ -17716,21 +17293,12 @@
                 "_metadata": {
                   "phetioHighFrequency": true,
                   "phetioReadOnly": true,
-                  "phetioTypeName": "InterpolatedPropertyIO<Vector2IO>"
+                  "phetioTypeName": "PropertyIO<Vector2IO>"
                 }
               },
               "gravityForceInterpolatedProperty": {
                 "_data": {
                   "initialState": {
-                    "currentValue": {
-                      "x": 0,
-                      "y": 0
-                    },
-                    "previousValue": {
-                      "x": 0,
-                      "y": 0
-                    },
-                    "ratio": 0,
                     "units": "N",
                     "validValues": null,
                     "value": {
@@ -17742,7 +17310,7 @@
                 "_metadata": {
                   "phetioHighFrequency": true,
                   "phetioReadOnly": true,
-                  "phetioTypeName": "InterpolatedPropertyIO<Vector2IO>"
+                  "phetioTypeName": "PropertyIO<Vector2IO>"
                 }
               },
               "heightProperty": {
@@ -17851,12 +17419,12 @@
               "measuredWeightProperty": {
                 "_data": {
                   "initialState": {
-                    "currentValue": 0,
-                    "previousValue": 0,
-                    "ratio": 0,
                     "units": "N",
                     "validValues": null,
-                    "value": 0
+                    "value": {
+                      "x": 0,
+                      "y": 0
+                    }
                   }
                 },
                 "_metadata": {
@@ -17864,7 +17432,7 @@
                   "phetioFeatured": true,
                   "phetioHighFrequency": true,
                   "phetioReadOnly": true,
-                  "phetioTypeName": "InterpolatedPropertyIO<NumberIO>"
+                  "phetioTypeName": "PropertyIO<Vector2IO>"
                 }
               },
               "percentSubmergedProperty": {
@@ -18079,15 +17647,6 @@
             "buoyancyForceInterpolatedProperty": {
               "_data": {
                 "initialState": {
-                  "currentValue": {
-                    "x": 0,
-                    "y": 0
-                  },
-                  "previousValue": {
-                    "x": 0,
-                    "y": 0
-                  },
-                  "ratio": 0,
                   "units": "N",
                   "validValues": null,
                   "value": {
@@ -18099,21 +17658,12 @@
               "_metadata": {
                 "phetioHighFrequency": true,
                 "phetioReadOnly": true,
-                "phetioTypeName": "InterpolatedPropertyIO<Vector2IO>"
+                "phetioTypeName": "PropertyIO<Vector2IO>"
               }
             },
             "contactForceInterpolatedProperty": {
               "_data": {
                 "initialState": {
-                  "currentValue": {
-                    "x": 0,
-                    "y": 0
-                  },
-                  "previousValue": {
-                    "x": 0,
-                    "y": 0
-                  },
-                  "ratio": 0,
                   "units": "N",
                   "validValues": null,
                   "value": {
@@ -18125,21 +17675,12 @@
               "_metadata": {
                 "phetioHighFrequency": true,
                 "phetioReadOnly": true,
-                "phetioTypeName": "InterpolatedPropertyIO<Vector2IO>"
+                "phetioTypeName": "PropertyIO<Vector2IO>"
               }
             },
             "gravityForceInterpolatedProperty": {
               "_data": {
                 "initialState": {
-                  "currentValue": {
-                    "x": 0,
-                    "y": 0
-                  },
-                  "previousValue": {
-                    "x": 0,
-                    "y": 0
-                  },
-                  "ratio": 0,
                   "units": "N",
                   "validValues": null,
                   "value": {
@@ -18151,7 +17692,7 @@
               "_metadata": {
                 "phetioHighFrequency": true,
                 "phetioReadOnly": true,
-                "phetioTypeName": "InterpolatedPropertyIO<Vector2IO>"
+                "phetioTypeName": "PropertyIO<Vector2IO>"
               }
             },
             "inputEnabledProperty": {
@@ -18239,12 +17780,12 @@
             "measuredWeightProperty": {
               "_data": {
                 "initialState": {
-                  "currentValue": 0,
-                  "previousValue": 0,
-                  "ratio": 0,
                   "units": "N",
                   "validValues": null,
-                  "value": 0
+                  "value": {
+                    "x": 0,
+                    "y": 0
+                  }
                 }
               },
               "_metadata": {
@@ -18252,7 +17793,7 @@
                 "phetioFeatured": true,
                 "phetioHighFrequency": true,
                 "phetioReadOnly": true,
-                "phetioTypeName": "InterpolatedPropertyIO<NumberIO>"
+                "phetioTypeName": "PropertyIO<Vector2IO>"
               }
             },
             "percentSubmergedProperty": {
@@ -31486,15 +31027,6 @@
             "buoyancyForceInterpolatedProperty": {
               "_data": {
                 "initialState": {
-                  "currentValue": {
-                    "x": 0,
-                    "y": 0
-                  },
-                  "previousValue": {
-                    "x": 0,
-                    "y": 0
-                  },
-                  "ratio": 0,
                   "units": "N",
                   "validValues": null,
                   "value": {
@@ -31506,21 +31038,12 @@
               "_metadata": {
                 "phetioHighFrequency": true,
                 "phetioReadOnly": true,
-                "phetioTypeName": "InterpolatedPropertyIO<Vector2IO>"
+                "phetioTypeName": "PropertyIO<Vector2IO>"
               }
             },
             "contactForceInterpolatedProperty": {
               "_data": {
                 "initialState": {
-                  "currentValue": {
-                    "x": 0,
-                    "y": 0
-                  },
-                  "previousValue": {
-                    "x": 0,
-                    "y": 0
-                  },
-                  "ratio": 0,
                   "units": "N",
                   "validValues": null,
                   "value": {
@@ -31532,21 +31055,12 @@
               "_metadata": {
                 "phetioHighFrequency": true,
                 "phetioReadOnly": true,
-                "phetioTypeName": "InterpolatedPropertyIO<Vector2IO>"
+                "phetioTypeName": "PropertyIO<Vector2IO>"
               }
             },
             "gravityForceInterpolatedProperty": {
               "_data": {
                 "initialState": {
-                  "currentValue": {
-                    "x": 0,
-                    "y": 0
-                  },
-                  "previousValue": {
-                    "x": 0,
-                    "y": 0
-                  },
-                  "ratio": 0,
                   "units": "N",
                   "validValues": null,
                   "value": {
@@ -31558,7 +31072,7 @@
               "_metadata": {
                 "phetioHighFrequency": true,
                 "phetioReadOnly": true,
-                "phetioTypeName": "InterpolatedPropertyIO<Vector2IO>"
+                "phetioTypeName": "PropertyIO<Vector2IO>"
               }
             },
             "inputEnabledProperty": {
@@ -32162,19 +31676,19 @@
               "yInterpolatedProperty": {
                 "_data": {
                   "initialState": {
-                    "currentValue": -0.1388888888888889,
-                    "previousValue": -0.1388888888888889,
-                    "ratio": 0,
                     "units": null,
                     "validValues": null,
-                    "value": -0.1388888888888889
+                    "value": {
+                      "x": 0,
+                      "y": -0.1388888888888889
+                    }
                   }
                 },
                 "_metadata": {
                   "phetioDocumentation": "The y-value of the fluid in model coordinates (where 0 is the top of the pool)",
                   "phetioHighFrequency": true,
                   "phetioReadOnly": true,
-                  "phetioTypeName": "InterpolatedPropertyIO<NumberIO>"
+                  "phetioTypeName": "PropertyIO<Vector2IO>"
                 }
               }
             },
@@ -32255,15 +31769,6 @@
               "buoyancyForceInterpolatedProperty": {
                 "_data": {
                   "initialState": {
-                    "currentValue": {
-                      "x": 0,
-                      "y": 0
-                    },
-                    "previousValue": {
-                      "x": 0,
-                      "y": 0
-                    },
-                    "ratio": 0,
                     "units": "N",
                     "validValues": null,
                     "value": {
@@ -32275,21 +31780,12 @@
                 "_metadata": {
                   "phetioHighFrequency": true,
                   "phetioReadOnly": true,
-                  "phetioTypeName": "InterpolatedPropertyIO<Vector2IO>"
+                  "phetioTypeName": "PropertyIO<Vector2IO>"
                 }
               },
               "contactForceInterpolatedProperty": {
                 "_data": {
                   "initialState": {
-                    "currentValue": {
-                      "x": 0,
-                      "y": 0
-                    },
-                    "previousValue": {
-                      "x": 0,
-                      "y": 0
-                    },
-                    "ratio": 0,
                     "units": "N",
                     "validValues": null,
                     "value": {
@@ -32301,21 +31797,12 @@
                 "_metadata": {
                   "phetioHighFrequency": true,
                   "phetioReadOnly": true,
-                  "phetioTypeName": "InterpolatedPropertyIO<Vector2IO>"
+                  "phetioTypeName": "PropertyIO<Vector2IO>"
                 }
               },
               "gravityForceInterpolatedProperty": {
                 "_data": {
                   "initialState": {
-                    "currentValue": {
-                      "x": 0,
-                      "y": 0
-                    },
-                    "previousValue": {
-                      "x": 0,
-                      "y": 0
-                    },
-                    "ratio": 0,
                     "units": "N",
                     "validValues": null,
                     "value": {
@@ -32327,7 +31814,7 @@
                 "_metadata": {
                   "phetioHighFrequency": true,
                   "phetioReadOnly": true,
-                  "phetioTypeName": "InterpolatedPropertyIO<Vector2IO>"
+                  "phetioTypeName": "PropertyIO<Vector2IO>"
                 }
               },
               "heightProperty": {
@@ -32436,12 +31923,12 @@
               "measuredWeightProperty": {
                 "_data": {
                   "initialState": {
-                    "currentValue": 0,
-                    "previousValue": 0,
-                    "ratio": 0,
                     "units": "N",
                     "validValues": null,
-                    "value": 0
+                    "value": {
+                      "x": 0,
+                      "y": 0
+                    }
                   }
                 },
                 "_metadata": {
@@ -32449,7 +31936,7 @@
                   "phetioFeatured": true,
                   "phetioHighFrequency": true,
                   "phetioReadOnly": true,
-                  "phetioTypeName": "InterpolatedPropertyIO<NumberIO>"
+                  "phetioTypeName": "PropertyIO<Vector2IO>"
                 }
               },
               "percentSubmergedProperty": {
@@ -32664,15 +32151,6 @@
             "buoyancyForceInterpolatedProperty": {
               "_data": {
                 "initialState": {
-                  "currentValue": {
-                    "x": 0,
-                    "y": 0
-                  },
-                  "previousValue": {
-                    "x": 0,
-                    "y": 0
-                  },
-                  "ratio": 0,
                   "units": "N",
                   "validValues": null,
                   "value": {
@@ -32684,21 +32162,12 @@
               "_metadata": {
                 "phetioHighFrequency": true,
                 "phetioReadOnly": true,
-                "phetioTypeName": "InterpolatedPropertyIO<Vector2IO>"
+                "phetioTypeName": "PropertyIO<Vector2IO>"
               }
             },
             "contactForceInterpolatedProperty": {
               "_data": {
                 "initialState": {
-                  "currentValue": {
-                    "x": 0,
-                    "y": 0
-                  },
-                  "previousValue": {
-                    "x": 0,
-                    "y": 0
-                  },
-                  "ratio": 0,
                   "units": "N",
                   "validValues": null,
                   "value": {
@@ -32710,21 +32179,12 @@
               "_metadata": {
                 "phetioHighFrequency": true,
                 "phetioReadOnly": true,
-                "phetioTypeName": "InterpolatedPropertyIO<Vector2IO>"
+                "phetioTypeName": "PropertyIO<Vector2IO>"
               }
             },
             "gravityForceInterpolatedProperty": {
               "_data": {
                 "initialState": {
-                  "currentValue": {
-                    "x": 0,
-                    "y": 0
-                  },
-                  "previousValue": {
-                    "x": 0,
-                    "y": 0
-                  },
-                  "ratio": 0,
                   "units": "N",
                   "validValues": null,
                   "value": {
@@ -32736,7 +32196,7 @@
               "_metadata": {
                 "phetioHighFrequency": true,
                 "phetioReadOnly": true,
-                "phetioTypeName": "InterpolatedPropertyIO<Vector2IO>"
+                "phetioTypeName": "PropertyIO<Vector2IO>"
               }
             },
             "internalVisibleProperty": {
@@ -32810,12 +32270,12 @@
             "measuredWeightProperty": {
               "_data": {
                 "initialState": {
-                  "currentValue": 0,
-                  "previousValue": 0,
-                  "ratio": 0,
                   "units": "N",
                   "validValues": null,
-                  "value": 0
+                  "value": {
+                    "x": 0,
+                    "y": 0
+                  }
                 }
               },
               "_metadata": {
@@ -32823,7 +32283,7 @@
                 "phetioFeatured": true,
                 "phetioHighFrequency": true,
                 "phetioReadOnly": true,
-                "phetioTypeName": "InterpolatedPropertyIO<NumberIO>"
+                "phetioTypeName": "PropertyIO<Vector2IO>"
               }
             },
             "percentSubmergedProperty": {
@@ -38016,15 +37476,6 @@
                   "buoyancyForceInterpolatedProperty": {
                     "_data": {
                       "initialState": {
-                        "currentValue": {
-                          "x": 0,
-                          "y": 0
-                        },
-                        "previousValue": {
-                          "x": 0,
-                          "y": 0
-                        },
-                        "ratio": 0,
                         "units": "N",
                         "validValues": null,
                         "value": {
@@ -38036,21 +37487,12 @@
                     "_metadata": {
                       "phetioHighFrequency": true,
                       "phetioReadOnly": true,
-                      "phetioTypeName": "InterpolatedPropertyIO<Vector2IO>"
+                      "phetioTypeName": "PropertyIO<Vector2IO>"
                     }
                   },
                   "contactForceInterpolatedProperty": {
                     "_data": {
                       "initialState": {
-                        "currentValue": {
-                          "x": 0,
-                          "y": 0
-                        },
-                        "previousValue": {
-                          "x": 0,
-                          "y": 0
-                        },
-                        "ratio": 0,
                         "units": "N",
                         "validValues": null,
                         "value": {
@@ -38062,21 +37504,12 @@
                     "_metadata": {
                       "phetioHighFrequency": true,
                       "phetioReadOnly": true,
-                      "phetioTypeName": "InterpolatedPropertyIO<Vector2IO>"
+                      "phetioTypeName": "PropertyIO<Vector2IO>"
                     }
                   },
                   "gravityForceInterpolatedProperty": {
                     "_data": {
                       "initialState": {
-                        "currentValue": {
-                          "x": 0,
-                          "y": 0
-                        },
-                        "previousValue": {
-                          "x": 0,
-                          "y": 0
-                        },
-                        "ratio": 0,
                         "units": "N",
                         "validValues": null,
                         "value": {
@@ -38088,7 +37521,7 @@
                     "_metadata": {
                       "phetioHighFrequency": true,
                       "phetioReadOnly": true,
-                      "phetioTypeName": "InterpolatedPropertyIO<Vector2IO>"
+                      "phetioTypeName": "PropertyIO<Vector2IO>"
                     }
                   },
                   "inputEnabledProperty": {
@@ -38423,15 +37856,6 @@
                   "buoyancyForceInterpolatedProperty": {
                     "_data": {
                       "initialState": {
-                        "currentValue": {
-                          "x": 0,
-                          "y": 0
-                        },
-                        "previousValue": {
-                          "x": 0,
-                          "y": 0
-                        },
-                        "ratio": 0,
                         "units": "N",
                         "validValues": null,
                         "value": {
@@ -38443,21 +37867,12 @@
                     "_metadata": {
                       "phetioHighFrequency": true,
                       "phetioReadOnly": true,
-                      "phetioTypeName": "InterpolatedPropertyIO<Vector2IO>"
+                      "phetioTypeName": "PropertyIO<Vector2IO>"
                     }
                   },
                   "contactForceInterpolatedProperty": {
                     "_data": {
                       "initialState": {
-                        "currentValue": {
-                          "x": 0,
-                          "y": 0
-                        },
-                        "previousValue": {
-                          "x": 0,
-                          "y": 0
-                        },
-                        "ratio": 0,
                         "units": "N",
                         "validValues": null,
                         "value": {
@@ -38469,21 +37884,12 @@
                     "_metadata": {
                       "phetioHighFrequency": true,
                       "phetioReadOnly": true,
-                      "phetioTypeName": "InterpolatedPropertyIO<Vector2IO>"
+                      "phetioTypeName": "PropertyIO<Vector2IO>"
                     }
                   },
                   "gravityForceInterpolatedProperty": {
                     "_data": {
                       "initialState": {
-                        "currentValue": {
-                          "x": 0,
-                          "y": 0
-                        },
-                        "previousValue": {
-                          "x": 0,
-                          "y": 0
-                        },
-                        "ratio": 0,
                         "units": "N",
                         "validValues": null,
                         "value": {
@@ -38495,7 +37901,7 @@
                     "_metadata": {
                       "phetioHighFrequency": true,
                       "phetioReadOnly": true,
-                      "phetioTypeName": "InterpolatedPropertyIO<Vector2IO>"
+                      "phetioTypeName": "PropertyIO<Vector2IO>"
                     }
                   },
                   "heightProperty": {
@@ -38879,15 +38285,6 @@
                   "buoyancyForceInterpolatedProperty": {
                     "_data": {
                       "initialState": {
-                        "currentValue": {
-                          "x": 0,
-                          "y": 0
-                        },
-                        "previousValue": {
-                          "x": 0,
-                          "y": 0
-                        },
-                        "ratio": 0,
                         "units": "N",
                         "validValues": null,
                         "value": {
@@ -38899,21 +38296,12 @@
                     "_metadata": {
                       "phetioHighFrequency": true,
                       "phetioReadOnly": true,
-                      "phetioTypeName": "InterpolatedPropertyIO<Vector2IO>"
+                      "phetioTypeName": "PropertyIO<Vector2IO>"
                     }
                   },
                   "contactForceInterpolatedProperty": {
                     "_data": {
                       "initialState": {
-                        "currentValue": {
-                          "x": 0,
-                          "y": 0
-                        },
-                        "previousValue": {
-                          "x": 0,
-                          "y": 0
-                        },
-                        "ratio": 0,
                         "units": "N",
                         "validValues": null,
                         "value": {
@@ -38925,21 +38313,12 @@
                     "_metadata": {
                       "phetioHighFrequency": true,
                       "phetioReadOnly": true,
-                      "phetioTypeName": "InterpolatedPropertyIO<Vector2IO>"
+                      "phetioTypeName": "PropertyIO<Vector2IO>"
                     }
                   },
                   "gravityForceInterpolatedProperty": {
                     "_data": {
                       "initialState": {
-                        "currentValue": {
-                          "x": 0,
-                          "y": 0
-                        },
-                        "previousValue": {
-                          "x": 0,
-                          "y": 0
-                        },
-                        "ratio": 0,
                         "units": "N",
                         "validValues": null,
                         "value": {
@@ -38951,7 +38330,7 @@
                     "_metadata": {
                       "phetioHighFrequency": true,
                       "phetioReadOnly": true,
-                      "phetioTypeName": "InterpolatedPropertyIO<Vector2IO>"
+                      "phetioTypeName": "PropertyIO<Vector2IO>"
                     }
                   },
                   "inputEnabledProperty": {
@@ -39285,15 +38664,6 @@
                   "buoyancyForceInterpolatedProperty": {
                     "_data": {
                       "initialState": {
-                        "currentValue": {
-                          "x": 0,
-                          "y": 0
-                        },
-                        "previousValue": {
-                          "x": 0,
-                          "y": 0
-                        },
-                        "ratio": 0,
                         "units": "N",
                         "validValues": null,
                         "value": {
@@ -39305,21 +38675,12 @@
                     "_metadata": {
                       "phetioHighFrequency": true,
                       "phetioReadOnly": true,
-                      "phetioTypeName": "InterpolatedPropertyIO<Vector2IO>"
+                      "phetioTypeName": "PropertyIO<Vector2IO>"
                     }
                   },
                   "contactForceInterpolatedProperty": {
                     "_data": {
                       "initialState": {
-                        "currentValue": {
-                          "x": 0,
-                          "y": 0
-                        },
-                        "previousValue": {
-                          "x": 0,
-                          "y": 0
-                        },
-                        "ratio": 0,
                         "units": "N",
                         "validValues": null,
                         "value": {
@@ -39331,21 +38692,12 @@
                     "_metadata": {
                       "phetioHighFrequency": true,
                       "phetioReadOnly": true,
-                      "phetioTypeName": "InterpolatedPropertyIO<Vector2IO>"
+                      "phetioTypeName": "PropertyIO<Vector2IO>"
                     }
                   },
                   "gravityForceInterpolatedProperty": {
                     "_data": {
                       "initialState": {
-                        "currentValue": {
-                          "x": 0,
-                          "y": 0
-                        },
-                        "previousValue": {
-                          "x": 0,
-                          "y": 0
-                        },
-                        "ratio": 0,
                         "units": "N",
                         "validValues": null,
                         "value": {
@@ -39357,7 +38709,7 @@
                     "_metadata": {
                       "phetioHighFrequency": true,
                       "phetioReadOnly": true,
-                      "phetioTypeName": "InterpolatedPropertyIO<Vector2IO>"
+                      "phetioTypeName": "PropertyIO<Vector2IO>"
                     }
                   },
                   "inputEnabledProperty": {
@@ -39691,15 +39043,6 @@
                   "buoyancyForceInterpolatedProperty": {
                     "_data": {
                       "initialState": {
-                        "currentValue": {
-                          "x": 0,
-                          "y": 0
-                        },
-                        "previousValue": {
-                          "x": 0,
-                          "y": 0
-                        },
-                        "ratio": 0,
                         "units": "N",
                         "validValues": null,
                         "value": {
@@ -39711,21 +39054,12 @@
                     "_metadata": {
                       "phetioHighFrequency": true,
                       "phetioReadOnly": true,
-                      "phetioTypeName": "InterpolatedPropertyIO<Vector2IO>"
+                      "phetioTypeName": "PropertyIO<Vector2IO>"
                     }
                   },
                   "contactForceInterpolatedProperty": {
                     "_data": {
                       "initialState": {
-                        "currentValue": {
-                          "x": 0,
-                          "y": 0
-                        },
-                        "previousValue": {
-                          "x": 0,
-                          "y": 0
-                        },
-                        "ratio": 0,
                         "units": "N",
                         "validValues": null,
                         "value": {
@@ -39737,21 +39071,12 @@
                     "_metadata": {
                       "phetioHighFrequency": true,
                       "phetioReadOnly": true,
-                      "phetioTypeName": "InterpolatedPropertyIO<Vector2IO>"
+                      "phetioTypeName": "PropertyIO<Vector2IO>"
                     }
                   },
                   "gravityForceInterpolatedProperty": {
                     "_data": {
                       "initialState": {
-                        "currentValue": {
-                          "x": 0,
-                          "y": 0
-                        },
-                        "previousValue": {
-                          "x": 0,
-                          "y": 0
-                        },
-                        "ratio": 0,
                         "units": "N",
                         "validValues": null,
                         "value": {
@@ -39763,7 +39088,7 @@
                     "_metadata": {
                       "phetioHighFrequency": true,
                       "phetioReadOnly": true,
-                      "phetioTypeName": "InterpolatedPropertyIO<Vector2IO>"
+                      "phetioTypeName": "PropertyIO<Vector2IO>"
                     }
                   },
                   "inputEnabledProperty": {
@@ -40147,15 +39472,6 @@
                   "buoyancyForceInterpolatedProperty": {
                     "_data": {
                       "initialState": {
-                        "currentValue": {
-                          "x": 0,
-                          "y": 0
-                        },
-                        "previousValue": {
-                          "x": 0,
-                          "y": 0
-                        },
-                        "ratio": 0,
                         "units": "N",
                         "validValues": null,
                         "value": {
@@ -40167,21 +39483,12 @@
                     "_metadata": {
                       "phetioHighFrequency": true,
                       "phetioReadOnly": true,
-                      "phetioTypeName": "InterpolatedPropertyIO<Vector2IO>"
+                      "phetioTypeName": "PropertyIO<Vector2IO>"
                     }
                   },
                   "contactForceInterpolatedProperty": {
                     "_data": {
                       "initialState": {
-                        "currentValue": {
-                          "x": 0,
-                          "y": 0
-                        },
-                        "previousValue": {
-                          "x": 0,
-                          "y": 0
-                        },
-                        "ratio": 0,
                         "units": "N",
                         "validValues": null,
                         "value": {
@@ -40193,21 +39500,12 @@
                     "_metadata": {
                       "phetioHighFrequency": true,
                       "phetioReadOnly": true,
-                      "phetioTypeName": "InterpolatedPropertyIO<Vector2IO>"
+                      "phetioTypeName": "PropertyIO<Vector2IO>"
                     }
                   },
                   "gravityForceInterpolatedProperty": {
                     "_data": {
                       "initialState": {
-                        "currentValue": {
-                          "x": 0,
-                          "y": 0
-                        },
-                        "previousValue": {
-                          "x": 0,
-                          "y": 0
-                        },
-                        "ratio": 0,
                         "units": "N",
                         "validValues": null,
                         "value": {
@@ -40219,7 +39517,7 @@
                     "_metadata": {
                       "phetioHighFrequency": true,
                       "phetioReadOnly": true,
-                      "phetioTypeName": "InterpolatedPropertyIO<Vector2IO>"
+                      "phetioTypeName": "PropertyIO<Vector2IO>"
                     }
                   },
                   "heightProperty": {
@@ -40603,15 +39901,6 @@
                   "buoyancyForceInterpolatedProperty": {
                     "_data": {
                       "initialState": {
-                        "currentValue": {
-                          "x": 0,
-                          "y": 0
-                        },
-                        "previousValue": {
-                          "x": 0,
-                          "y": 0
-                        },
-                        "ratio": 0,
                         "units": "N",
                         "validValues": null,
                         "value": {
@@ -40623,21 +39912,12 @@
                     "_metadata": {
                       "phetioHighFrequency": true,
                       "phetioReadOnly": true,
-                      "phetioTypeName": "InterpolatedPropertyIO<Vector2IO>"
+                      "phetioTypeName": "PropertyIO<Vector2IO>"
                     }
                   },
                   "contactForceInterpolatedProperty": {
                     "_data": {
                       "initialState": {
-                        "currentValue": {
-                          "x": 0,
-                          "y": 0
-                        },
-                        "previousValue": {
-                          "x": 0,
-                          "y": 0
-                        },
-                        "ratio": 0,
                         "units": "N",
                         "validValues": null,
                         "value": {
@@ -40649,21 +39929,12 @@
                     "_metadata": {
                       "phetioHighFrequency": true,
                       "phetioReadOnly": true,
-                      "phetioTypeName": "InterpolatedPropertyIO<Vector2IO>"
+                      "phetioTypeName": "PropertyIO<Vector2IO>"
                     }
                   },
                   "gravityForceInterpolatedProperty": {
                     "_data": {
                       "initialState": {
-                        "currentValue": {
-                          "x": 0,
-                          "y": 0
-                        },
-                        "previousValue": {
-                          "x": 0,
-                          "y": 0
-                        },
-                        "ratio": 0,
                         "units": "N",
                         "validValues": null,
                         "value": {
@@ -40675,7 +39946,7 @@
                     "_metadata": {
                       "phetioHighFrequency": true,
                       "phetioReadOnly": true,
-                      "phetioTypeName": "InterpolatedPropertyIO<Vector2IO>"
+                      "phetioTypeName": "PropertyIO<Vector2IO>"
                     }
                   },
                   "heightProperty": {
@@ -41135,15 +40406,6 @@
                   "buoyancyForceInterpolatedProperty": {
                     "_data": {
                       "initialState": {
-                        "currentValue": {
-                          "x": 0,
-                          "y": 0
-                        },
-                        "previousValue": {
-                          "x": 0,
-                          "y": 0
-                        },
-                        "ratio": 0,
                         "units": "N",
                         "validValues": null,
                         "value": {
@@ -41155,21 +40417,12 @@
                     "_metadata": {
                       "phetioHighFrequency": true,
                       "phetioReadOnly": true,
-                      "phetioTypeName": "InterpolatedPropertyIO<Vector2IO>"
+                      "phetioTypeName": "PropertyIO<Vector2IO>"
                     }
                   },
                   "contactForceInterpolatedProperty": {
                     "_data": {
                       "initialState": {
-                        "currentValue": {
-                          "x": 0,
-                          "y": 0
-                        },
-                        "previousValue": {
-                          "x": 0,
-                          "y": 0
-                        },
-                        "ratio": 0,
                         "units": "N",
                         "validValues": null,
                         "value": {
@@ -41181,21 +40434,12 @@
                     "_metadata": {
                       "phetioHighFrequency": true,
                       "phetioReadOnly": true,
-                      "phetioTypeName": "InterpolatedPropertyIO<Vector2IO>"
+                      "phetioTypeName": "PropertyIO<Vector2IO>"
                     }
                   },
                   "gravityForceInterpolatedProperty": {
                     "_data": {
                       "initialState": {
-                        "currentValue": {
-                          "x": 0,
-                          "y": 0
-                        },
-                        "previousValue": {
-                          "x": 0,
-                          "y": 0
-                        },
-                        "ratio": 0,
                         "units": "N",
                         "validValues": null,
                         "value": {
@@ -41207,7 +40451,7 @@
                     "_metadata": {
                       "phetioHighFrequency": true,
                       "phetioReadOnly": true,
-                      "phetioTypeName": "InterpolatedPropertyIO<Vector2IO>"
+                      "phetioTypeName": "PropertyIO<Vector2IO>"
                     }
                   },
                   "inputEnabledProperty": {
@@ -41542,15 +40786,6 @@
                   "buoyancyForceInterpolatedProperty": {
                     "_data": {
                       "initialState": {
-                        "currentValue": {
-                          "x": 0,
-                          "y": 0
-                        },
-                        "previousValue": {
-                          "x": 0,
-                          "y": 0
-                        },
-                        "ratio": 0,
                         "units": "N",
                         "validValues": null,
                         "value": {
@@ -41562,21 +40797,12 @@
                     "_metadata": {
                       "phetioHighFrequency": true,
                       "phetioReadOnly": true,
-                      "phetioTypeName": "InterpolatedPropertyIO<Vector2IO>"
+                      "phetioTypeName": "PropertyIO<Vector2IO>"
                     }
                   },
                   "contactForceInterpolatedProperty": {
                     "_data": {
                       "initialState": {
-                        "currentValue": {
-                          "x": 0,
-                          "y": 0
-                        },
-                        "previousValue": {
-                          "x": 0,
-                          "y": 0
-                        },
-                        "ratio": 0,
                         "units": "N",
                         "validValues": null,
                         "value": {
@@ -41588,21 +40814,12 @@
                     "_metadata": {
                       "phetioHighFrequency": true,
                       "phetioReadOnly": true,
-                      "phetioTypeName": "InterpolatedPropertyIO<Vector2IO>"
+                      "phetioTypeName": "PropertyIO<Vector2IO>"
                     }
                   },
                   "gravityForceInterpolatedProperty": {
                     "_data": {
                       "initialState": {
-                        "currentValue": {
-                          "x": 0,
-                          "y": 0
-                        },
-                        "previousValue": {
-                          "x": 0,
-                          "y": 0
-                        },
-                        "ratio": 0,
                         "units": "N",
                         "validValues": null,
                         "value": {
@@ -41614,7 +40831,7 @@
                     "_metadata": {
                       "phetioHighFrequency": true,
                       "phetioReadOnly": true,
-                      "phetioTypeName": "InterpolatedPropertyIO<Vector2IO>"
+                      "phetioTypeName": "PropertyIO<Vector2IO>"
                     }
                   },
                   "heightProperty": {
@@ -41998,15 +41215,6 @@
                   "buoyancyForceInterpolatedProperty": {
                     "_data": {
                       "initialState": {
-                        "currentValue": {
-                          "x": 0,
-                          "y": 0
-                        },
-                        "previousValue": {
-                          "x": 0,
-                          "y": 0
-                        },
-                        "ratio": 0,
                         "units": "N",
                         "validValues": null,
                         "value": {
@@ -42018,21 +41226,12 @@
                     "_metadata": {
                       "phetioHighFrequency": true,
                       "phetioReadOnly": true,
-                      "phetioTypeName": "InterpolatedPropertyIO<Vector2IO>"
+                      "phetioTypeName": "PropertyIO<Vector2IO>"
                     }
                   },
                   "contactForceInterpolatedProperty": {
                     "_data": {
                       "initialState": {
-                        "currentValue": {
-                          "x": 0,
-                          "y": 0
-                        },
-                        "previousValue": {
-                          "x": 0,
-                          "y": 0
-                        },
-                        "ratio": 0,
                         "units": "N",
                         "validValues": null,
                         "value": {
@@ -42044,21 +41243,12 @@
                     "_metadata": {
                       "phetioHighFrequency": true,
                       "phetioReadOnly": true,
-                      "phetioTypeName": "InterpolatedPropertyIO<Vector2IO>"
+                      "phetioTypeName": "PropertyIO<Vector2IO>"
                     }
                   },
                   "gravityForceInterpolatedProperty": {
                     "_data": {
                       "initialState": {
-                        "currentValue": {
-                          "x": 0,
-                          "y": 0
-                        },
-                        "previousValue": {
-                          "x": 0,
-                          "y": 0
-                        },
-                        "ratio": 0,
                         "units": "N",
                         "validValues": null,
                         "value": {
@@ -42070,7 +41260,7 @@
                     "_metadata": {
                       "phetioHighFrequency": true,
                       "phetioReadOnly": true,
-                      "phetioTypeName": "InterpolatedPropertyIO<Vector2IO>"
+                      "phetioTypeName": "PropertyIO<Vector2IO>"
                     }
                   },
                   "inputEnabledProperty": {
@@ -42404,15 +41594,6 @@
                   "buoyancyForceInterpolatedProperty": {
                     "_data": {
                       "initialState": {
-                        "currentValue": {
-                          "x": 0,
-                          "y": 0
-                        },
-                        "previousValue": {
-                          "x": 0,
-                          "y": 0
-                        },
-                        "ratio": 0,
                         "units": "N",
                         "validValues": null,
                         "value": {
@@ -42424,21 +41605,12 @@
                     "_metadata": {
                       "phetioHighFrequency": true,
                       "phetioReadOnly": true,
-                      "phetioTypeName": "InterpolatedPropertyIO<Vector2IO>"
+                      "phetioTypeName": "PropertyIO<Vector2IO>"
                     }
                   },
                   "contactForceInterpolatedProperty": {
                     "_data": {
                       "initialState": {
-                        "currentValue": {
-                          "x": 0,
-                          "y": 0
-                        },
-                        "previousValue": {
-                          "x": 0,
-                          "y": 0
-                        },
-                        "ratio": 0,
                         "units": "N",
                         "validValues": null,
                         "value": {
@@ -42450,21 +41622,12 @@
                     "_metadata": {
                       "phetioHighFrequency": true,
                       "phetioReadOnly": true,
-                      "phetioTypeName": "InterpolatedPropertyIO<Vector2IO>"
+                      "phetioTypeName": "PropertyIO<Vector2IO>"
                     }
                   },
                   "gravityForceInterpolatedProperty": {
                     "_data": {
                       "initialState": {
-                        "currentValue": {
-                          "x": 0,
-                          "y": 0
-                        },
-                        "previousValue": {
-                          "x": 0,
-                          "y": 0
-                        },
-                        "ratio": 0,
                         "units": "N",
                         "validValues": null,
                         "value": {
@@ -42476,7 +41639,7 @@
                     "_metadata": {
                       "phetioHighFrequency": true,
                       "phetioReadOnly": true,
-                      "phetioTypeName": "InterpolatedPropertyIO<Vector2IO>"
+                      "phetioTypeName": "PropertyIO<Vector2IO>"
                     }
                   },
                   "inputEnabledProperty": {
@@ -42810,15 +41973,6 @@
                   "buoyancyForceInterpolatedProperty": {
                     "_data": {
                       "initialState": {
-                        "currentValue": {
-                          "x": 0,
-                          "y": 0
-                        },
-                        "previousValue": {
-                          "x": 0,
-                          "y": 0
-                        },
-                        "ratio": 0,
                         "units": "N",
                         "validValues": null,
                         "value": {
@@ -42830,21 +41984,12 @@
                     "_metadata": {
                       "phetioHighFrequency": true,
                       "phetioReadOnly": true,
-                      "phetioTypeName": "InterpolatedPropertyIO<Vector2IO>"
+                      "phetioTypeName": "PropertyIO<Vector2IO>"
                     }
                   },
                   "contactForceInterpolatedProperty": {
                     "_data": {
                       "initialState": {
-                        "currentValue": {
-                          "x": 0,
-                          "y": 0
-                        },
-                        "previousValue": {
-                          "x": 0,
-                          "y": 0
-                        },
-                        "ratio": 0,
                         "units": "N",
                         "validValues": null,
                         "value": {
@@ -42856,21 +42001,12 @@
                     "_metadata": {
                       "phetioHighFrequency": true,
                       "phetioReadOnly": true,
-                      "phetioTypeName": "InterpolatedPropertyIO<Vector2IO>"
+                      "phetioTypeName": "PropertyIO<Vector2IO>"
                     }
                   },
                   "gravityForceInterpolatedProperty": {
                     "_data": {
                       "initialState": {
-                        "currentValue": {
-                          "x": 0,
-                          "y": 0
-                        },
-                        "previousValue": {
-                          "x": 0,
-                          "y": 0
-                        },
-                        "ratio": 0,
                         "units": "N",
                         "validValues": null,
                         "value": {
@@ -42882,7 +42018,7 @@
                     "_metadata": {
                       "phetioHighFrequency": true,
                       "phetioReadOnly": true,
-                      "phetioTypeName": "InterpolatedPropertyIO<Vector2IO>"
+                      "phetioTypeName": "PropertyIO<Vector2IO>"
                     }
                   },
                   "inputEnabledProperty": {
@@ -43266,15 +42402,6 @@
                   "buoyancyForceInterpolatedProperty": {
                     "_data": {
                       "initialState": {
-                        "currentValue": {
-                          "x": 0,
-                          "y": 0
-                        },
-                        "previousValue": {
-                          "x": 0,
-                          "y": 0
-                        },
-                        "ratio": 0,
                         "units": "N",
                         "validValues": null,
                         "value": {
@@ -43286,21 +42413,12 @@
                     "_metadata": {
                       "phetioHighFrequency": true,
                       "phetioReadOnly": true,
-                      "phetioTypeName": "InterpolatedPropertyIO<Vector2IO>"
+                      "phetioTypeName": "PropertyIO<Vector2IO>"
                     }
                   },
                   "contactForceInterpolatedProperty": {
                     "_data": {
                       "initialState": {
-                        "currentValue": {
-                          "x": 0,
-                          "y": 0
-                        },
-                        "previousValue": {
-                          "x": 0,
-                          "y": 0
-                        },
-                        "ratio": 0,
                         "units": "N",
                         "validValues": null,
                         "value": {
@@ -43312,21 +42430,12 @@
                     "_metadata": {
                       "phetioHighFrequency": true,
                       "phetioReadOnly": true,
-                      "phetioTypeName": "InterpolatedPropertyIO<Vector2IO>"
+                      "phetioTypeName": "PropertyIO<Vector2IO>"
                     }
                   },
                   "gravityForceInterpolatedProperty": {
                     "_data": {
                       "initialState": {
-                        "currentValue": {
-                          "x": 0,
-                          "y": 0
-                        },
-                        "previousValue": {
-                          "x": 0,
-                          "y": 0
-                        },
-                        "ratio": 0,
                         "units": "N",
                         "validValues": null,
                         "value": {
@@ -43338,7 +42447,7 @@
                     "_metadata": {
                       "phetioHighFrequency": true,
                       "phetioReadOnly": true,
-                      "phetioTypeName": "InterpolatedPropertyIO<Vector2IO>"
+                      "phetioTypeName": "PropertyIO<Vector2IO>"
                     }
                   },
                   "heightProperty": {
@@ -43722,15 +42831,6 @@
                   "buoyancyForceInterpolatedProperty": {
                     "_data": {
                       "initialState": {
-                        "currentValue": {
-                          "x": 0,
-                          "y": 0
-                        },
-                        "previousValue": {
-                          "x": 0,
-                          "y": 0
-                        },
-                        "ratio": 0,
                         "units": "N",
                         "validValues": null,
                         "value": {
@@ -43742,21 +42842,12 @@
                     "_metadata": {
                       "phetioHighFrequency": true,
                       "phetioReadOnly": true,
-                      "phetioTypeName": "InterpolatedPropertyIO<Vector2IO>"
+                      "phetioTypeName": "PropertyIO<Vector2IO>"
                     }
                   },
                   "contactForceInterpolatedProperty": {
                     "_data": {
                       "initialState": {
-                        "currentValue": {
-                          "x": 0,
-                          "y": 0
-                        },
-                        "previousValue": {
-                          "x": 0,
-                          "y": 0
-                        },
-                        "ratio": 0,
                         "units": "N",
                         "validValues": null,
                         "value": {
@@ -43768,21 +42859,12 @@
                     "_metadata": {
                       "phetioHighFrequency": true,
                       "phetioReadOnly": true,
-                      "phetioTypeName": "InterpolatedPropertyIO<Vector2IO>"
+                      "phetioTypeName": "PropertyIO<Vector2IO>"
                     }
                   },
                   "gravityForceInterpolatedProperty": {
                     "_data": {
                       "initialState": {
-                        "currentValue": {
-                          "x": 0,
-                          "y": 0
-                        },
-                        "previousValue": {
-                          "x": 0,
-                          "y": 0
-                        },
-                        "ratio": 0,
                         "units": "N",
                         "validValues": null,
                         "value": {
@@ -43794,7 +42876,7 @@
                     "_metadata": {
                       "phetioHighFrequency": true,
                       "phetioReadOnly": true,
-                      "phetioTypeName": "InterpolatedPropertyIO<Vector2IO>"
+                      "phetioTypeName": "PropertyIO<Vector2IO>"
                     }
                   },
                   "heightProperty": {
@@ -44319,19 +43401,19 @@
               "yInterpolatedProperty": {
                 "_data": {
                   "initialState": {
-                    "currentValue": -0.1388888888888889,
-                    "previousValue": -0.1388888888888889,
-                    "ratio": 0,
                     "units": null,
                     "validValues": null,
-                    "value": -0.1388888888888889
+                    "value": {
+                      "x": 0,
+                      "y": -0.1388888888888889
+                    }
                   }
                 },
                 "_metadata": {
                   "phetioDocumentation": "The y-value of the fluid in model coordinates (where 0 is the top of the pool)",
                   "phetioHighFrequency": true,
                   "phetioReadOnly": true,
-                  "phetioTypeName": "InterpolatedPropertyIO<NumberIO>"
+                  "phetioTypeName": "PropertyIO<Vector2IO>"
                 }
               }
             },
@@ -44412,15 +43494,6 @@
               "buoyancyForceInterpolatedProperty": {
                 "_data": {
                   "initialState": {
-                    "currentValue": {
-                      "x": 0,
-                      "y": 0
-                    },
-                    "previousValue": {
-                      "x": 0,
-                      "y": 0
-                    },
-                    "ratio": 0,
                     "units": "N",
                     "validValues": null,
                     "value": {
@@ -44432,21 +43505,12 @@
                 "_metadata": {
                   "phetioHighFrequency": true,
                   "phetioReadOnly": true,
-                  "phetioTypeName": "InterpolatedPropertyIO<Vector2IO>"
+                  "phetioTypeName": "PropertyIO<Vector2IO>"
                 }
               },
               "contactForceInterpolatedProperty": {
                 "_data": {
                   "initialState": {
-                    "currentValue": {
-                      "x": 0,
-                      "y": 0
-                    },
-                    "previousValue": {
-                      "x": 0,
-                      "y": 0
-                    },
-                    "ratio": 0,
                     "units": "N",
                     "validValues": null,
                     "value": {
@@ -44458,21 +43522,12 @@
                 "_metadata": {
                   "phetioHighFrequency": true,
                   "phetioReadOnly": true,
-                  "phetioTypeName": "InterpolatedPropertyIO<Vector2IO>"
+                  "phetioTypeName": "PropertyIO<Vector2IO>"
                 }
               },
               "gravityForceInterpolatedProperty": {
                 "_data": {
                   "initialState": {
-                    "currentValue": {
-                      "x": 0,
-                      "y": 0
-                    },
-                    "previousValue": {
-                      "x": 0,
-                      "y": 0
-                    },
-                    "ratio": 0,
                     "units": "N",
                     "validValues": null,
                     "value": {
@@ -44484,7 +43539,7 @@
                 "_metadata": {
                   "phetioHighFrequency": true,
                   "phetioReadOnly": true,
-                  "phetioTypeName": "InterpolatedPropertyIO<Vector2IO>"
+                  "phetioTypeName": "PropertyIO<Vector2IO>"
                 }
               },
               "heightProperty": {
@@ -44593,12 +43648,12 @@
               "measuredWeightProperty": {
                 "_data": {
                   "initialState": {
-                    "currentValue": 0,
-                    "previousValue": 0,
-                    "ratio": 0,
                     "units": "N",
                     "validValues": null,
-                    "value": 0
+                    "value": {
+                      "x": 0,
+                      "y": 0
+                    }
                   }
                 },
                 "_metadata": {
@@ -44606,7 +43661,7 @@
                   "phetioFeatured": true,
                   "phetioHighFrequency": true,
                   "phetioReadOnly": true,
-                  "phetioTypeName": "InterpolatedPropertyIO<NumberIO>"
+                  "phetioTypeName": "PropertyIO<Vector2IO>"
                 }
               },
               "percentSubmergedProperty": {
@@ -44821,15 +43876,6 @@
             "buoyancyForceInterpolatedProperty": {
               "_data": {
                 "initialState": {
-                  "currentValue": {
-                    "x": 0,
-                    "y": 0
-                  },
-                  "previousValue": {
-                    "x": 0,
-                    "y": 0
-                  },
-                  "ratio": 0,
                   "units": "N",
                   "validValues": null,
                   "value": {
@@ -44841,21 +43887,12 @@
               "_metadata": {
                 "phetioHighFrequency": true,
                 "phetioReadOnly": true,
-                "phetioTypeName": "InterpolatedPropertyIO<Vector2IO>"
+                "phetioTypeName": "PropertyIO<Vector2IO>"
               }
             },
             "contactForceInterpolatedProperty": {
               "_data": {
                 "initialState": {
-                  "currentValue": {
-                    "x": 0,
-                    "y": 0
-                  },
-                  "previousValue": {
-                    "x": 0,
-                    "y": 0
-                  },
-                  "ratio": 0,
                   "units": "N",
                   "validValues": null,
                   "value": {
@@ -44867,21 +43904,12 @@
               "_metadata": {
                 "phetioHighFrequency": true,
                 "phetioReadOnly": true,
-                "phetioTypeName": "InterpolatedPropertyIO<Vector2IO>"
+                "phetioTypeName": "PropertyIO<Vector2IO>"
               }
             },
             "gravityForceInterpolatedProperty": {
               "_data": {
                 "initialState": {
-                  "currentValue": {
-                    "x": 0,
-                    "y": 0
-                  },
-                  "previousValue": {
-                    "x": 0,
-                    "y": 0
-                  },
-                  "ratio": 0,
                   "units": "N",
                   "validValues": null,
                   "value": {
@@ -44893,7 +43921,7 @@
               "_metadata": {
                 "phetioHighFrequency": true,
                 "phetioReadOnly": true,
-                "phetioTypeName": "InterpolatedPropertyIO<Vector2IO>"
+                "phetioTypeName": "PropertyIO<Vector2IO>"
               }
             },
             "inputEnabledProperty": {
@@ -44981,12 +44009,12 @@
             "measuredWeightProperty": {
               "_data": {
                 "initialState": {
-                  "currentValue": 0,
-                  "previousValue": 0,
-                  "ratio": 0,
                   "units": "N",
                   "validValues": null,
-                  "value": 0
+                  "value": {
+                    "x": 0,
+                    "y": 0
+                  }
                 }
               },
               "_metadata": {
@@ -44994,7 +44022,7 @@
                 "phetioFeatured": true,
                 "phetioHighFrequency": true,
                 "phetioReadOnly": true,
-                "phetioTypeName": "InterpolatedPropertyIO<NumberIO>"
+                "phetioTypeName": "PropertyIO<Vector2IO>"
               }
             },
             "percentSubmergedProperty": {
@@ -53026,42 +52054,6 @@
       "supertype": "ObjectIO",
       "typeName": "InputIO"
     },
-    "InterpolatedPropertyIO<NumberIO>": {
-      "dataDefaults": {},
-      "documentation": "Extends PropertyIO to interpolation (with a current/previous value, and a ratio between the two)",
-      "events": [],
-      "metadataDefaults": {},
-      "methodOrder": [],
-      "methods": {},
-      "parameterTypes": [
-        "NumberIO"
-      ],
-      "stateSchema": {
-        "currentValue": "NumberIO",
-        "previousValue": "NumberIO",
-        "ratio": "NumberIO"
-      },
-      "supertype": "PropertyIO<NumberIO>",
-      "typeName": "InterpolatedPropertyIO<NumberIO>"
-    },
-    "InterpolatedPropertyIO<Vector2IO>": {
-      "dataDefaults": {},
-      "documentation": "Extends PropertyIO to interpolation (with a current/previous value, and a ratio between the two)",
-      "events": [],
-      "metadataDefaults": {},
-      "methodOrder": [],
-      "methods": {},
-      "parameterTypes": [
-        "Vector2IO"
-      ],
-      "stateSchema": {
-        "currentValue": "Vector2IO",
-        "previousValue": "Vector2IO",
-        "ratio": "NumberIO"
-      },
-      "supertype": "PropertyIO<Vector2IO>",
-      "typeName": "InterpolatedPropertyIO<Vector2IO>"
-    },
     "LinkedElementIO": {
       "dataDefaults": {},
       "documentation": "A LinkedElement",
Index: density-buoyancy-common/js/common/model/Pool.ts
IDEA additional info:
Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP
<+>UTF-8
===================================================================
diff --git a/density-buoyancy-common/js/common/model/Pool.ts b/density-buoyancy-common/js/common/model/Pool.ts
--- a/density-buoyancy-common/js/common/model/Pool.ts	(revision a21ae4f2cab6795d4f3cadcc66711c15dcfefc8d)
+++ b/density-buoyancy-common/js/common/model/Pool.ts	(date 1722951086902)
@@ -98,9 +98,9 @@
       // Round to nearest 1E-6 to avoid floating point errors. Before we were rounding, the initial value
       // was showing as 99.999999999999 and the current value on startup was 100.0000000000001
       // Normally we would ignore a problem like this, but the former was appearing in the API.
-      fluidY => Utils.roundToInterval( bounds.width *
+      fluidVector => Utils.roundToInterval( bounds.width *
                                        bounds.depth *
-                                       ( fluidY - bounds.minY ) *
+                                       ( fluidVector.y - bounds.minY ) *
                                        DensityBuoyancyCommonConstants.LITERS_IN_CUBIC_METER, DensityBuoyancyCommonConstants.TOLERANCE ), {
         units: 'L',
         tandem: this.fluidTandem.createTandem( 'levelVolumeProperty' ),
Index: density-buoyancy-common/js/common/view/ScaleReadoutNode.ts
IDEA additional info:
Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP
<+>UTF-8
===================================================================
diff --git a/density-buoyancy-common/js/common/view/ScaleReadoutNode.ts b/density-buoyancy-common/js/common/view/ScaleReadoutNode.ts
--- a/density-buoyancy-common/js/common/view/ScaleReadoutNode.ts	(revision a21ae4f2cab6795d4f3cadcc66711c15dcfefc8d)
+++ b/density-buoyancy-common/js/common/view/ScaleReadoutNode.ts	(date 1722951138007)
@@ -95,8 +95,8 @@
   // TODO: Rename mass => scale, see https://github.com/phetsims/density-buoyancy-common/issues/123
   public constructor( public readonly mass: Scale, gravityProperty: GravityProperty ) {
 
-    const blendedProperty = new BlendedNumberProperty( mass.measuredWeightInterpolatedProperty.value );
-    mass.stepEmitter.addListener( () => blendedProperty.step( mass.measuredWeightInterpolatedProperty.value ) );
+    const blendedProperty = new BlendedNumberProperty( mass.measuredWeightInterpolatedProperty.value.y );
+    mass.stepEmitter.addListener( () => blendedProperty.step( mass.measuredWeightInterpolatedProperty.value.y ) );
 
     super( blendedProperty, gravityProperty, mass.displayType );
   }
Index: density-buoyancy-common/js/buoyancy/model/applications/BuoyancyApplicationsModel.ts
IDEA additional info:
Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP
<+>UTF-8
===================================================================
diff --git a/density-buoyancy-common/js/buoyancy/model/applications/BuoyancyApplicationsModel.ts b/density-buoyancy-common/js/buoyancy/model/applications/BuoyancyApplicationsModel.ts
--- a/density-buoyancy-common/js/buoyancy/model/applications/BuoyancyApplicationsModel.ts	(revision a21ae4f2cab6795d4f3cadcc66711c15dcfefc8d)
+++ b/density-buoyancy-common/js/buoyancy/model/applications/BuoyancyApplicationsModel.ts	(date 1722950870898)
@@ -245,7 +245,7 @@
 
         // If the top of the boat is out of the fluid past the height threshold, spill the fluid back into the pool
         // (even if not totally full).
-        if ( boat.stepTop > this.pool.fluidYInterpolatedProperty.currentValue + boatHeight * BOAT_READY_TO_SPILL_OUT_THRESHOLD ) {
+        if ( boat.stepTop > this.pool.fluidYInterpolatedProperty.currentValue.y + boatHeight * BOAT_READY_TO_SPILL_OUT_THRESHOLD ) {
           this.spillingFluidOutOfBoat = true;
         }
       }
@@ -259,7 +259,7 @@
         boatExcess = Math.min( FILL_EMPTY_MULTIPLIER * boat.volumeProperty.value, boatFluidVolume );
       }
       else if ( boatFluidVolume > 0 &&
-                Math.abs( boatBasin.fluidYInterpolatedProperty.currentValue - boatBasin.stepTop ) >= BOAT_FULL_THRESHOLD ) {
+                Math.abs( boatBasin.fluidYInterpolatedProperty.currentValue.y - boatBasin.stepTop ) >= BOAT_FULL_THRESHOLD ) {
         // If the boat is neither full nor empty, nor spilling, then it is currently filling up. We will up no matter
         // the current fluid leve or the boat AND no matter the boats position. This is because the boat can only
         // ever be full or empty (or animating to one of those states).
Index: density-buoyancy-common/js/common/view/ForceDiagramNode.ts
IDEA additional info:
Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP
<+>UTF-8
===================================================================
diff --git a/density-buoyancy-common/js/common/view/ForceDiagramNode.ts b/density-buoyancy-common/js/common/view/ForceDiagramNode.ts
--- a/density-buoyancy-common/js/common/view/ForceDiagramNode.ts	(revision a21ae4f2cab6795d4f3cadcc66711c15dcfefc8d)
+++ b/density-buoyancy-common/js/common/view/ForceDiagramNode.ts	(date 1722951345123)
@@ -17,7 +17,6 @@
 import Mass from '../model/Mass.js';
 import DensityBuoyancyCommonColors from './DensityBuoyancyCommonColors.js';
 import InterpolatedProperty from '../model/InterpolatedProperty.js';
-import Vector2 from '../../../../dot/js/Vector2.js';
 import { combineOptions } from '../../../../phet-core/js/optionize.js';
 import TReadOnlyProperty from '../../../../axon/js/TReadOnlyProperty.js';
 import { chooseDecimalPlaces } from '../DensityBuoyancyCommonConstants.js';
@@ -123,7 +122,7 @@
     const downwardArrows: ArrowNode[] = [];
     const labels: Node[] = [];
 
-    const updateArrow = ( forceProperty: InterpolatedProperty<Vector2> | BlendedVector2Property, showForceProperty: TReadOnlyProperty<boolean>, arrowNode: ArrowNode, textNode: Text, labelNode: Node ) => {
+    const updateArrow = ( forceProperty: InterpolatedProperty | BlendedVector2Property, showForceProperty: TReadOnlyProperty<boolean>, arrowNode: ArrowNode, textNode: Text, labelNode: Node ) => {
       const y = forceProperty.value.y;
       if ( showForceProperty.value && Math.abs( y ) > 1e-5 ) {
         arrowNode.setTip( 0, -y * this.displayProperties.vectorZoomProperty.value * 20 ); // Default zoom is 20 units per Newton
Index: density-buoyancy-common/js/common/model/Basin.ts
IDEA additional info:
Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP
<+>UTF-8
===================================================================
diff --git a/density-buoyancy-common/js/common/model/Basin.ts b/density-buoyancy-common/js/common/model/Basin.ts
--- a/density-buoyancy-common/js/common/model/Basin.ts	(revision a21ae4f2cab6795d4f3cadcc66711c15dcfefc8d)
+++ b/density-buoyancy-common/js/common/model/Basin.ts	(date 1722956296839)
@@ -11,12 +11,12 @@
 import Range from '../../../../dot/js/Range.js';
 import optionize from '../../../../phet-core/js/optionize.js';
 import Tandem from '../../../../tandem/js/Tandem.js';
-import NumberIO from '../../../../tandem/js/types/NumberIO.js';
 import densityBuoyancyCommon from '../../densityBuoyancyCommon.js';
 import InterpolatedProperty from './InterpolatedProperty.js';
 import Mass from './Mass.js';
 import { PhetioObjectOptions } from '../../../../tandem/js/PhetioObject.js';
 import DensityBuoyancyCommonConstants from '../DensityBuoyancyCommonConstants.js';
+import Vector2 from '../../../../dot/js/Vector2.js';
 
 // TODO: Add SelfOptions for optionize, see https://github.com/phetsims/density-buoyancy-common/issues/123
 export type BasinOptions = {
@@ -29,8 +29,8 @@
   // In m^3, the volume of fluid contained in this basin
   public readonly fluidVolumeProperty: Property<number>;
 
-  // The y coordinate of the fluid level (absolute in the model, NOT relative to anything)
-  public readonly fluidYInterpolatedProperty: InterpolatedProperty<number>;
+  // Property<Vector2> that holds the y coordinate of the fluid level (absolute in the model, NOT relative to anything)
+  public readonly fluidYInterpolatedProperty: InterpolatedProperty;
 
   // The bottom and top of the basin's area of containment (absolute model coordinates), set during physics engine steps.
   public stepBottom: number;
@@ -64,10 +64,7 @@
       units: 'm^3'
     } );
 
-    this.fluidYInterpolatedProperty = new InterpolatedProperty( options.initialY, {
-      interpolate: InterpolatedProperty.interpolateNumber,
-      phetioOuterType: InterpolatedProperty.InterpolatedPropertyIO,
-      phetioValueType: NumberIO,
+    this.fluidYInterpolatedProperty = new InterpolatedProperty( 0, options.initialY, {
       tandem: fluidTandem.createTandem( 'yInterpolatedProperty' ),
       phetioHighFrequency: true,
       phetioReadOnly: true,
@@ -158,18 +155,18 @@
   public computeY(): void {
     const fluidVolume = this.fluidVolumeProperty.value;
     if ( fluidVolume === 0 ) {
-      this.fluidYInterpolatedProperty.setNextValue( this.stepBottom );
+      this.fluidYInterpolatedProperty.setNextValue( new Vector2( 0, this.stepBottom ) );
       return;
     }
 
     const emptyVolume = this.getEmptyVolume( this.stepTop );
     if ( emptyVolume === fluidVolume ) {
-      this.fluidYInterpolatedProperty.setNextValue( this.stepTop );
+      this.fluidYInterpolatedProperty.setNextValue( new Vector2( 0, this.stepTop ) );
       return;
     }
 
     // Due to shapes used, there is no analytical solution.
-    this.fluidYInterpolatedProperty.setNextValue( Basin.findRoot(
+    this.fluidYInterpolatedProperty.setNextValue( new Vector2( 0, Basin.findRoot(
       this.stepBottom,
       this.stepTop,
       DensityBuoyancyCommonConstants.TOLERANCE,
@@ -179,7 +176,7 @@
 
       // The derivative (change of volume) happens to be the area at that section
       yTest => this.getEmptyArea( yTest )
-    ) );
+    ) ) );
   }
 
   /**
Index: density-buoyancy-common/js/common/model/InterpolatedProperty.ts
IDEA additional info:
Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP
<+>UTF-8
===================================================================
diff --git a/density-buoyancy-common/js/common/model/InterpolatedProperty.ts b/density-buoyancy-common/js/common/model/InterpolatedProperty.ts
--- a/density-buoyancy-common/js/common/model/InterpolatedProperty.ts	(revision a21ae4f2cab6795d4f3cadcc66711c15dcfefc8d)
+++ b/density-buoyancy-common/js/common/model/InterpolatedProperty.ts	(date 1722956421078)
@@ -13,51 +13,48 @@
 
 import Property, { PropertyOptions } from '../../../../axon/js/Property.js';
 import { ReadOnlyPropertyState } from '../../../../axon/js/ReadOnlyProperty.js';
-import Vector2 from '../../../../dot/js/Vector2.js';
-import optionize from '../../../../phet-core/js/optionize.js';
-import IntentionalAny from '../../../../phet-core/js/types/IntentionalAny.js';
+import Vector2, { Vector2StateObject } from '../../../../dot/js/Vector2.js';
+import optionize, { EmptySelfOptions } from '../../../../phet-core/js/optionize.js';
 import IOType from '../../../../tandem/js/types/IOType.js';
 import NumberIO from '../../../../tandem/js/types/NumberIO.js';
 import densityBuoyancyCommon from '../../densityBuoyancyCommon.js';
-import IOTypeCache from '../../../../tandem/js/IOTypeCache.js';
 
-type Interpolate<T> = ( a: T, b: T, ratio: number ) => T;
-type SelfOptions<T> = {
-  interpolate: Interpolate<T>;
-};
-export type InterpolatedPropertyOptions<T> = SelfOptions<T> & PropertyOptions<T>;
+type SelfOptions = EmptySelfOptions;
+export type InterpolatedPropertyOptions = SelfOptions & PropertyOptions<Vector2>;
 
-export default class InterpolatedProperty<T> extends Property<T> {
+const PropertyIOVector2IO = Property.PropertyIO( Vector2.Vector2IO );
+
+export default class InterpolatedProperty extends Property<Vector2> {
 
   // The most recently set value, but changing this will not fire listeners.
-  public currentValue: T;
+  public currentValue: Vector2;
 
   // Capture the previous value upon currentValue change.
-  private previousValue: T;
-  private ratio: number;
+  private previousValue: Vector2;
 
-  private readonly interpolate: Interpolate<T>;
+  private ratio = 0;
 
-  public constructor( initialValue: T, providedOptions: InterpolatedPropertyOptions<T> ) {
+  public constructor( x: number, y: number, providedOptions: InterpolatedPropertyOptions ) {
 
-    const options = optionize<InterpolatedPropertyOptions<T>, SelfOptions<T>, PropertyOptions<T>>()( {
-      phetioOuterType: InterpolatedProperty.InterpolatedPropertyIO
+    const options = optionize<InterpolatedPropertyOptions, SelfOptions, PropertyOptions<Vector2>>()( {
+
+      // terrible
+      // phetioOuterType: () => InterpolatedProperty.InterpolatedPropertyIO,
+      phetioValueType: Vector2.Vector2IO,
+      // phetioType: InterpolatedProperty.InterpolatedPropertyIO
     }, providedOptions );
 
+    const initialValue = new Vector2( x, y );
     super( initialValue, options );
 
-    this.interpolate = options.interpolate;
-
     this.currentValue = initialValue;
     this.previousValue = initialValue;
-
-    this.ratio = 0;
   }
 
   /**
    * Sets the next value to be used (will NOT change the value of this Property).
    */
-  public setNextValue( value: T ): void {
+  public setNextValue( value: Vector2 ): void {
     this.previousValue = this.currentValue;
     this.currentValue = value;
   }
@@ -71,7 +68,7 @@
     // Interpolating between two values ago and the most recent value is a common heuristic to do, but it is important
     // that no model code relies on this, and instead would just use currentValue directly. This is also duplicated from
     // what p2 World does after step.
-    this.value = this.interpolate( this.previousValue, this.currentValue, this.ratio );
+    this.value = this.previousValue.blend( this.currentValue, ratio );
   }
 
   /**
@@ -85,68 +82,37 @@
     this.ratio = 0;
   }
 
-  /**
-   * Interpolation for numbers.
-   */
-  public static interpolateNumber( a: number, b: number, ratio: number ): number {
-    return a + ( b - a ) * ratio;
-  }
-
-  /**
-   * Interpolation for Vector2.
-   */
-  public static interpolateVector2( a: Vector2, b: Vector2, ratio: number ): Vector2 {
-    return a.blend( b, ratio );
-  }
-
-  public static readonly InterpolatedPropertyIO = ( parameterType: IOType ): IOType => {
-    assert && assert( parameterType, 'InterpolatedPropertyIO needs parameterType' );
-
-    if ( !cache.has( parameterType ) ) {
-      const PropertyIOImpl = Property.PropertyIO( parameterType );
-
-      const ioType = new IOType( `InterpolatedPropertyIO<${parameterType.typeName}>`, {
-        valueType: InterpolatedProperty,
-        supertype: PropertyIOImpl,
-        parameterTypes: [ parameterType ],
-        documentation: 'Extends PropertyIO to interpolation (with a current/previous value, and a ratio between the two)',
-        toStateObject: ( interpolatedProperty: InterpolatedProperty<IntentionalAny> ): InterpolatedPropertyIOStateObject => {
+  public static InterpolatedPropertyIO = new IOType( `InterpolatedPropertyIO`, {
+    valueType: InterpolatedProperty,
+    supertype: PropertyIOVector2IO,
+    documentation: 'Extends PropertyIO to interpolation (with a current/previous value, and a ratio between the two)',
+    toStateObject: ( interpolatedProperty: InterpolatedProperty ): InterpolatedPropertyIOStateObject => {
 
-          const parentStateObject = PropertyIOImpl.toStateObject( interpolatedProperty );
+      const parentStateObject = PropertyIOVector2IO.toStateObject( interpolatedProperty );
 
-          parentStateObject.currentValue = parameterType.toStateObject( interpolatedProperty.currentValue );
-          parentStateObject.previousValue = parameterType.toStateObject( interpolatedProperty.previousValue );
-          parentStateObject.ratio = interpolatedProperty.ratio;
+      parentStateObject.currentValue = interpolatedProperty.currentValue.toStateObject();
+      parentStateObject.previousValue = interpolatedProperty.previousValue.toStateObject();
+      parentStateObject.ratio = interpolatedProperty.ratio;
 
-          return parentStateObject;
-        },
-        applyState: ( interpolatedProperty: InterpolatedProperty<IntentionalAny>, stateObject: InterpolatedPropertyIOStateObject ) => {
-          PropertyIOImpl.applyState( interpolatedProperty, stateObject );
-          interpolatedProperty.currentValue = parameterType.fromStateObject( stateObject.currentValue );
-          interpolatedProperty.previousValue = parameterType.fromStateObject( stateObject.previousValue );
-          interpolatedProperty.ratio = stateObject.ratio;
-        },
-        stateSchema: {
-          currentValue: parameterType,
-          previousValue: parameterType,
-          ratio: NumberIO
-        }
-      } );
-
-      cache.set( parameterType, ioType );
+      return parentStateObject;
+    },
+    applyState: ( interpolatedProperty: InterpolatedProperty, stateObject: InterpolatedPropertyIOStateObject ) => {
+      PropertyIOVector2IO.applyState( interpolatedProperty, stateObject );
+      interpolatedProperty.currentValue = Vector2.fromStateObject( stateObject.currentValue );
+      interpolatedProperty.previousValue = Vector2.fromStateObject( stateObject.previousValue );
+      interpolatedProperty.ratio = stateObject.ratio;
+    },
+    stateSchema: {
+      currentValue: Vector2.Vector2IO,
+      previousValue: Vector2.Vector2IO,
+      ratio: NumberIO
     }
-
-    return cache.get( parameterType )!;
-  };
+  } )
 }
 
-// {Map.<IOType, IOType>} - Cache each parameterized PropertyIO based on
-// the parameter type, so that it is only created once
-const cache = new IOTypeCache();
-
-export type InterpolatedPropertyIOStateObject = ReadOnlyPropertyState<IntentionalAny> & {
-  currentValue: IntentionalAny;
-  previousValue: IntentionalAny;
+export type InterpolatedPropertyIOStateObject = ReadOnlyPropertyState<Vector2StateObject> & {
+  currentValue: Vector2StateObject;
+  previousValue: Vector2StateObject;
   ratio: number;
 };
 

@samreid
Copy link
Member Author

samreid commented Aug 6, 2024

I learned that a statically declared member IO Type can access private members in the outer class. I feel this is a reasonable and understandable permission, and preferable to making the private members public.

samreid added a commit that referenced this issue Aug 6, 2024
samreid added a commit that referenced this issue Aug 6, 2024
@samreid
Copy link
Member Author

samreid commented Aug 6, 2024

I documented the two sites accordingly, closing.

@samreid samreid closed this as completed Aug 6, 2024
samreid added a commit that referenced this issue Aug 6, 2024
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests

1 participant