| /** |
| * @module modules/uniform-generic-sk |
| * @description <h2><code>uniform-generic-sk</code></h2> |
| * |
| * Generic uniform control to use when no other controls fit better. |
| * |
| * Simply displays number input controls in a table. |
| */ |
| import { $$ } from 'common-sk/modules/dom'; |
| import { define } from 'elements-sk/define'; |
| import { html, TemplateResult } from 'lit-html'; |
| import { ElementSk } from '../ElementSk'; |
| import { Uniform, UniformControl } from '../uniform/uniform'; |
| |
| const defaultUniform: Uniform = { |
| name: 'iCoord', |
| rows: 1, |
| columns: 2, |
| slot: 0, |
| }; |
| |
| export class UniformGenericSk extends ElementSk implements UniformControl { |
| private _uniform: Uniform = defaultUniform; |
| |
| constructor() { |
| super(UniformGenericSk.template); |
| } |
| |
| private static defaultValue = (ele: UniformGenericSk, row: number, col: number): string => { |
| // Non-square uniforms (rows != columns) get a default value of 0.5. |
| if (ele._uniform.columns !== ele._uniform.rows) { |
| return '0.5'; |
| } |
| // Square uniforms (rows === columns) default to the identity matrix. |
| if (row === col) { |
| return '1'; |
| } |
| return '0'; |
| } |
| |
| private static row = (ele: UniformGenericSk, row: number): TemplateResult[] => { |
| const ret: TemplateResult[] = []; |
| for (let col = 0; col < ele._uniform.columns; col++) { |
| ret.push(html` |
| <td> |
| <input |
| value="${UniformGenericSk.defaultValue(ele, row, col)}" |
| id="${ele._uniform.name}_${row}_${col}" |
| > |
| </td>`); |
| } |
| return ret; |
| } |
| |
| private static rows = (ele: UniformGenericSk): TemplateResult[] => { |
| const ret: TemplateResult[] = []; |
| for (let row = 0; row < ele._uniform.rows; row++) { |
| ret.push(html`<tr> ${UniformGenericSk.row(ele, row)} </tr>`); |
| } |
| return ret; |
| } |
| |
| private static template = (ele: UniformGenericSk) => html` |
| <div> |
| <table> |
| ${UniformGenericSk.rows(ele)} |
| </table> |
| <span>${ele._uniform.name}</span> |
| </div> |
| `; |
| |
| connectedCallback(): void { |
| super.connectedCallback(); |
| this._render(); |
| } |
| |
| /** The description of the uniform. */ |
| get uniform(): Uniform { |
| return this._uniform!; |
| } |
| |
| set uniform(val: Uniform) { |
| this._uniform = val; |
| this._render(); |
| } |
| |
| /** Copies the values of the control into the uniforms array. */ |
| applyUniformValues(uniforms: number[]): void { |
| for (let col = 0; col < this._uniform.columns; col++) { |
| for (let row = 0; row < this._uniform.rows; row++) { |
| uniforms[this.uniform.slot + col * this._uniform.rows + row] = +$$<HTMLInputElement>(`#${this._uniform.name}_${row}_${col}`, this)!.value; |
| } |
| } |
| } |
| |
| restoreUniformValues(uniforms: number[]): void { |
| for (let col = 0; col < this._uniform.columns; col++) { |
| for (let row = 0; row < this._uniform.rows; row++) { |
| $$<HTMLInputElement>(`#${this._uniform.name}_${row}_${col}`, this)!.value = uniforms[this.uniform.slot + col * this._uniform.rows + row].toString(); |
| } |
| } |
| } |
| |
| onRAF(): void { |
| // noop. |
| } |
| |
| needsRAF(): boolean { |
| return false; |
| } |
| } |
| |
| define('uniform-generic-sk', UniformGenericSk); |