react-native-filament
Version:
A real-time physically based 3D rendering engine for React Native
130 lines (114 loc) • 4.98 kB
text/typescript
import { RigidBody } from '../bullet'
import { Entity } from './Entity'
import { PointerHolder } from './PointerHolder'
import { Float3 } from './Math'
import { AABB } from './Boxes'
/**
* A 4x4 column-major matrix.
*/
export interface Mat4 {
readonly data: number[]
readonly scale: Float3
readonly translation: Float3
/**
* Returns a new matrix that is the result of multiplying the provided scale matrix with this matrix.
*/
scaling(scale: Float3): Mat4
/**
* Returns a new matrix that is the result of multiplying the provided translation matrix with this matrix.
*/
translate(translation: Float3): Mat4
/**
* Returns a new matrix that is the result of multiplying the provided rotation matrix with this matrix.
*/
rotate(angleRadians: number, axis: Float3): Mat4
}
/**
* TransformManager is used to add transform components to entities.
*
* A Transform component gives an entity a position and orientation in space in the coordinate
* space of its parent transform. The TransformManager takes care of computing the world-space
* transform of each component (i.e. its transform relative to the root).
*/
export interface TransformManager extends PointerHolder {
/**
* Returns the local transform of a transform component.
* @param ci The instance of the transform component to query the local transform from.
* @return The local transform of the component (i.e. relative to the parent). This always
* returns the value set by setTransform().
* {@linkcode setTransform()}
*/
getTransform(entity: Entity): Mat4
/**
* Return the world transform of a transform component.
* @param ci The instance of the transform component to query the world transform from.
* @return The world transform of the component (i.e. relative to the root). This is the
* composition of this component's local transform with its parent's world transform.
* {@linkcode setTransform()}
*/
getWorldTransform(entity: Entity): Mat4
/**
* Opens a local transform transaction. During a transaction, getWorldTransform() can
* return an invalid transform until commitLocalTransformTransaction() is called. However,
* setTransform() will perform significantly better and in constant time.
*
* This is useful when updating many transforms and the transform hierarchy is deep (say more
* than 4 or 5 levels).
*
* @note If the local transform transaction is already open, this is a no-op.
*
* {@linkcode commitLocalTransformTransaction()}, {@linkcode setTransform()}
*/
openLocalTransformTransaction(): void
/**
* Commits the currently open local transform transaction. When this returns, calls
* to getWorldTransform() will return the proper value.
*
* @attention failing to call this method when done updating the local transform will cause
* a lot of rendering problems. The system never closes the transaction
* automatically.
*
* @note If the local transform transaction is not open, this is a no-op.
*
* {@linkcode openLocalTransformTransaction()}, {@linkcode setTransform()}
*/
commitLocalTransformTransaction(): void
/**
* Sets a local transform of a transform component.
* @param ci The instance of the transform component to set the local transform to.
* @param localTransform The local transform (i.e. relative to the parent).
* {@linkcode getTransform()}
* @attention This operation can be slow if the hierarchy of transform is too deep, and this
* will be particularly bad when updating a lot of transforms. In that case,
* consider using openLocalTransformTransaction() / commitLocalTransformTransaction().
*/
setTransform(entity: Entity, transform: Mat4): void
/**
* Creates a new identity matrix.
*/
createIdentityMatrix(): Mat4
/**
* Transforms the given entity to fit into a unit cube at the origin (0,0,0).
* @param entity The entity to transform
*/
transformToUnitCube(rootEntity: Entity, boundingBox: AABB): void
/**
* Sets the position of an entity.
* @param multiplyCurrent If true, the new position will be multiplied with the current transform.
*/
setEntityPosition(entity: Entity, position: Float3, multiplyCurrent: boolean): void
/**
* Sets the rotation of an entity.
* @param multiplyCurrent If true, the new rotation will be multiplied with the current transform.
*/
setEntityRotation(entity: Entity, angleRadians: number, axis: Float3, multiplyCurrent: boolean): void
/**
* Sets the scale of an entity.
* @param multiplyCurrent If true, the new scale will be multiplied with the current transform.
*/
setEntityScale(entity: Entity, scale: Float3, multiplyCurrent: boolean): void
/**
* Updates the transform of an entity based on the rigid body's transform.
*/
updateTransformByRigidBody(entity: Entity, rigidBody: RigidBody): void
}