@polygonjs/polygonjs
Version:
node-based WebGL 3D engine https://polygonjs.com
163 lines (162 loc) • 4.63 kB
JavaScript
"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();