@polygonjs/polygonjs
Version:
node-based WebGL 3D engine https://polygonjs.com
84 lines (78 loc) • 2.1 kB
text/typescript
import {Vector2, Vector3} from 'three';
import {NamedFunction3, NamedFunction4} from './_Base';
import {absV3, maxV3Components, maxV3Component} from './_VectorUtils';
const _q = new Vector3();
const _v2 = new Vector2();
const _sHalf = new Vector3();
//
//
// SDF PRIMITIVES
//
//
export function _SDFBox(p: Vector3, center: Vector3, sizes: Vector3, size: number): number {
_sHalf.copy(sizes).multiplyScalar(size * 0.5);
absV3(p.sub(center), _q);
_q.sub(_sHalf);
const max = Math.min(0, maxV3Components(_q));
maxV3Component(_q, _q, 0);
const length = _q.length();
return length + max;
}
export class SDFBox extends NamedFunction4<[Vector3, Vector3, Vector3, number]> {
static override type() {
return 'SDFBox';
}
func = _SDFBox;
}
export function _SDFPlane(p: Vector3, center: Vector3, normal: Vector3, offset: number): number {
// n must be normalized
_q.copy(normal).normalize();
return p.sub(center).dot(_q) + offset;
}
export class SDFPlane extends NamedFunction4<[Vector3, Vector3, Vector3, number]> {
static override type() {
return 'SDFPlane';
}
func = _SDFPlane;
}
export function _SDFSphere(p: Vector3, center: Vector3, s: number): number {
return p.sub(center).length() - s;
}
export class SDFSphere extends NamedFunction3<[Vector3, Vector3, number]> {
static override type() {
return 'SDFSphere';
}
func = _SDFSphere;
}
export function _SDFTorus(p: Vector3, center: Vector3, radius1: number, radius2: number): number {
p.sub(center);
_v2.x = p.x;
_v2.y = p.z;
_q.x = _v2.length() - radius1;
_q.y = p.y;
return _q.length() - radius2;
}
export class SDFTorus extends NamedFunction4<[Vector3, Vector3, number, number]> {
static override type() {
return 'SDFTorus';
}
func = _SDFTorus;
}
/*
float sdTube( vec3 p, float r )
{
return length(p.xz)-r;
}
*/
export function _SDFTube(p: Vector3, center: Vector3, radius: number): number {
p.sub(center);
_q.x = p.x;
_q.y = p.z;
return _q.length() - radius;
}
export class SDFTube extends NamedFunction3<[Vector3, Vector3, number]> {
static override type() {
return 'SDFTube';
}
func = _SDFTube;
}