104 lines
No EOL
4.3 KiB
JavaScript
104 lines
No EOL
4.3 KiB
JavaScript
return awaitedExpr.then(async _geometry => {
|
|
const _intersectPoint = /*@__PURE__*/new Vector3();
|
|
const _worldScale = /*@__PURE__*/new Vector3();
|
|
const _mvPosition = /*@__PURE__*/new Vector3();
|
|
const _alignedPosition = /*@__PURE__*/new Vector2();
|
|
const _rotatedPosition = /*@__PURE__*/new Vector2();
|
|
const _viewWorldMatrix = /*@__PURE__*/new Matrix4();
|
|
const _vA = /*@__PURE__*/new Vector3();
|
|
const _vB = /*@__PURE__*/new Vector3();
|
|
const _vC = /*@__PURE__*/new Vector3();
|
|
const _uvA = /*@__PURE__*/new Vector2();
|
|
const _uvB = /*@__PURE__*/new Vector2();
|
|
const _uvC = /*@__PURE__*/new Vector2();
|
|
class Sprite extends Object3D {
|
|
constructor(material = new SpriteMaterial()) {
|
|
super();
|
|
this.isSprite = true;
|
|
this.type = "Sprite";
|
|
if (_geometry === undefined) {
|
|
_geometry = new BufferGeometry();
|
|
const float32Array = new Float32Array([-0.5, -0.5, 0, 0, 0, 0.5, -0.5, 0, 1, 0, 0.5, 0.5, 0, 1, 1, -0.5, 0.5, 0, 0, 1]);
|
|
const interleavedBuffer = new InterleavedBuffer(float32Array, 5);
|
|
_geometry.setIndex([0, 1, 2, 0, 2, 3]);
|
|
_geometry.setAttribute("position", new InterleavedBufferAttribute(interleavedBuffer, 3, 0, false));
|
|
_geometry.setAttribute("uv", new InterleavedBufferAttribute(interleavedBuffer, 2, 3, false));
|
|
}
|
|
this.geometry = _geometry;
|
|
this.material = material;
|
|
this.center = new Vector2(0.5, 0.5);
|
|
}
|
|
raycast(raycaster, intersects) {
|
|
if (raycaster.camera === null) {
|
|
console.error('THREE.Sprite: "Raycaster.camera" needs to be set in order to raycast against sprites.');
|
|
}
|
|
_worldScale.setFromMatrixScale(this.matrixWorld);
|
|
_viewWorldMatrix.copy(raycaster.camera.matrixWorld);
|
|
this.modelViewMatrix.multiplyMatrices(raycaster.camera.matrixWorldInverse, this.matrixWorld);
|
|
_mvPosition.setFromMatrixPosition(this.modelViewMatrix);
|
|
if (raycaster.camera.isPerspectiveCamera && this.material.sizeAttenuation === false) {
|
|
_worldScale.multiplyScalar(-_mvPosition.z);
|
|
}
|
|
const rotation = this.material.rotation;
|
|
let sin, cos;
|
|
if (rotation !== 0) {
|
|
cos = Math.cos(rotation);
|
|
sin = Math.sin(rotation);
|
|
}
|
|
const center = this.center;
|
|
transformVertex(_vA.set(-0.5, -0.5, 0), _mvPosition, center, _worldScale, sin, cos);
|
|
transformVertex(_vB.set(0.5, -0.5, 0), _mvPosition, center, _worldScale, sin, cos);
|
|
transformVertex(_vC.set(0.5, 0.5, 0), _mvPosition, center, _worldScale, sin, cos);
|
|
_uvA.set(0, 0);
|
|
_uvB.set(1, 0);
|
|
_uvC.set(1, 1);
|
|
|
|
// check first triangle
|
|
let intersect = raycaster.ray.intersectTriangle(_vA, _vB, _vC, false, _intersectPoint);
|
|
if (intersect === null) {
|
|
// check second triangle
|
|
transformVertex(_vB.set(-0.5, 0.5, 0), _mvPosition, center, _worldScale, sin, cos);
|
|
_uvB.set(0, 1);
|
|
intersect = raycaster.ray.intersectTriangle(_vA, _vC, _vB, false, _intersectPoint);
|
|
if (intersect === null) {
|
|
return;
|
|
}
|
|
}
|
|
const distance = raycaster.ray.origin.distanceTo(_intersectPoint);
|
|
if (distance < raycaster.near || distance > raycaster.far) return;
|
|
intersects.push({
|
|
distance: distance,
|
|
point: _intersectPoint.clone(),
|
|
uv: Triangle.getInterpolation(_intersectPoint, _vA, _vB, _vC, _uvA, _uvB, _uvC, new Vector2()),
|
|
face: null,
|
|
object: this
|
|
});
|
|
}
|
|
copy(source, recursive) {
|
|
super.copy(source, recursive);
|
|
if (source.center !== undefined) this.center.copy(source.center);
|
|
this.material = source.material;
|
|
return this;
|
|
}
|
|
}
|
|
function transformVertex(vertexPosition, mvPosition, center, scale, sin, cos) {
|
|
// compute position in camera space
|
|
_alignedPosition.subVectors(vertexPosition, center).addScalar(0.5).multiply(scale);
|
|
|
|
// to check if rotation is not zero
|
|
if (sin !== undefined) {
|
|
_rotatedPosition.x = cos * _alignedPosition.x - sin * _alignedPosition.y;
|
|
_rotatedPosition.y = sin * _alignedPosition.x + cos * _alignedPosition.y;
|
|
} else {
|
|
_rotatedPosition.copy(_alignedPosition);
|
|
}
|
|
vertexPosition.copy(mvPosition);
|
|
vertexPosition.x += _rotatedPosition.x;
|
|
vertexPosition.y += _rotatedPosition.y;
|
|
|
|
// transform to world space
|
|
vertexPosition.applyMatrix4(_viewWorldMatrix);
|
|
}
|
|
export { Sprite };
|
|
return returnExpr;
|
|
}); |