/**
* additional import for TypeScript
* @import {Matrix3d} from "../math/matrix3d.ts";
* @import Entity from "./entity/entity.js";
* @import Container from "./container.js";
* @import {Line} from "./../geometries/line.ts";
* @import {Ellipse} from "./../geometries/ellipse.ts";
* @import {Polygon} from "../geometries/polygon.ts";
* @import {RoundRect} from "./../geometries/roundrect.ts";
* @import Application from "./../application/application.ts";
* @import CanvasRenderer from "./../video/canvas/canvas_renderer.js";
* @import WebGLRenderer from "./../video/webgl/webgl_renderer.js";
* @import ResponseObject from "./../physics/response.js";
**/
/**
* A base class for renderable objects.
* @category Game Objects
*/
export default class Renderable extends Rect {
isDirty: boolean;
/**
* The anchor point is used for attachment behavior, and/or when applying transformations.
* The coordinate system places the origin at the top left corner of the frame (0, 0) and (1, 1) means the bottom-right corner
* 
* a Renderable's anchor point defaults to (0.5,0.5), which corresponds to the center position.
*
* Note: Object created through Tiled will have their anchorPoint set to (0, 0) to match Tiled Level editor implementation.
* To specify a value through Tiled, use a json expression like `json:{"x":0.5,"y":0.5}`.
* @type {ObservablePoint}
* @default <0.5,0.5>
*/
anchorPoint: ObservablePoint;
/**
* the renderable transformation matrix (4x4).
* For standard 2D use, only the 2D components are used (rotate around Z, scale X/Y, translate X/Y).
* For 3D use (e.g. Mesh), the full 4x4 matrix supports rotation around any axis,
* 3D translation, and perspective projection.
* Use the `rotate()`, `scale()`, and `translate()` methods rather than modifying this directly.
* @type {Matrix3d}
*/
currentTransform: Matrix3d;
/**
* the renderable physics body — the handle returned by the
* active {@link PhysicsAdapter}'s `addBody` (or constructed
* imperatively via `new Body(...)`). Typed as the portable
* {@link PhysicsBody} interface; cast to the adapter-specific
* concrete type (`MatterAdapter.Body`, `BuiltinAdapter.Body`, or
* the legacy {@link Body} class) to reach native fields.
* @type {PhysicsBody}
* @example
* // define a new Player Class
* class PlayerEntity extends me.Sprite {
* // constructor
* constructor(x, y, settings) {
* // call the parent constructor
* super(x, y , settings);
*
* // define a basic walking animation
* this.addAnimation("walk", [...]);
* // define a standing animation (using the first frame)
* this.addAnimation("stand", [...]);
* // set the standing animation as default
* this.setCurrentAnimation("stand");
*
* // add a physic body
* this.body = new me.Body(this);
* // add a default collision shape
* this.body.addShape(new me.Rect(0, 0, this.width, this.height));
* // configure max speed, friction, and initial force to be applied
* this.body.setMaxVelocity(3, 15);
* this.body.setFriction(0.4, 0);
* this.body.force.set(3, 0);
* this.isKinematic = false;
*
* // set the display to follow our position on both axis
* app.viewport.follow(this.pos, app.viewport.AXIS.BOTH);
* }
*
* ...
*
* }
*/
body: PhysicsBody;
/**
* Declarative body definition consumed by the active
* {@link PhysicsAdapter} when this renderable is added to a
* container. **Adapter API only** — leave `undefined` if you
* build a body imperatively via `this.body = new Body(...)`.
*
* When set, the parent container forwards it to
* `world.adapter.addBody(this, this.bodyDef)`, which constructs
* the underlying physics body (matter, builtin SAT, …) and
* assigns the engine-portable wrapper to `this.body`. This is
* the engine-portable path: the same `bodyDef` produces an
* equivalent body under any adapter.
*
* Typical fields: `type` (`"static"`/`"dynamic"`/`"kinematic"`),
* `shapes`, `collisionType`, `collisionMask`, `restitution`,
* `frictionAir`, `density`, `gravityScale`, `isSensor`,
* `maxVelocity`, `fixedRotation`. See {@link BodyDefinition}.
* @type {object|undefined}
* @default undefined
*/
bodyDef: object | undefined;
/**
* (G)ame (U)nique (Id)entifier"
* a GUID will be allocated for any renderable object added
* to an object container (including the `app.world` container)
* @type {string}
*/
GUID: string;
/**
* an event handler that is called when the renderable leave or enter a camera viewport
* @type {Function}
* @default undefined
* @example
* this.onVisibilityChange = function(inViewport) {
* if (inViewport === true) {
* console.log("object has entered the in a camera viewport!");
* }
* };
*/
onVisibilityChange: Function;
/**
* Whether the renderable object will always update, even when outside of the viewport
* @type {boolean}
* @default false
*/
alwaysUpdate: boolean;
/**
* Whether to update this object when the game is paused.
* @type {boolean}
* @default false
*/
updateWhenPaused: boolean;
/**
* make the renderable object persistent over level changes
* @type {boolean}
* @default false
*/
isPersistent: boolean;
/**
* If true, this renderable will be rendered using screen coordinates,
* as opposed to world coordinates. Use this, for example, to define UI elements.
* @type {boolean}
* @default false
*/
floating: boolean;
/**
* If true, this floating renderable will be rendered by all cameras
* (e.g. background image layers). If false (default), floating elements
* are only rendered by the default camera (e.g. UI/HUD elements).
* Only applies to floating renderables in multi-camera setups.
* @type {boolean}
* @default false
*/
visibleInAllCameras: boolean;
/**
* When enabled, an object container will automatically apply
* any defined transformation before calling the child draw method.
* @type {boolean}
* @default true
* @example
* // enable "automatic" transformation when the object is activated
* onActivateEvent: function () {
* // reset the transformation matrix
* this.currentTransform.identity();
* // ensure the anchor point is the renderable center
* this.anchorPoint.set(0.5, 0.5);
* // enable auto transform
* this.autoTransform = true;
* ....
* }
*/
autoTransform: boolean;
/**
* Define the renderable opacity
* Set to zero if you do not wish an object to be drawn
* @see Renderable#setOpacity
* @see Renderable#getOpacity
* @type {number}
* @default 1.0
*/
alpha: number;
/**
* a reference to the parent object that contains this renderable
* @type {Container|Entity}
* @default undefined
*/
ancestor: Container | Entity;
/**
* A mask limits rendering elements to the shape and position of the given mask object.
* So, if the renderable is larger than the mask, only the intersecting part of the renderable will be visible.
* @type {Rect|RoundRect|Polygon|Line|Ellipse}
* @default undefined
* @example
* // apply a mask in the shape of a Star
* myNPCSprite.mask = new me.Polygon(myNPCSprite.width / 2, 0, [
* // draw a star
* {x: 0, y: 0},
* {x: 14, y: 30},
* {x: 47, y: 35},
* {x: 23, y: 57},
* {x: 44, y: 90},
* {x: 0, y: 62},
* {x: -44, y: 90},
* {x: -23, y: 57},
* {x: -47, y: 35},
* {x: -14, y: 30}
* ]);
*/
mask: Rect | RoundRect | Polygon | Line | Ellipse;
/**
* the list of post-processing shader effects applied to this renderable (WebGL only).
* Effects are applied in order. Use {@link addPostEffect}, {@link getPostEffect},
* and {@link removePostEffect} to manage effects, or assign directly.
* In Canvas mode, this property is ignored.
* @type {Array}
* @default []
* @example
* // add effects via helper methods
* mySprite.addPostEffect(new DesaturateEffect(renderer));
* mySprite.addPostEffect(new VignetteEffect(renderer));
* @example
* // assign directly
* mySprite.postEffects = [new SepiaEffect(renderer), new VignetteEffect(renderer)];
*/
postEffects: Array;
/**
* whether this renderable manages its own FBO lifecycle (e.g. Camera2d)
* @ignore
*/
_postEffectManaged: boolean;
/**
* the blend mode to be applied to this renderable (see renderer setBlendMode for available blend mode)
* @type {string}
* @default "normal"
* @see CanvasRenderer#setBlendMode
* @see WebGLRenderer#setBlendMode
*/
blendMode: string;
/**
* The name of the renderable
* @type {string}
* @default ""
*/
name: string;
/**
* to identify the object as a renderable object
* @ignore
*/
isRenderable: boolean;
/**
* If true then physic collision and input events will not impact this renderable
* @type {boolean}
* @default true
*/
isKinematic: boolean;
/**
* cache the absolute position of the renderable
* @ignore
*/
_absPos: import("../index.ts").Vector3d | undefined;
/**
* keep track of when we flip
* @ignore
*/
_flip: {
x: boolean;
y: boolean;
};
/**
* viewport flag
* @ignore
*/
_inViewport: boolean;
/**
* cache value for the parentApp
* @ignore
*/
_parentApp: any;
/**
* renderable cache tint value used by the getter/setter
* @ignore
*/
_tint: import("../index.ts").Color;
/**
* returns the parent application (or game) to which this renderable is attached to
* @return {Application} the parent application or undefined if not attached to any container/app
*/
get parentApp(): Application;
/**
* Whether the renderable object is floating (i.e. used screen coordinates), or contained in a floating parent container
* @see Renderable#floating
* @type {boolean}
*/
get isFloating(): boolean;
set tint(value: Color);
/**
* define a tint for this renderable. a (255, 255, 255) r, g, b value will remove the tint effect.
* @type {Color}
* @default (255, 255, 255)
* @example
* // add a red tint to this renderable
* this.tint.setColor(255, 128, 128);
* // remove the tint
* this.tint.setColor(255, 255, 255);
*/
get tint(): Color;
set depth(value: number);
/**
* the depth of this renderable on the z axis
* @type {number}
*/
get depth(): number;
set inViewport(value: boolean);
/**
* Whether the renderable object is visible and within the viewport
* @type {boolean}
* @default false
*/
get inViewport(): boolean;
set shader(value: GLShader | ShaderEffect | undefined);
/**
* @deprecated since 19.2.0 — use {@link addPostEffect} / {@link getPostEffect} / {@link removePostEffect} instead
* @type {GLShader|ShaderEffect|undefined}
*/
get shader(): GLShader | ShaderEffect | undefined;
/**
* Add a post-processing shader effect to this renderable.
* @param {GLShader|ShaderEffect} effect - the effect to add
* @returns {GLShader|ShaderEffect} the added effect
* @example
* mySprite.addPostEffect(new DesaturateEffect(renderer));
*/
addPostEffect(effect: GLShader | ShaderEffect): GLShader | ShaderEffect;
/**
* Get post-processing shader effects.
* When called with a class, returns the first effect matching the given class.
* When called without arguments, returns the full effects array.
* @param {Function} [effectClass] - the effect class to search for
* @returns {GLShader|ShaderEffect|Array|undefined} the matching effect, the effects array, or undefined
* @example
* const desat = sprite.getPostEffect(DesaturateEffect);
* const allEffects = sprite.getPostEffect();
*/
getPostEffect(effectClass?: Function): GLShader | ShaderEffect | any[] | undefined;
/**
* Remove all post-processing shader effects.
* @example
* sprite.clearPostEffects();
*/
clearPostEffects(): void;
/**
* Remove a specific post-processing shader effect.
* @param {GLShader|ShaderEffect} effect - the effect to remove
* @example
* sprite.removePostEffect(effect);
*/
removePostEffect(effect: GLShader | ShaderEffect): void;
/**
* returns true if this renderable is flipped on the horizontal axis
* @public
* @see Renderable#flipX
* @type {boolean}
*/
public get isFlippedX(): boolean;
/**
* returns true if this renderable is flipped on the vertical axis
* @public
* @see Renderable#flipY
* @type {boolean}
*/
public get isFlippedY(): boolean;
/**
* returns the bounding box for this renderable
* @returns {Bounds} bounding box Rectangle object
*/
getBounds(): Bounds;
/**
* get the renderable alpha channel value
* @returns {number} current opacity value between 0 and 1
*/
getOpacity(): number;
/**
* set the renderable alpha channel value
* @param {number} alpha - opacity value between 0.0 and 1.0
*/
setOpacity(alpha: number): void;
/**
* flip the renderable on the horizontal axis (around the center of the renderable)
* @see Matrix3d#scaleX
* @param {boolean} [flip=true] - `true` to flip this renderable.
* @returns {Renderable} Reference to this object for method chaining
*/
flipX(flip?: boolean): Renderable;
/**
* flip the renderable on the vertical axis (around the center of the renderable)
* @see Matrix3d#scaleY
* @param {boolean} [flip=true] - `true` to flip this renderable.
* @returns {Renderable} Reference to this object for method chaining
*/
flipY(flip?: boolean): Renderable;
/**
* multiply the renderable currentTransform with the given matrix
* @see Renderable#currentTransform
* @param {Matrix2d|Matrix3d} m - the transformation matrix
* @returns {Renderable} Reference to this object for method chaining
*/
transform(m: Matrix2d | Matrix3d): Renderable;
/**
* return the angle to the specified target
* @param {Renderable|Vector2d|Vector3d} target
* @returns {number} angle in radians
*/
angleTo(target: Renderable | Vector2d | Vector3d): number;
/**
* return the distance to the specified target
* @param {Renderable|Vector2d|Vector3d} target
* @returns {number} distance
*/
distanceTo(target: Renderable | Vector2d | Vector3d): number;
/**
* Rotate this renderable towards the given target.
* @param {Renderable|Vector2d|Vector3d} target - the renderable or position to look at
* @returns {Renderable} Reference to this object for method chaining
*/
lookAt(target: Renderable | Vector2d | Vector3d): Renderable;
/**
* Rotate this renderable by the specified angle (in radians).
* When called with just an angle, rotates around the Z axis (2D rotation).
* When called with an angle and a Vector3d axis, rotates around that axis in 3D.
* @param {number} angle - The angle to rotate (in radians)
* @param {Vector3d} [v] - the axis to rotate around (defaults to Z axis for 2D)
* @returns {Renderable} Reference to this object for method chaining
*/
rotate(angle: number, v?: Vector3d): Renderable;
/**
* scale the renderable around his anchor point. Scaling actually applies changes
* to the currentTransform member which is used by the renderer to scale the object
* when rendering. It does not scale the object itself. For example if the renderable
* is an image, the image.width and image.height properties are unaltered but the currentTransform
* member will be changed.
* @param {number} x - a number representing the abscissa of the scaling vector.
* @param {number} [y=x] - a number representing the ordinate of the scaling vector.
* @param {number} [z=1] - a number representing the depth of the scaling vector.
* @returns {Renderable} Reference to this object for method chaining
*/
scale(x: number, y?: number, z?: number): Renderable;
/**
* scale the renderable around his anchor point
* @param {Vector2d} v - scaling vector
* @returns {Renderable} Reference to this object for method chaining
*/
scaleV(v: Vector2d): Renderable;
/**
* Translate the renderable by the specified offset.
* @param {number} x - x offset
* @param {number} [y=0] - y offset
* @param {number} [z=0] - z offset
* @returns {Renderable} Reference to this object for method chaining
*/
translate(x: number, y?: number, z?: number): Renderable;
/**
* update function (automatically called by melonJS).
* @param {number} dt - time since the last update in milliseconds.
* @returns {boolean} true if the renderable is dirty
*/
update(dt: number): boolean;
/**
* update the bounding box for this shape.
* @param {boolean} [absolute=true] - update the bounds size and position in (world) absolute coordinates
* @returns {Bounds} this shape bounding box Rectangle object
*/
updateBounds(absolute?: boolean): Bounds;
/**
* return the renderable absolute position in the game world. The
* returned vector is a {@link Vector3d} so the z component is summed
* across the ancestor chain too — important for {@link Camera3d}'s
* frustum culling, which previously read `obj.depth` (local
* `pos.z`) and mis-culled children nested under a container with
* its own non-zero depth.
* @returns {Vector3d}
*/
getAbsolutePosition(): Vector3d;
/**
* Prepare the rendering context before drawing (automatically called by melonJS).
* This will apply any defined transforms, anchor point, tint or blend mode and translate the context accordingly to this renderable position.
* @see Renderable#draw
* @see Renderable#postDraw
* @param {CanvasRenderer|WebGLRenderer} renderer - a renderer object
*/
preDraw(renderer: CanvasRenderer | WebGLRenderer): void;
/**
* Draw this renderable (automatically called by melonJS).
* All draw operations for renderable are made respectively
* to the position or transforms set or applied by the preDraw method.
* The main draw loop will first call preDraw() to prepare the context for drawing the renderable,
* then draw() to draw the renderable, and finally postDraw() to clear the context.
* If you override this method, be mindful about the drawing logic; for example if you draw a shape
* from the draw method, you should make sure that your draw it at the 0, 0 coordinates.
* @see Renderable#preDraw
* @see Renderable#postDraw
* @param {CanvasRenderer|WebGLRenderer} renderer - a renderer instance
* @param {Camera2d} [viewport] - the viewport to (re)draw
*/
draw(renderer: CanvasRenderer | WebGLRenderer, viewport?: Camera2d): void;
/**
* restore the rendering context after drawing (automatically called by melonJS).
* @see Renderable#preDraw
* @see Renderable#draw
* @param {CanvasRenderer|WebGLRenderer} renderer - a renderer object
*/
postDraw(renderer: CanvasRenderer | WebGLRenderer): void;
/**
* Legacy collision callback — fires every frame this renderable body is
* overlapping another body. Kept for backward compatibility with code
* written against pre-19.5 melonJS; semantics are unchanged from the
* 19.4 contract.
*
* **NOTE — `onCollision` is NOT equivalent to {@link Renderable.onCollisionActive}.**
* The two handlers exist side by side and have intentionally different
* contracts:
*
* | | `onCollision` (legacy) | `onCollisionActive` (modern) |
* |---|---|---|
* | Cadence for dynamic-dynamic pairs | 2× per frame per side | 1× per frame per side |
* | `response.a` semantics | Fixed per pair (first body in detector call) | Always the receiver (`response.a === this`) |
* | `response.b` semantics | Fixed per pair | Always the partner (`response.b === other`) |
* | `response.normal` / `response.depth` | ✗ | ✓ — `normal.y < -0.7` = "push me up" |
* | `return false` to skip push-out | ✓ (honored by SAT) | ✗ — use `bodyDef.isSensor` or `setSensor` instead |
*
* If you're writing new code, prefer `onCollisionActive`. Keep
* `onCollision` only when its every-frame, return-false, fixed-`a`/`b`
* semantics are what you want.
*
* @param {import("../physics/adapter.ts").CollisionResponse} response - the collision response object
* @param {Renderable} other - the other renderable touching this one (a reference to response.a or response.b)
* @returns {boolean} true if the object should respond to the collision (its position and velocity will be corrected); the return value is only honored by the builtin SAT adapter.
* @example
* // legacy collision handler — note the receiver-side check on response.a
* onCollision(response) {
* if (response.b.body.collisionType === me.collision.types.ENEMY_OBJECT) {
* this.pos.sub(response.overlapV);
* this.hurt();
* return false; // skip the SAT push-out
* }
* return true;
* }
*/
onCollision(_response: any, _other: any): boolean;
/**
* Destroy function
* @ignore
*/
destroy(...args: any[]): void;
/**
* OnDestroy Notification function
* Called by engine before deleting the object. `Stage.destroy(app)`
* forwards the active Application, so subclasses that wire teardown
* against the app object can override as `onDestroyEvent(app)`.
* @param {...*} _args - forwarded by `destroy(...args)`; Stage passes the Application instance
*/
onDestroyEvent(..._args: any[]): void;
/**
* Lifecycle hook fired by {@link Container} when this renderable is
* added to a container that is part of the active scene graph.
* Override to wire up input handlers, register external listeners,
* or grab adapter references — `this.parentApp` is guaranteed to be
* available here. Pair with {@link Renderable#onDeactivateEvent}.
* @param {...*} _args - forwarded by `Container.addChild`
*/
onActivateEvent(..._args: any[]): void;
/**
* Lifecycle hook fired by {@link Container} when this renderable is
* removed from its container or its container is itself removed.
* Override to release input handlers, unsubscribe from events, or
* drop adapter references. Pair with {@link Renderable#onActivateEvent}.
* @param {...*} _args - forwarded by `Container.removeChildNow`
*/
onDeactivateEvent(..._args: any[]): void;
}
import { Rect } from "./../geometries/rectangle.ts";
import { ObservablePoint } from "../geometries/observablePoint.ts";
import { Matrix3d } from "../math/matrix3d.ts";
import type Container from "./container.js";
import type Entity from "./entity/entity.js";
import type { RoundRect } from "./../geometries/roundrect.ts";
import type { Polygon } from "../geometries/polygon.ts";
import type { Line } from "./../geometries/line.ts";
import type { Ellipse } from "./../geometries/ellipse.ts";
import type Application from "./../application/application.ts";
import type CanvasRenderer from "./../video/canvas/canvas_renderer.js";
import type WebGLRenderer from "./../video/webgl/webgl_renderer.js";
//# sourceMappingURL=renderable.d.ts.map