Files
GDevelop/Extensions/3D/Scene3DTools.ts

212 lines
6.1 KiB
TypeScript

namespace gdjs {
/**
* @category Core Engine > Events interfacing
*/
export namespace scene3d {
const assumedFovIn2D = 45;
export namespace camera {
export const getCameraZ = (
runtimeScene: RuntimeScene,
layerName: string,
cameraIndex: integer
): float => {
const layer = runtimeScene.getLayer(layerName);
const layerRenderer = layer.getRenderer();
const threeCamera = layerRenderer.getThreeCamera();
const fov = threeCamera
? threeCamera instanceof THREE.OrthographicCamera
? null
: threeCamera.fov
: assumedFovIn2D;
return layer.getCameraZ(fov, cameraIndex);
};
export const setCameraZ = (
runtimeScene: RuntimeScene,
z: float,
layerName: string,
cameraIndex: integer
) => {
const layer = runtimeScene.getLayer(layerName);
const layerRenderer = layer.getRenderer();
const threeCamera = layerRenderer.getThreeCamera();
const fov = threeCamera
? threeCamera instanceof THREE.OrthographicCamera
? null
: threeCamera.fov
: assumedFovIn2D;
layer.setCameraZ(z, fov, cameraIndex);
};
export const getCameraRotationX = (
runtimeScene: RuntimeScene,
layerName: string,
cameraIndex: integer
): float => {
const layer = runtimeScene.getLayer(layerName);
const layerRenderer = layer.getRenderer();
const threeCamera = layerRenderer.getThreeCamera();
if (!threeCamera) return 0;
return gdjs.toDegrees(threeCamera.rotation.x);
};
export const setCameraRotationX = (
runtimeScene: RuntimeScene,
angle: float,
layerName: string,
cameraIndex: integer
) => {
const layer = runtimeScene.getLayer(layerName);
const layerRenderer = layer.getRenderer();
const threeCamera = layerRenderer.getThreeCamera();
if (!threeCamera) return;
threeCamera.rotation.x = gdjs.toRad(angle);
};
export const getCameraRotationY = (
runtimeScene: RuntimeScene,
layerName: string,
cameraIndex: integer
): float => {
const layer = runtimeScene.getLayer(layerName);
const layerRenderer = layer.getRenderer();
const threeCamera = layerRenderer.getThreeCamera();
if (!threeCamera) return 0;
return gdjs.toDegrees(threeCamera.rotation.y);
};
export const setCameraRotationY = (
runtimeScene: RuntimeScene,
angle: float,
layerName: string,
cameraIndex: integer
) => {
const layer = runtimeScene.getLayer(layerName);
const layerRenderer = layer.getRenderer();
const threeCamera = layerRenderer.getThreeCamera();
if (!threeCamera) return;
threeCamera.rotation.y = gdjs.toRad(angle);
};
export const turnCameraTowardObject = (
runtimeScene: RuntimeScene,
object: gdjs.RuntimeObject | null,
layerName: string,
cameraIndex: integer,
isStandingOnY: boolean
) => {
if (!object) return;
const layer = runtimeScene.getLayer(layerName);
const layerRenderer = layer.getRenderer();
const threeCamera = layerRenderer.getThreeCamera();
if (!threeCamera) return;
if (isStandingOnY) {
threeCamera.up.set(0, 1, 0);
} else {
threeCamera.up.set(0, 0, 1);
}
threeCamera.lookAt(
object.getCenterXInScene(),
-object.getCenterYInScene(),
//@ts-ignore
object.getZ ? object.getZ() : 0
);
// The layer angle takes over the 3D camera Z rotation.
layer.setCameraRotation(gdjs.toDegrees(-threeCamera.rotation.z));
};
export const turnCameraTowardPosition = (
runtimeScene: RuntimeScene,
x: float,
y: float,
z: float,
layerName: string,
cameraIndex: integer,
isStandingOnY: boolean
) => {
const layer = runtimeScene.getLayer(layerName);
const layerRenderer = layer.getRenderer();
const threeCamera = layerRenderer.getThreeCamera();
if (!threeCamera) return;
if (isStandingOnY) {
threeCamera.up.set(0, 1, 0);
} else {
threeCamera.up.set(0, 0, 1);
}
threeCamera.lookAt(x, -y, z);
// The layer angle takes over the 3D camera Z rotation.
layer.setCameraRotation(gdjs.toDegrees(-threeCamera.rotation.z));
};
export const getNearPlane = (
runtimeScene: RuntimeScene,
layerName: string,
cameraIndex: integer
): float => {
const layer = runtimeScene.getLayer(layerName);
return layer.getCamera3DNearPlaneDistance();
};
export const setNearPlane = (
runtimeScene: RuntimeScene,
distance: float,
layerName: string,
cameraIndex: integer
) => {
const layer = runtimeScene.getLayer(layerName);
layer.setCamera3DNearPlaneDistance(distance);
};
export const getFarPlane = (
runtimeScene: RuntimeScene,
layerName: string,
cameraIndex: integer
): float => {
const layer = runtimeScene.getLayer(layerName);
return layer.getCamera3DFarPlaneDistance();
};
export const setFarPlane = (
runtimeScene: RuntimeScene,
distance: float,
layerName: string,
cameraIndex: integer
) => {
const layer = runtimeScene.getLayer(layerName);
layer.setCamera3DFarPlaneDistance(distance);
};
export const getFov = (
runtimeScene: RuntimeScene,
layerName: string,
cameraIndex: integer
): float => {
const layer = runtimeScene.getLayer(layerName);
return layer.getCamera3DFieldOfView();
};
export const setFov = (
runtimeScene: RuntimeScene,
angle: float,
layerName: string,
cameraIndex: integer
) => {
const layer = runtimeScene.getLayer(layerName);
layer.setCamera3DFieldOfView(angle);
};
}
}
}