Skip to content

Commit

Permalink
Statically allocate ControlPoint instances outside the PhetioGroup, see
Browse files Browse the repository at this point in the history
  • Loading branch information
samreid committed Jan 15, 2025
1 parent c39746d commit 98d81a2
Show file tree
Hide file tree
Showing 5 changed files with 77 additions and 85 deletions.
10 changes: 3 additions & 7 deletions js/common/model/ControlPoint.ts
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@ import Bounds2 from '../../../../dot/js/Bounds2.js';
import Vector2 from '../../../../dot/js/Vector2.js';
import Vector2Property from '../../../../dot/js/Vector2Property.js';
import optionize from '../../../../phet-core/js/optionize.js';
import StrictOmit from '../../../../phet-core/js/types/StrictOmit.js';
import PhetioObject, { PhetioObjectOptions } from '../../../../tandem/js/PhetioObject.js';
import Tandem from '../../../../tandem/js/Tandem.js';
import BooleanIO from '../../../../tandem/js/types/BooleanIO.js';
Expand All @@ -38,7 +39,7 @@ type SelfOptions = {
limitBounds?: Bounds2 | null;
};

export type ControlPointOptions = SelfOptions & PhetioObjectOptions;
export type ControlPointOptions = SelfOptions & StrictOmit<PhetioObjectOptions, 'phetioState'>;

export default class ControlPoint extends PhetioObject {

Expand Down Expand Up @@ -69,22 +70,17 @@ export default class ControlPoint extends PhetioObject {

tandem: Tandem.REQUIRED,
phetioType: ControlPoint.ControlPointIO,
phetioState: PhetioObject.DEFAULT_OPTIONS.phetioState
}, providedOptions );
const tandem = options.tandem;

// ControlPoints are always stateful, see https://github.com/phetsims/energy-skate-park/issues/385
options.phetioState = true;

super( options );

this.limitBounds = options.limitBounds;
this.interactive = options.interactive;
this.visible = options.visible;

this.sourcePositionProperty = new Vector2Property( new Vector2( x, y ), {
tandem: tandem.createTandem( 'sourcePositionProperty' ),
phetioState: options.phetioState // in state only if containing Track is
tandem: tandem.createTandem( 'sourcePositionProperty' )
} );

this.snapTargetProperty = new Property<ControlPoint | null>( null );
Expand Down
11 changes: 5 additions & 6 deletions js/common/model/EnergySkateParkTrackSetModel.ts
Original file line number Diff line number Diff line change
Expand Up @@ -132,15 +132,15 @@ export default class EnergySkateParkTrackSetModel extends EnergySkateParkSaveSam

this.trackTypes.forEach( trackType => {
if ( trackType === PremadeTracks.TrackType.PARABOLA ) {
const parabolaControlPoints = PremadeTracks.createParabolaControlPoints( this, options.parabolaControlPointOptions );
const parabolaControlPoints = PremadeTracks.createParabolaControlPoints( this, tandem.createTandem( 'parabolaTrack' ), options.parabolaControlPointOptions );
const parabolaTrack = EnergySkateParkTrackSetModel.createPremadeTrack( this, parabolaControlPoints, merge( {
tandem: tandem.createTandem( 'parabolaTrack' )
}, options.parabolaTrackOptions ) );

tracks.push( parabolaTrack );
}
else if ( trackType === PremadeTracks.TrackType.SLOPE ) {
const slopeControlPoints = PremadeTracks.createSlopeControlPoints( this, options.slopeControlPointOptions );
const slopeControlPoints = PremadeTracks.createSlopeControlPoints( this, tandem.createTandem( 'slopeTrack' ), options.slopeControlPointOptions );
const slopeTrack = EnergySkateParkTrackSetModel.createPremadeTrack( this, slopeControlPoints, merge( {

// Flag to indicate whether the skater transitions from the right edge of this track directly to the ground
Expand All @@ -151,14 +151,14 @@ export default class EnergySkateParkTrackSetModel extends EnergySkateParkSaveSam
tracks.push( slopeTrack );
}
else if ( trackType === PremadeTracks.TrackType.DOUBLE_WELL ) {
const doubleWellControlPoints = PremadeTracks.createDoubleWellControlPoints( this, options.doubleWellControlPointOptions );
const doubleWellControlPoints = PremadeTracks.createDoubleWellControlPoints( this, tandem.createTandem( 'doubleWellTrack' ), options.doubleWellControlPointOptions );
const doubleWellTrack = EnergySkateParkTrackSetModel.createPremadeTrack( this, doubleWellControlPoints, merge( {
tandem: tandem.createTandem( 'doubleWellTrack' )
}, options.doubleWellTrackOptions ) );
tracks.push( doubleWellTrack );
}
else if ( trackType === PremadeTracks.TrackType.LOOP ) {
const loopControlPoints = PremadeTracks.createLoopControlPoints( this, options.loopControlPointOptions );
const loopControlPoints = PremadeTracks.createLoopControlPoints( this, tandem.createTandem( 'loopTrack' ), options.loopControlPointOptions );
const loopTrack = EnergySkateParkTrackSetModel.createPremadeTrack( this, loopControlPoints, merge( {
draggable: this.tracksDraggable,
tandem: tandem.createTandem( 'loopTrack' )
Expand Down Expand Up @@ -200,8 +200,7 @@ export default class EnergySkateParkTrackSetModel extends EnergySkateParkSaveSam

public static createPremadeTrack( model: IntentionalAny, controlPoints: ControlPoint[], options?: TrackOptions ): Track {
options = combineOptions<TrackOptions>( {
configurable: model.tracksConfigurable,
phetioState: false
configurable: model.tracksConfigurable
}, options );

return PremadeTracks.createTrack( model, controlPoints, options );
Expand Down
117 changes: 59 additions & 58 deletions js/common/model/PremadeTracks.ts
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@ import Vector2 from '../../../../dot/js/Vector2.js';
import EnumerationDeprecated from '../../../../phet-core/js/EnumerationDeprecated.js';
import merge from '../../../../phet-core/js/merge.js';
import IntentionalAny from '../../../../phet-core/js/types/IntentionalAny.js';
import Tandem from '../../../../tandem/js/Tandem.js';
import energySkatePark from '../../energySkatePark.js';
import ControlPoint from './ControlPoint.js';
import EnergySkateParkModel from './EnergySkateParkModel.js';
Expand Down Expand Up @@ -71,7 +72,7 @@ const PremadeTracks = {
/**
* Create a set of control points that create a parabola shaped track.
*/
createParabolaControlPoints: ( model: EnergySkateParkModel, options: IntentionalAny ): ControlPoint[] => {
createParabolaControlPoints: ( model: EnergySkateParkModel, tandem: Tandem, options: IntentionalAny ): ControlPoint[] => {
// eslint-disable-next-line phet/bad-typescript-text
options = merge( {
trackHeight: 6, // largest height for the parabola
Expand All @@ -92,28 +93,28 @@ const PremadeTracks = {
const p3Bounds = createCenteredLimitBounds( p3, END_BOUNDS_WIDTH, END_BOUNDS_HEIGHT );

return [
model.controlPointGroup.createNextElement( p1.x, p1.y, {
new ControlPoint( p1.x, p1.y, {
tandem: tandem.createTandem( 'controlPoint1' ),
visible: options.p1Visible,
limitBounds: p1Bounds,
phetioState: false
limitBounds: p1Bounds
} ),
model.controlPointGroup.createNextElement( p2.x, p2.y, {
new ControlPoint( p2.x, p2.y, {
tandem: tandem.createTandem( 'controlPoint2' ),
visible: options.p2Visible,
limitBounds: p2Bounds,
phetioState: false
limitBounds: p2Bounds
} ),
model.controlPointGroup.createNextElement( p3.x, p3.y, {
new ControlPoint( p3.x, p3.y, {
tandem: tandem.createTandem( 'controlPoint3' ),
visible: options.p3Visible,
limitBounds: p3Bounds,
phetioState: false
limitBounds: p3Bounds
} )
];
},

/**
* Create a set of control points which create a slope shaped track, touching the ground on the right side.
*/
createSlopeControlPoints: ( model: EnergySkateParkModel, options: IntentionalAny ): ControlPoint[] => {
createSlopeControlPoints: ( model: EnergySkateParkModel, tandem: Tandem, options: IntentionalAny ): ControlPoint[] => {

// eslint-disable-next-line phet/bad-typescript-text
options = merge( {
Expand All @@ -132,17 +133,17 @@ const PremadeTracks = {
const p3Bounds = createRelativeSpaceBounds( p3, 0.5, 2.5, 3, 0 );

return [
model.controlPointGroup.createNextElement( p1.x, p1.y, {
limitBounds: p1Bounds,
phetioState: false
new ControlPoint( p1.x, p1.y, {
tandem: tandem.createTandem( 'controlPoint1' ),
limitBounds: p1Bounds
} ),
model.controlPointGroup.createNextElement( p2.x, p2.y, {
limitBounds: p2Bounds,
phetioState: false
new ControlPoint( p2.x, p2.y, {
tandem: tandem.createTandem( 'controlPoint2' ),
limitBounds: p2Bounds
} ),
model.controlPointGroup.createNextElement( p3.x, p3.y, {
limitBounds: p3Bounds,
phetioState: false
new ControlPoint( p3.x, p3.y, {
tandem: tandem.createTandem( 'controlPoint3' ),
limitBounds: p3Bounds
} )
];
},
Expand All @@ -152,7 +153,7 @@ const PremadeTracks = {
* a but since the interpolation moves it down by that much and we don't want the skater to go below ground
* while on the track. Numbers determined by trial and error.
*/
createDoubleWellControlPoints: ( model: EnergySkateParkModel, options: IntentionalAny ): ControlPoint[] => {
createDoubleWellControlPoints: ( model: EnergySkateParkModel, tandem: Tandem, options: IntentionalAny ): ControlPoint[] => {
// eslint-disable-next-line phet/bad-typescript-text
options = merge( {
trackHeight: 5, // largest height for the well
Expand Down Expand Up @@ -193,38 +194,38 @@ const PremadeTracks = {
const p5Bounds = createRelativeSpaceBounds( p5, 1.5, 1.0, options.p5UpSpacing, options.p5DownSpacing );

return [
model.controlPointGroup.createNextElement( p1.x, p1.y, {
new ControlPoint( p1.x, p1.y, {
tandem: tandem.createTandem( 'controlPoint1' ),
limitBounds: p1Bounds,
visible: options.p1Visible,
phetioState: false
visible: options.p1Visible
} ),
model.controlPointGroup.createNextElement( p2.x, p2.y, {
new ControlPoint( p2.x, p2.y, {
tandem: tandem.createTandem( 'controlPoint2' ),
limitBounds: p2Bounds,
visible: options.p2Visible,
phetioState: false
visible: options.p2Visible
} ),
model.controlPointGroup.createNextElement( p3.x, p3.y, {
new ControlPoint( p3.x, p3.y, {
tandem: tandem.createTandem( 'controlPoint3' ),
limitBounds: p3Bounds,
visible: options.p3Visible,
phetioState: false
visible: options.p3Visible
} ),
model.controlPointGroup.createNextElement( p4.x, p4.y, {
new ControlPoint( p4.x, p4.y, {
tandem: tandem.createTandem( 'controlPoint4' ),
limitBounds: p4Bounds,
visible: options.p4Visible,
phetioState: false
visible: options.p4Visible
} ),
model.controlPointGroup.createNextElement( p5.x, p5.y, {
new ControlPoint( p5.x, p5.y, {
tandem: tandem.createTandem( 'controlPoint5' ),
limitBounds: p5Bounds,
visible: options.p5Visible,
phetioState: false
visible: options.p5Visible
} )
];
},

/**
* Create a set of control points that will form a track that takes the shape of a loop.
*/
createLoopControlPoints: ( model: EnergySkateParkModel, options: IntentionalAny ): ControlPoint[] => {
createLoopControlPoints: ( model: EnergySkateParkModel, tandem: Tandem, options: IntentionalAny ): ControlPoint[] => {
// eslint-disable-next-line phet/bad-typescript-text
options = merge( {
trackWidth: 9,
Expand Down Expand Up @@ -260,33 +261,33 @@ const PremadeTracks = {
const p7Bounds = createRelativeSpaceBounds( p7, 1.5, 0.5, 2, 3 );

return [
model.controlPointGroup.createNextElement( p1.x, p1.y, {
limitBounds: p1Bounds,
phetioState: false
new ControlPoint( p1.x, p1.y, {
tandem: tandem.createTandem( 'controlPoint1' ),
limitBounds: p1Bounds
} ),
model.controlPointGroup.createNextElement( p2.x, p2.y, {
limitBounds: p2Bounds,
phetioState: false
new ControlPoint( p2.x, p2.y, {
tandem: tandem.createTandem( 'controlPoint2' ),
limitBounds: p2Bounds
} ),
model.controlPointGroup.createNextElement( p3.x, p3.y, {
limitBounds: p3Bounds,
phetioState: false
new ControlPoint( p3.x, p3.y, {
tandem: tandem.createTandem( 'controlPoint3' ),
limitBounds: p3Bounds
} ),
model.controlPointGroup.createNextElement( p4.x, p4.y, {
limitBounds: p4Bounds,
phetioState: false
new ControlPoint( p4.x, p4.y, {
tandem: tandem.createTandem( 'controlPoint4' ),
limitBounds: p4Bounds
} ),
model.controlPointGroup.createNextElement( p5.x, p5.y, {
limitBounds: p5Bounds,
phetioState: false
new ControlPoint( p5.x, p5.y, {
tandem: tandem.createTandem( 'controlPoint5' ),
limitBounds: p5Bounds
} ),
model.controlPointGroup.createNextElement( p6.x, p6.y, {
limitBounds: p6Bounds,
phetioState: false
new ControlPoint( p6.x, p6.y, {
tandem: tandem.createTandem( 'controlPoint6' ),
limitBounds: p6Bounds
} ),
model.controlPointGroup.createNextElement( p7.x, p7.y, {
limitBounds: p7Bounds,
phetioState: false
new ControlPoint( p7.x, p7.y, {
tandem: tandem.createTandem( 'controlPoint7' ),
limitBounds: p7Bounds
} )
];
},
Expand Down
8 changes: 4 additions & 4 deletions js/common/view/SceneSelectionRadioButtonGroup.ts
Original file line number Diff line number Diff line change
Expand Up @@ -77,21 +77,21 @@ export default class SceneSelectionRadioButtonGroup extends RectangularRadioButt

let track = null;
if ( trackType === PremadeTracks.TrackType.PARABOLA ) {
const parabolaControlPoints = PremadeTracks.createParabolaControlPoints( model, merge( {
const parabolaControlPoints = PremadeTracks.createParabolaControlPoints( model, Tandem.OPT_OUT, merge( {
trackMidHeight: 1
}, controlPointOptions ) );
track = EnergySkateParkTrackSetModel.createPremadeTrack( model, parabolaControlPoints );
}
else if ( trackType === PremadeTracks.TrackType.SLOPE ) {
const slopeControlPoints = PremadeTracks.createSlopeControlPoints( model, controlPointOptions );
const slopeControlPoints = PremadeTracks.createSlopeControlPoints( model, Tandem.OPT_OUT, controlPointOptions );
track = EnergySkateParkTrackSetModel.createPremadeTrack( model, slopeControlPoints );
}
else if ( trackType === PremadeTracks.TrackType.DOUBLE_WELL ) {
const doubleWellControlPoints = PremadeTracks.createDoubleWellControlPoints( model, controlPointOptions );
const doubleWellControlPoints = PremadeTracks.createDoubleWellControlPoints( model, Tandem.OPT_OUT, controlPointOptions );
track = EnergySkateParkTrackSetModel.createPremadeTrack( model, doubleWellControlPoints );
}
else if ( trackType === PremadeTracks.TrackType.LOOP ) {
const loopControlPoints = PremadeTracks.createLoopControlPoints( model, merge( {
const loopControlPoints = PremadeTracks.createLoopControlPoints( model, Tandem.OPT_OUT, merge( {
innerLoopWidth: 2.5,
innerLoopTop: 3.5
}, controlPointOptions ) );
Expand Down
16 changes: 6 additions & 10 deletions js/graphs/model/GraphsModel.ts
Original file line number Diff line number Diff line change
Expand Up @@ -83,8 +83,7 @@ export default class GraphsModel extends EnergySkateParkTrackSetModel {
},
doubleWellTrackOptions: {
configurable: tracksConfigurable,
tandem: tandem.createTandem( 'doubleWellTrack' ),
phetioState: false
tandem: tandem.createTandem( 'doubleWellTrack' )
},

parabolaControlPointOptions: {
Expand All @@ -95,8 +94,7 @@ export default class GraphsModel extends EnergySkateParkTrackSetModel {
},
parabolaTrackOptions: {
configurable: tracksConfigurable,
tandem: tandem.createTandem( 'parabolaTrack' ),
phetioState: false
tandem: tandem.createTandem( 'parabolaTrack' )
}
},

Expand Down Expand Up @@ -319,7 +317,7 @@ export default class GraphsModel extends EnergySkateParkTrackSetModel {
const trackHeight = GraphsConstants.TRACK_HEIGHT;
const trackWidth = GraphsConstants.TRACK_WIDTH;

const parabolaControlPoints = PremadeTracks.createParabolaControlPoints( this, {
const parabolaControlPoints = PremadeTracks.createParabolaControlPoints( this, tandem.createTandem( 'parabolaTrack' ), {
trackHeight: trackHeight,
trackWidth: trackWidth,
p1Visible: false,
Expand All @@ -328,11 +326,10 @@ export default class GraphsModel extends EnergySkateParkTrackSetModel {

const parabolaTrack = PremadeTracks.createTrack( this, parabolaControlPoints, {
configurable: this.tracksConfigurable,
tandem: tandem.createTandem( 'parabolaTrack' ),
phetioState: false
tandem: tandem.createTandem( 'parabolaTrack' )
} );

const doubleWellControlPoints = PremadeTracks.createDoubleWellControlPoints( this, {
const doubleWellControlPoints = PremadeTracks.createDoubleWellControlPoints( this, tandem.createTandem( 'doubleWellTrack' ), {
trackHeight: 4,
trackWidth: 10,
trackMidHeight: 1.5,
Expand All @@ -353,8 +350,7 @@ export default class GraphsModel extends EnergySkateParkTrackSetModel {
} );
const doubleWellTrack = PremadeTracks.createTrack( this, doubleWellControlPoints, {
configurable: this.tracksConfigurable,
tandem: tandem.createTandem( 'doubleWellTrack' ),
phetioState: false
tandem: tandem.createTandem( 'doubleWellTrack' )
} );

return [ parabolaTrack, doubleWellTrack ];
Expand Down

0 comments on commit 98d81a2

Please sign in to comment.