Files
rubic-cube/node_modules/rubiks-js/src/ui/facelet.js

98 lines
2.6 KiB
JavaScript

import {V3, V4} from '../math/vector'
import {Quaternion} from '../math/quarternion'
import {Program} from './program'
import {Transform} from './transform'
import {Cubie} from './cubie'
/**
* @extends {Transform<any, Cubie>}
*/
export class FaceletTransform extends Transform {
/** @type {V3} */
left
/** @type {V3} */
top
/** @type {V3} */
normal
/** @type {V3} */
topLeft
/** @type {V3} */
bottomRight
/**
* @param {V3} position
* @param {Quaternion} rotation
* @param {Cubie} parent
*/
constructor(position, rotation, parent) {
super(position, rotation, parent)
this.setTransforms()
}
/** @protected */
setTransforms() {
super.setTransforms()
const rotationTransform = this.globalTransform.inverse.transpose
this.left = rotationTransform.mult(new V4(0, 0, -1, 1)).toV3().normalized
this.top = rotationTransform.mult(new V4(0, -1, 0, 1)).toV3().normalized
this.normal = rotationTransform.mult(new V4(-1, 0, 0, 1)).toV3().normalized
this.topLeft = this.globalTransform.mult(new V4(0, .5, .5, 1)).toV3()
this.bottomRight = this.topLeft.add(this.left).add(this.top)
}
}
export class Facelet {
hovering = false
/** @type {V3} */
#hoveringMult
/**
* @param {FaceletTransform} transform
* @param {number} side
* @param {number[]} uvs
* @param {V3} hoveringMult
*/
constructor(transform, side, uvs, hoveringMult) {
this.transform = transform
this.side = side
this.uvs = uvs
this.#hoveringMult = hoveringMult
}
/**
* @param {Program} program
* @param {WebGL2RenderingContext} gl
* @param {WebGLBuffer} uvsVbo
*/
render(program, gl, uvsVbo) {
gl.bindBuffer(gl.ARRAY_BUFFER, uvsVbo)
gl.bufferData(gl.ARRAY_BUFFER, new Float32Array(this.uvs), gl.STATIC_DRAW)
gl.vertexAttribPointer(1, 2, gl.FLOAT, false, 8, 0)
gl.bindBuffer(gl.ARRAY_BUFFER, null)
program.uniform('model', this.transform.globalTransform)
program.uniform('colorMult', this.hovering ? this.#hoveringMult : V3.one)
gl.drawElements(gl.TRIANGLES, 6, gl.UNSIGNED_BYTE, 0)
}
}
export class InsideFacelet {
/** @param {Transform<any, Cubie>} transform */
constructor(transform) {
this.transform = transform
}
/**
* @param {Program} program
* @param {WebGL2RenderingContext} gl
*/
render(program, gl) {
program.uniform('model', this.transform.globalTransform)
program.uniform('colorMult', V3.zero)
gl.drawElements(gl.TRIANGLES, 6, gl.UNSIGNED_BYTE, 0)
}
}