Compare commits

...

2 Commits

Author SHA1 Message Date
AlexandreSi
65c51ee02f Fix 2023-01-11 10:41:59 +01:00
AlexandreSi
03e1234874 Add concept of rendered instance with customizable center to better represent sprite instances 2023-01-11 09:45:48 +01:00
3 changed files with 49 additions and 6 deletions

View File

@@ -2,6 +2,7 @@
import gesture from 'pixi-simple-gesture';
import ObjectsRenderingService from '../../ObjectsRendering/ObjectsRenderingService';
import RenderedInstance from '../../ObjectsRendering/Renderers/RenderedInstance';
import RenderedInstanceWithCustomizableCenter from '../../ObjectsRendering/Renderers/RenderedInstanceWithCustomizableCenter';
import getObjectByName from '../../Utils/GetObjectByName';
import ViewPosition from '../ViewPosition';
@@ -39,7 +40,9 @@ export default class LayerRenderer {
/** Used for instances culling on rendering */
viewBottomRight: [number, number];
renderedInstances: { [number]: RenderedInstance } = {};
renderedInstances: {
[number]: RenderedInstance | RenderedInstanceWithCustomizableCenter,
} = {};
pixiContainer: PIXI.Container;
/** Functor used to render an instance */
@@ -205,8 +208,21 @@ export default class LayerRenderer {
rectangle[3][0] = right;
rectangle[3][1] = top;
const centerX = (rectangle[0][0] + rectangle[2][0]) / 2;
const centerY = (rectangle[0][1] + rectangle[2][1]) / 2;
let centerX = undefined;
let centerY = undefined;
const renderedInstance = this.renderedInstances[instance.ptr];
if (
renderedInstance &&
renderedInstance instanceof RenderedInstanceWithCustomizableCenter
) {
centerX = instance.getX() + renderedInstance.getCenterX();
centerY = instance.getY() + renderedInstance.getCenterY();
} else {
centerX = (rectangle[0][0] + rectangle[2][0]) / 2;
centerY = (rectangle[0][1] + rectangle[2][1]) / 2;
}
const angle = (instance.getAngle() * Math.PI) / 180;
rotatePolygon(rectangle, centerX, centerY, angle);
return rectangle;

View File

@@ -0,0 +1,17 @@
// @flow
import RenderedInstance from './RenderedInstance';
/**
* RenderedInstanceWithCustomizableCenter is a derivative of RenderedInstance
* that represents an instance whose center can be custom (not at the center of
* the AABB of the object).
*/
export default class RenderedInstanceWithCustomizableCenter extends RenderedInstance {
getCenterX() {
return this.getDefaultWidth() / 2;
}
getCenterY() {
return this.getDefaultHeight() / 2;
}
}

View File

@@ -1,5 +1,5 @@
// @flow
import RenderedInstance from './RenderedInstance';
import RenderedInstanceWithCustomizableCenter from './RenderedInstanceWithCustomizableCenter';
import PixiResourcesLoader from '../../ObjectsRendering/PixiResourcesLoader';
import ResourcesLoader from '../../ResourcesLoader';
import * as PIXI from 'pixi.js-legacy';
@@ -8,7 +8,7 @@ const gd: libGDevelop = global.gd;
/**
* Renderer for gd.SpriteObject
*/
export default class RenderedSpriteInstance extends RenderedInstance {
export default class RenderedSpriteInstance extends RenderedInstanceWithCustomizableCenter {
_renderedAnimation: number;
_renderedDirection: number;
_centerX: number;
@@ -86,7 +86,7 @@ export default class RenderedSpriteInstance extends RenderedInstance {
this._centerY / this._pixiObject.texture.frame.height;
this._pixiObject.rotation = this._shouldNotRotate
? 0
: RenderedInstance.toRad(this._instance.getAngle());
: RenderedInstanceWithCustomizableCenter.toRad(this._instance.getAngle());
if (this._instance.hasCustomSize()) {
this._pixiObject.scale.x =
this._instance.getCustomWidth() / this._pixiObject.texture.frame.width;
@@ -202,4 +202,14 @@ export default class RenderedSpriteInstance extends RenderedInstance {
getDefaultHeight(): number {
return Math.abs(this._pixiObject.texture.frame.height);
}
getCenterX(): number {
if (!this._sprite || !this._pixiObject) return 0;
return this._centerX * this._pixiObject.scale.x;
}
getCenterY(): number {
if (!this._sprite || !this._pixiObject) return 0;
return this._centerY * this._pixiObject.scale.y;
}
}