/** * @import { Entity } from '../../entity.js' */ /** * The RenderComponent enables an {@link Entity} to render 3D meshes. The {@link RenderComponent#type} * property can be set to one of several predefined shape types (such as `box`, `sphere`, `cone` * and so on). Alternatively, the component can be configured to manage an arbitrary array of * {@link MeshInstance} objects. These can either be created programmatically or loaded from an * {@link Asset}. * * You should never need to use the RenderComponent constructor directly. To add a RenderComponent * to an Entity, use {@link Entity#addComponent}: * * ```javascript * // Add a render component to an entity with the default options * const entity = new pc.Entity(); * entity.addComponent("render"); // This defaults to a 1x1x1 box * ``` * * To create an entity with a specific primitive shape: * * ```javascript * entity.addComponent("render", { * type: "cone", * castShadows: false, * receiveShadows: false * }); * ``` * * Once the RenderComponent is added to the entity, you can set and get any of its properties: * * ```javascript * entity.render.type = 'capsule'; // Set the render component's type * * console.log(entity.render.type); // Get the render component's type and print it * ``` * * Relevant examples: * * - [Spinning Cube](https://playcanvas.github.io/#/misc/hello-world) * - [Primitive Shapes](https://playcanvas.github.io/#/graphics/shapes) * - [Loading Render Assets](https://playcanvas.github.io/#/graphics/render-asset) * * @category Graphics */ export class RenderComponent extends Component { /** * Create a new RenderComponent. * * @param {import('./system.js').RenderComponentSystem} system - The ComponentSystem that * created this Component. * @param {Entity} entity - The Entity that this Component is attached to. */ constructor(system: import("./system.js").RenderComponentSystem, entity: Entity); /** @private */ private _type; /** @private */ private _castShadows; /** @private */ private _receiveShadows; /** @private */ private _castShadowsLightmap; /** @private */ private _lightmapped; /** @private */ private _lightmapSizeMultiplier; /** * Mark meshes as non-movable (optimization). * * @type {boolean} */ isStatic: boolean; /** @private */ private _batchGroupId; /** @private */ private _layers; /** @private */ private _renderStyle; /** * @type {MeshInstance[]} * @private */ private _meshInstances; /** * @type {import('../../../core/shape/bounding-box.js').BoundingBox|null} * @private */ private _customAabb; /** * Used by lightmapper. * * @type {{x: number, y: number, z: number, uv: number}|null} * @ignore */ _area: { x: number; y: number; z: number; uv: number; } | null; /** * @type {AssetReference} * @private */ private _assetReference; /** * @type {AssetReference[]} * @private */ private _materialReferences; /** * Material used to render meshes other than asset type. It gets priority when set to * something else than defaultMaterial, otherwise materialASsets[0] is used. * * @type {import('../../../scene/materials/material.js').Material} * @private */ private _material; /** * A reference to the entity to be used as the root bone for any skinned meshes that * are rendered by this component. * * @type {Entity|null} * @private */ private _rootBone; /** * @type {import('../../../core/event-handle.js').EventHandle|null} * @private */ private _evtLayersChanged; /** * @type {import('../../../core/event-handle.js').EventHandle|null} * @private */ private _evtLayerAdded; /** * @type {import('../../../core/event-handle.js').EventHandle|null} * @private */ private _evtLayerRemoved; /** * @type {import('../../../core/event-handle.js').EventHandle|null} * @private */ private _evtSetMeshes; /** * Sets the render style of this component's {@link MeshInstance}s. Can be: * * - {@link RENDERSTYLE_SOLID} * - {@link RENDERSTYLE_WIREFRAME} * - {@link RENDERSTYLE_POINTS} * * Defaults to {@link RENDERSTYLE_SOLID}. * * @type {number} */ set renderStyle(renderStyle: number); /** * Gets the render style of this component's {@link MeshInstance}s. * * @type {number} */ get renderStyle(): number; /** * Sets the custom object space bounding box that is used for visibility culling of attached * mesh instances. This is an optimization, allowing an oversized bounding box to be specified * for skinned characters in order to avoid per frame bounding box computations based on bone * positions. * * @type {import('../../../core/shape/bounding-box.js').BoundingBox|null} */ set customAabb(value: import("../../../core/shape/bounding-box.js").BoundingBox | null); /** * Gets the custom object space bounding box that is used for visibility culling of attached * mesh instances. * * @type {import('../../../core/shape/bounding-box.js').BoundingBox|null} */ get customAabb(): import("../../../core/shape/bounding-box.js").BoundingBox | null; /** * Sets the type of the component. Can be one of the following: * * - "asset": The component will render a render asset * - "box": The component will render a box (1 unit in each dimension) * - "capsule": The component will render a capsule (radius 0.5, height 2) * - "cone": The component will render a cone (radius 0.5, height 1) * - "cylinder": The component will render a cylinder (radius 0.5, height 1) * - "plane": The component will render a plane (1 unit in each dimension) * - "sphere": The component will render a sphere (radius 0.5) * - "torus": The component will render a torus (tubeRadius: 0.2, ringRadius: 0.3) * * @type {string} */ set type(value: string); /** * Gets the type of the component. * * @type {string} */ get type(): string; /** * Sets the array of meshInstances contained in the component. * * @type {MeshInstance[]} */ set meshInstances(value: MeshInstance[]); /** * Gets the array of meshInstances contained in the component. * * @type {MeshInstance[]} */ get meshInstances(): MeshInstance[]; /** * Sets whether the component is affected by the runtime lightmapper. If true, the meshes will * be lightmapped after using lightmapper.bake(). * * @type {boolean} */ set lightmapped(value: boolean); /** * Gets whether the component is affected by the runtime lightmapper. * * @type {boolean} */ get lightmapped(): boolean; /** * Sets whether attached meshes will cast shadows for lights that have shadow casting enabled. * * @type {boolean} */ set castShadows(value: boolean); /** * Gets whether attached meshes will cast shadows for lights that have shadow casting enabled. * * @type {boolean} */ get castShadows(): boolean; /** * Sets whether shadows will be cast on attached meshes. * * @type {boolean} */ set receiveShadows(value: boolean); /** * Gets whether shadows will be cast on attached meshes. * * @type {boolean} */ get receiveShadows(): boolean; /** * Sets whether meshes instances will cast shadows when rendering lightmaps. * * @type {boolean} */ set castShadowsLightmap(value: boolean); /** * Gets whether meshes instances will cast shadows when rendering lightmaps. * * @type {boolean} */ get castShadowsLightmap(): boolean; /** * Sets the lightmap resolution multiplier. * * @type {number} */ set lightmapSizeMultiplier(value: number); /** * Gets the lightmap resolution multiplier. * * @type {number} */ get lightmapSizeMultiplier(): number; /** * Sets the array of layer IDs ({@link Layer#id}) to which the mesh instances belong. Don't * push, pop, splice or modify this array. If you want to change it, set a new one instead. * * @type {number[]} */ set layers(value: number[]); /** * Gets the array of layer IDs ({@link Layer#id}) to which the mesh instances belong. * * @type {number[]} */ get layers(): number[]; /** * Sets the batch group for the mesh instances in this component (see {@link BatchGroup}). * Default is -1 (no group). * * @type {number} */ set batchGroupId(value: number); /** * Gets the batch group for the mesh instances in this component (see {@link BatchGroup}). * * @type {number} */ get batchGroupId(): number; /** * Sets the material {@link Material} that will be used to render the component. The material * is ignored for renders of type 'asset'. * * @type {import('../../../scene/materials/material.js').Material} */ set material(value: import("../../../scene/materials/material.js").Material); /** * Gets the material {@link Material} that will be used to render the component. * * @type {import('../../../scene/materials/material.js').Material} */ get material(): import("../../../scene/materials/material.js").Material; /** * Sets the material assets that will be used to render the component. Each material * corresponds to the respective mesh instance. * * @type {Asset[]|number[]} */ set materialAssets(value: Asset[] | number[]); /** * Gets the material assets that will be used to render the component. * * @type {Asset[]|number[]} */ get materialAssets(): Asset[] | number[]; /** * Sets the render asset (or asset id) for the render component. This only applies to render components with * type 'asset'. * * @type {Asset|number} */ set asset(value: number); /** * Gets the render asset id for the render component. * * @type {number} */ get asset(): number; /** * Assign asset id to the component, without updating the component with the new asset. * This can be used to assign the asset id to already fully created component. * * @param {Asset|number} asset - The render asset or asset id to assign. * @ignore */ assignAsset(asset: Asset | number): void; /** * Sets the root bone entity (or entity guid) for the render component. * * @type {Entity|string|null} */ set rootBone(value: Entity | null); /** * Gets the root bone entity for the render component. * * @type {Entity|null} */ get rootBone(): Entity | null; /** @private */ private destroyMeshInstances; /** @private */ private addToLayers; removeFromLayers(): void; /** @private */ private onRemoveChild; /** @private */ private onInsertChild; onRemove(): void; materialAsset: any; onLayersChanged(oldComp: any, newComp: any): void; onLayerAdded(layer: any): void; onLayerRemoved(layer: any): void; /** * Stop rendering {@link MeshInstance}s without removing them from the scene hierarchy. This * method sets the {@link MeshInstance#visible} property of every MeshInstance to false. Note, * this does not remove the mesh instances from the scene hierarchy or draw call list. So the * render component still incurs some CPU overhead. */ hide(): void; /** * Enable rendering of the component's {@link MeshInstance}s if hidden using * {@link RenderComponent#hide}. This method sets the {@link MeshInstance#visible} property on * all mesh instances to true. */ show(): void; _onRenderAssetAdded(): void; _onRenderAssetLoad(): void; _onSetMeshes(meshes: any): void; _clearSkinInstances(): void; _cloneSkinInstances(): void; _cloneMeshes(meshes: any): void; _onRenderAssetUnload(): void; _onRenderAssetRemove(): void; _onMaterialAdded(index: any, component: any, asset: any): void; _updateMainMaterial(index: any, material: any): void; _onMaterialLoad(index: any, component: any, asset: any): void; _onMaterialRemove(index: any, component: any, asset: any): void; _onMaterialUnload(index: any, component: any, asset: any): void; resolveDuplicatedEntityReferenceProperties(oldRender: any, duplicatedIdsMap: any): void; } import { Component } from '../component.js'; import { MeshInstance } from '../../../scene/mesh-instance.js'; import { Asset } from '../../asset/asset.js'; import type { Entity } from '../../entity.js';