Skip to content

Commit

Permalink
Fix a possible crash of the instance editor when updating a sprite (#…
Browse files Browse the repository at this point in the history
…5881)

* Fix calling methods on Texture frame which can be null when an image is updated
  • Loading branch information
ClementPasteau authored Nov 7, 2023
1 parent 05df9cb commit 2d5b2a4
Show file tree
Hide file tree
Showing 4 changed files with 114 additions and 95 deletions.
82 changes: 42 additions & 40 deletions Extensions/3D/JsExtension.js
Original file line number Diff line number Diff line change
Expand Up @@ -39,16 +39,18 @@ module.exports = {
.setIcon('res/conditions/3d_box.svg');

{
const base3D = extension.addBehavior(
"Base3DBehavior",
_("3D capability"),
"Object3D",
_("Move the object in 3D space."),
"",
"res/conditions/3d_box.svg",
"Base3DBehavior",
const base3D = extension
.addBehavior(
'Base3DBehavior',
_('3D capability'),
'Object3D',
_('Move the object in 3D space.'),
'',
'res/conditions/3d_box.svg',
'Base3DBehavior',
new gd.Behavior(),
new gd.BehaviorsSharedData())
new gd.BehaviorsSharedData()
)
.setHidden()
.setIncludeFile('Extensions/3D/Base3DBehavior.js');

Expand All @@ -63,11 +65,11 @@ module.exports = {
'res/conditions/3d_box.svg'
)
.addParameter('object', _('3D object'))
.addParameter("behavior", _("Behavior"), "Base3DBehavior")
.addParameter('behavior', _('Behavior'), 'Base3DBehavior')
.useStandardParameters('number', gd.ParameterOptions.makeNewOptions())
.setFunctionName('setZ')
.setGetter('getZ');

base3D
.addExpressionAndConditionAndAction(
'number',
Expand Down Expand Up @@ -95,23 +97,23 @@ module.exports = {
'res/conditions/3d_box.svg'
)
.addParameter('object', _('3D object'))
.addParameter("behavior", _("Behavior"), "Base3DBehavior")
.addParameter('behavior', _('Behavior'), 'Base3DBehavior')
.useStandardParameters('number', gd.ParameterOptions.makeNewOptions())
.setFunctionName('setDepth')
.setGetter('getDepth');

base3D
base3D
.addExpressionAndConditionAndAction(
'number',
'ScaleZ',
_('Scale on Z axis'),
_("the scale on Z axis of an object (default scale is 1)"),
_("the scale on Z axis scale"),
_('the scale on Z axis of an object (default scale is 1)'),
_('the scale on Z axis scale'),
_('Size'),
'res/conditions/3d_box.svg'
)
.addParameter('object', _('3D object'))
.addParameter("behavior", _("Behavior"), "Base3DBehavior")
.addParameter('behavior', _('Behavior'), 'Base3DBehavior')
.useStandardParameters(
'number',
gd.ParameterOptions.makeNewOptions().setDescription(
Expand All @@ -122,7 +124,7 @@ module.exports = {
.setFunctionName('setScaleZ')
.setGetter('getScaleZ');

base3D
base3D
.addScopedAction(
'FlipZ',
_('Flip the object on Z'),
Expand All @@ -133,12 +135,12 @@ module.exports = {
'res/conditions/3d_box.svg'
)
.addParameter('object', _('3D object'))
.addParameter("behavior", _("Behavior"), "Base3DBehavior")
.addParameter('behavior', _('Behavior'), 'Base3DBehavior')
.addParameter('yesorno', _('Activate flipping'))
.markAsSimple()
.setFunctionName('flipZ');

base3D
base3D
.addScopedCondition(
'FlippedZ',
_('Flipped on Z'),
Expand All @@ -149,10 +151,10 @@ module.exports = {
'res/conditions/3d_box.svg'
)
.addParameter('object', _('3D object'))
.addParameter("behavior", _("Behavior"), "Base3DBehavior")
.addParameter('behavior', _('Behavior'), 'Base3DBehavior')
.setFunctionName('isFlippedZ');

base3D
base3D
.addExpressionAndConditionAndAction(
'number',
'RotationX',
Expand All @@ -163,12 +165,12 @@ module.exports = {
'res/conditions/3d_box.svg'
)
.addParameter('object', _('3D object'))
.addParameter("behavior", _("Behavior"), "Base3DBehavior")
.addParameter('behavior', _('Behavior'), 'Base3DBehavior')
.useStandardParameters('number', gd.ParameterOptions.makeNewOptions())
.setFunctionName('setRotationX')
.setGetter('getRotationX');

base3D
base3D
.addExpressionAndConditionAndAction(
'number',
'RotationY',
Expand All @@ -179,12 +181,12 @@ module.exports = {
'res/conditions/3d_box.svg'
)
.addParameter('object', _('3D object'))
.addParameter("behavior", _("Behavior"), "Base3DBehavior")
.addParameter('behavior', _('Behavior'), 'Base3DBehavior')
.useStandardParameters('number', gd.ParameterOptions.makeNewOptions())
.setFunctionName('setRotationY')
.setGetter('getRotationY');

base3D
base3D
.addScopedAction(
'TurnAroundX',
_('Turn around X axis'),
Expand All @@ -197,12 +199,12 @@ module.exports = {
'res/conditions/3d_box.svg'
)
.addParameter('object', _('3D object'))
.addParameter("behavior", _("Behavior"), "Base3DBehavior")
.addParameter('behavior', _('Behavior'), 'Base3DBehavior')
.addParameter('number', _('Rotation angle'), '', false)
.markAsAdvanced()
.setFunctionName('turnAroundX');

base3D
base3D
.addScopedAction(
'TurnAroundY',
_('Turn around Y axis'),
Expand All @@ -215,12 +217,12 @@ module.exports = {
'res/conditions/3d_box.svg'
)
.addParameter('object', _('3D object'))
.addParameter("behavior", _("Behavior"), "Base3DBehavior")
.addParameter('behavior', _('Behavior'), 'Base3DBehavior')
.addParameter('number', _('Rotation angle'), '', false)
.markAsAdvanced()
.setFunctionName('turnAroundY');

base3D
base3D
.addScopedAction(
'TurnAroundZ',
_('Turn around Z axis'),
Expand All @@ -233,7 +235,7 @@ module.exports = {
'res/conditions/3d_box.svg'
)
.addParameter('object', _('3D object'))
.addParameter("behavior", _("Behavior"), "Base3DBehavior")
.addParameter('behavior', _('Behavior'), 'Base3DBehavior')
.addParameter('number', _('Rotation angle'), '', false)
.markAsAdvanced()
.setFunctionName('turnAroundZ');
Expand All @@ -249,7 +251,7 @@ module.exports = {
new gd.Model3DObjectConfiguration()
)
.setCategoryFullName(_('General'))
// Effects are unsupported because the object is not rendered with PIXI.
// Effects are unsupported because the object is not rendered with PIXI.
.addDefaultBehavior('ResizableCapability::ResizableBehavior')
.addDefaultBehavior('ScalableCapability::ScalableBehavior')
.addDefaultBehavior('FlippableCapability::FlippableBehavior')
Expand Down Expand Up @@ -280,7 +282,6 @@ module.exports = {
.setFunctionName('setZ')
.setGetter('getZ');


// Deprecated
object
.addExpressionAndConditionAndAction(
Expand Down Expand Up @@ -1161,7 +1162,7 @@ module.exports = {
.setFunctionName('setZ')
.setGetter('getZ');

// Deprecated
// Deprecated
object
.addExpressionAndConditionAndAction(
'number',
Expand Down Expand Up @@ -1306,7 +1307,7 @@ module.exports = {
.setFunctionName('setScaleX')
.setGetter('getScaleX');

// Deprecated
// Deprecated
object
.addExpressionAndConditionAndAction(
'number',
Expand Down Expand Up @@ -2162,17 +2163,18 @@ module.exports = {
updatePIXISprite() {
const width = this.getWidth();
const height = this.getHeight();
const objectTextureFrame = this._pixiTexturedObject.texture.frame;
// In case the texture is not loaded yet, we don't want to crash.
if (!objectTextureFrame) return;

this._pixiTexturedObject.anchor.x =
this._centerX / this._pixiTexturedObject.texture.frame.width;
this._centerX / objectTextureFrame.width;
this._pixiTexturedObject.anchor.y =
this._centerY / this._pixiTexturedObject.texture.frame.height;
this._centerY / objectTextureFrame.height;

this._pixiTexturedObject.angle = this._instance.getAngle();
this._pixiTexturedObject.scale.x =
width / this._pixiTexturedObject.texture.frame.width;
this._pixiTexturedObject.scale.y =
height / this._pixiTexturedObject.texture.frame.height;
this._pixiTexturedObject.scale.x = width / objectTextureFrame.width;
this._pixiTexturedObject.scale.y = height / objectTextureFrame.height;

this._pixiTexturedObject.position.x =
this._instance.getX() +
Expand Down
98 changes: 52 additions & 46 deletions newIDE/app/src/InstancesEditor/InstancePropertiesEditor/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@ import VariablesList, {
} from '../../VariablesList/VariablesList';
import ShareExternal from '../../UI/CustomSvgIcons/ShareExternal';
import useForceUpdate from '../../Utils/UseForceUpdate';
import ErrorBoundary from '../../UI/ErrorBoundary';

type Props = {|
project: gdProject,
Expand Down Expand Up @@ -347,55 +348,60 @@ const InstancePropertiesEditor = ({
if (!object || !instance || !instanceSchema) return null;

return (
<ScrollView
autoHideScrollbar
key={instances
.map((instance: gdInitialInstance) => '' + instance.ptr)
.join(';')}
<ErrorBoundary
title="An error occurred when displaying instance properties"
scope="instance-properties-editor"
>
<Column expand noMargin id="instance-properties-editor">
<Column>
<PropertiesEditor
unsavedChanges={unsavedChanges}
schema={instanceSchema}
instances={instances}
onInstancesModified={onInstancesModified}
/>
<Line alignItems="center" justifyContent="space-between">
<Text>
<Trans>Instance Variables</Trans>
</Text>
<IconButton
<ScrollView
autoHideScrollbar
key={instances
.map((instance: gdInitialInstance) => '' + instance.ptr)
.join(';')}
>
<Column expand noMargin id="instance-properties-editor">
<Column>
<PropertiesEditor
unsavedChanges={unsavedChanges}
schema={instanceSchema}
instances={instances}
onInstancesModified={onInstancesModified}
/>
<Line alignItems="center" justifyContent="space-between">
<Text>
<Trans>Instance Variables</Trans>
</Text>
<IconButton
size="small"
onClick={() => {
editInstanceVariables(instance);
}}
>
<ShareExternal />
</IconButton>
</Line>
</Column>
{object ? (
<VariablesList
directlyStoreValueChangesWhileEditing
inheritedVariablesContainer={object.getVariables()}
variablesContainer={instance.getVariables()}
size="small"
onClick={() => {
editInstanceVariables(instance);
}}
>
<ShareExternal />
</IconButton>
</Line>
onComputeAllVariableNames={() =>
object
? EventsRootVariablesFinder.findAllObjectVariables(
project.getCurrentPlatform(),
project,
layout,
object
)
: []
}
historyHandler={historyHandler}
/>
) : null}
</Column>
{object ? (
<VariablesList
directlyStoreValueChangesWhileEditing
inheritedVariablesContainer={object.getVariables()}
variablesContainer={instance.getVariables()}
size="small"
onComputeAllVariableNames={() =>
object
? EventsRootVariablesFinder.findAllObjectVariables(
project.getCurrentPlatform(),
project,
layout,
object
)
: []
}
historyHandler={historyHandler}
/>
) : null}
</Column>
</ScrollView>
</ScrollView>
</ErrorBoundary>
);
};

Expand Down
Loading

0 comments on commit 2d5b2a4

Please sign in to comment.