UNPKG

@polygonjs/polygonjs

Version:

node-based WebGL 3D engine https://polygonjs.com

163 lines (162 loc) 4.63 kB
"use strict"; import { RGBAFormat, FloatType } from "three"; import { DataTexture } from "three"; import { TypedParam } from "./_Base"; import { RampValue, RampPoint, RampInterpolation } from "./ramp/RampValue"; import { ParamType } from "../poly/ParamType"; import { ParamEvent } from "../poly/ParamEvent"; const STRIDE = 4; const TEXTURE_WIDTH = 1024; const TEXTURE_HEIGHT = 1; const TEXTURE_SIZE = TEXTURE_WIDTH * TEXTURE_HEIGHT; const TEXTURE_BYTES_MULT = 1; const _RampParam = class extends TypedParam { constructor() { super(...arguments); this._textureData = new Float32Array(STRIDE * TEXTURE_SIZE); this._rampTexture = new DataTexture(this._textureData, TEXTURE_WIDTH, TEXTURE_HEIGHT, RGBAFormat, FloatType); } static type() { return ParamType.RAMP; } defaultValueSerialized() { if (this._default_value instanceof RampValue) { return this._default_value.toJSON(); } else { return this._default_value; } } _cloneRawInput(raw_input) { if (raw_input instanceof RampValue) { return raw_input.clone(); } else { return RampValue.fromJSON(raw_input).toJSON(); } } rawInputSerialized() { if (this._raw_input instanceof RampValue) { return this._raw_input.toJSON(); } else { return RampValue.fromJSON(this._raw_input).toJSON(); } } valueSerialized() { return this.value.toJSON(); } _copyValue(param) { this.set(param.valueSerialized()); } static areRawInputEqual(raw_input1, raw_input2) { if (raw_input1 instanceof RampValue) { if (raw_input2 instanceof RampValue) { return raw_input1.isEqual(raw_input2); } else { return raw_input1.isEqualJSON(raw_input2); } } else { if (raw_input2 instanceof RampValue) { return raw_input2.isEqualJSON(raw_input1); } else { return RampValue.are_json_equal(raw_input1, raw_input2); } } } static areValuesEqual(val1, val2) { return val1.isEqual(val2); } // initialize_param() { // this.addPostDirtyHook( // '_reset_ramp_interpolant_and_texture', // this.reset_ramp_interpolant.bind(this) // ); // } // accepts_visitor(visitor: RampParamVisitor) { // return visitor.visit_ramp_param(this); // } isDefault() { if (this._default_value instanceof RampValue) { return this.value.isEqual(this._default_value); } else { return this.value.isEqualJSON(this._default_value); } } processRawInput() { if (this._raw_input instanceof RampValue) { if (!this._value) { this._value = this._raw_input; } else { this._value.copy(this._raw_input); } } else { if (!this._value) { this._value = RampValue.fromJSON(this._raw_input); } else { this._value.fromJSON(this._raw_input); } } this._resetRampInterpolant(); this._updateRampTexture(); this.options.executeCallback(); this.emitController.emit(ParamEvent.VALUE_UPDATED); this.setSuccessorsDirty(this); } // convert_value(v) { // let is_json = false // if (isString(v)) { // v = JSON.parse(v) // is_json = true // } // if (!is_json) { // if (v.interpolation && v.points) { // if (isArray(v.points)) { // is_json = true // } // } // } // if (is_json) { // v = RampValue.from_json(v) // } // return v // } // convert_default_value(v) { // return this.convert_value(v) // } hasExpression() { return false; } _resetRampInterpolant() { this._rampInterpolant = void 0; } rampTexture() { return this._rampTexture; } _updateRampTexture() { this._updateRampTextureData(); this.rampTexture().needsUpdate = true; } _updateRampTextureData() { let stride = 0; let position = 0; let value = 0; for (var i = 0; i < TEXTURE_SIZE; i++) { stride = i * STRIDE; position = i / TEXTURE_WIDTH; value = this.valueAtPosition(position); this._textureData[stride + 0] = value * TEXTURE_BYTES_MULT; this._textureData[stride + 1] = 0; this._textureData[stride + 2] = 0; } } interpolant() { return this._rampInterpolant = this._rampInterpolant || this._createInterpolant(); } _createInterpolant() { return this.value.createInterpolant(); } valueAtPosition(position) { return this.interpolant().evaluate(position)[0]; } }; export let RampParam = _RampParam; RampParam.DEFAULT_VALUE = new RampValue(RampInterpolation.CUBIC, [new RampPoint(0, 0), new RampPoint(1, 1)]); RampParam.DEFAULT_VALUE_JSON = _RampParam.DEFAULT_VALUE.toJSON();