import {BasicShape} from "../../../../core/shapes/BasicShape.js";
import {Isometry, Point} from "../../geometry/General.js";
import direction from "../../imports/direction.glsl";
import distance from "../../imports/distance.glsl";
import struct from "./shaders/struct.glsl";
import sdf from "../../../../core/shapes/shaders/sdf.glsl.mustache";
import gradient from "../../../../core/shapes/shaders/gradient.glsl.mustache";
export class LocalBallShape extends BasicShape {
/**
* Constructor.
* @param {Isometry|Point|Vector} location - the location of the center of the ball
* @param {number} radius - the radius of the ball
*/
constructor(location, radius) {
const isom = new Isometry();
if (location.isIsometry) {
isom.copy(location);
} else if (location.isPoint) {
isom.makeTranslation(location);
} else if (location.isVector) {
isom.makeTranslationFromDir(location);
} else {
throw new Error("BallShape: this type of location is not implemented");
}
super(isom);
this.radius = radius;
this._center = undefined;
this.addImport(distance, direction);
}
updateData() {
super.updateData();
this._center = new Point().applyIsometry(this.absoluteIsom);
}
get center() {
if (this._center === undefined) {
this.updateData();
}
return this._center;
}
/**
* Says that the object inherits from `LocalBallShape`
* @type {boolean}
*/
get isLocalBallShape() {
return true;
}
/**
* Says whether the shape is global. True if global, false otherwise.
* @type {boolean}
*/
get isGlobal() {
return false;
}
get uniformType() {
return 'LocalBallShape';
}
/**
* The UV coordinates corresponds to the spherical coordinates on the sphere...
* Not sure if that is the smartest choice
* @return {boolean}
*/
get hasUVMap() {
return false;
}
static glslClass() {
return struct;
}
glslSDF() {
return sdf(this);
}
glslGradient() {
return gradient(this);
}
}