polygonjs-engine
Version:
node-based webgl 3D engine https://polygonjs.com
181 lines (175 loc) • 5.88 kB
text/typescript
import {Number3, StringOrNumber3} from '../../types/GlobalTypes';
import {TypedMultipleParam} from './_Multiple';
import {Color} from 'three/src/math/Color';
import {ParamType} from '../poly/ParamType';
import {FloatParam} from './Float';
import {ParamValuesTypeMap} from './types/ParamValuesTypeMap';
import {ParamInitValuesTypeMap} from './types/ParamInitValuesTypeMap';
import {ColorConversion} from '../../core/Color';
import {TypeAssert} from '../poly/Assert';
import {CoreType} from '../../core/Type';
const COMPONENT_NAMES_COLOR: Readonly<string[]> = ['r', 'g', 'b'];
export class ColorParam extends TypedMultipleParam<ParamType.COLOR> {
protected _value = new Color();
protected _value_pre_conversion = new Color();
private _value_serialized_dirty: boolean = false;
private _value_serialized: Number3 = [0, 0, 0];
private _value_pre_conversion_serialized: Number3 = [0, 0, 0];
r!: FloatParam;
g!: FloatParam;
b!: FloatParam;
static type() {
return ParamType.COLOR;
}
get component_names(): Readonly<string[]> {
return COMPONENT_NAMES_COLOR;
}
get default_value_serialized() {
if (CoreType.isArray(this.default_value)) {
return this.default_value;
} else {
return this.default_value.toArray() as Number3;
}
}
// get raw_input_serialized() {
// if (this._raw_input instanceof Color) {
// return this._raw_input.toArray() as Number3;
// } else {
// const new_array: StringOrNumber3 = [this._raw_input[0], this._raw_input[1], this._raw_input[2]];
// return new_array;
// }
// }
get value_serialized() {
this._update_value_serialized_if_required();
return this._value_serialized;
}
get value_pre_conversion_serialized() {
this._update_value_serialized_if_required();
return this._value_pre_conversion_serialized;
}
private _copied_value: Number3 = [0, 0, 0];
protected _copy_value(param: ColorParam) {
param.value.toArray(this._copied_value);
this.set(this._copied_value);
}
// protected _prefilter_invalid_raw_input(
// raw_input: ParamInitValuesTypeMap[ParamType.COLOR]
// ): ParamInitValuesTypeMap[ParamType.COLOR] {
// return raw_input;
// }
protected _clone_raw_input(raw_input: ParamInitValuesTypeMap[ParamType.COLOR]) {
if (raw_input instanceof Color) {
return raw_input.clone();
} else {
const new_array: StringOrNumber3 = [raw_input[0], raw_input[1], raw_input[2]];
return new_array;
}
}
static are_raw_input_equal(
raw_input1: ParamInitValuesTypeMap[ParamType.COLOR],
raw_input2: ParamInitValuesTypeMap[ParamType.COLOR]
) {
if (raw_input1 instanceof Color) {
if (raw_input2 instanceof Color) {
return raw_input1.equals(raw_input2);
} else {
return raw_input1.r == raw_input2[0] && raw_input1.g == raw_input2[1] && raw_input1.b == raw_input2[2];
}
} else {
if (raw_input2 instanceof Color) {
return raw_input1[0] == raw_input2.r && raw_input1[1] == raw_input2.g && raw_input1[2] == raw_input2.b;
} else {
return (
raw_input1[0] == raw_input2[0] && raw_input1[1] == raw_input2[1] && raw_input1[2] == raw_input2[2]
);
}
}
}
static are_values_equal(val1: ParamValuesTypeMap[ParamType.COLOR], val2: ParamValuesTypeMap[ParamType.COLOR]) {
return val1.equals(val2);
}
init_components() {
super.init_components();
this.r = this.components[0];
this.g = this.components[1];
this.b = this.components[2];
this._value_serialized_dirty = true;
}
private _update_value_serialized_if_required() {
if (!this._value_serialized_dirty) {
return;
}
this._value_serialized[0] = this._value.r;
this._value_serialized[1] = this._value.g;
this._value_serialized[2] = this._value.b;
this._value_pre_conversion_serialized[0] = this._value_pre_conversion.r;
this._value_pre_conversion_serialized[1] = this._value_pre_conversion.g;
this._value_pre_conversion_serialized[2] = this._value_pre_conversion.b;
}
// set_raw_input_from_components() {
// if (this._raw_input instanceof Color) {
// if (
// CoreType.isNumber(this.r.raw_input) &&
// CoreType.isNumber(this.g.raw_input) &&
// CoreType.isNumber(this.b.raw_input)
// ) {
// this._raw_input.r = this.r.raw_input;
// this._raw_input.g = this.g.raw_input;
// this._raw_input.b = this.b.raw_input;
// } else {
// this._raw_input = [this.r.raw_input, this.g.raw_input, this.b.raw_input];
// }
// } else {
// this._raw_input[0] = this.r.raw_input;
// this._raw_input[1] = this.g.raw_input;
// this._raw_input[2] = this.b.raw_input;
// }
// }
get value_pre_conversion() {
return this._value_pre_conversion;
}
set_value_from_components() {
this._value_pre_conversion.r = this.r.value;
this._value_pre_conversion.g = this.g.value;
this._value_pre_conversion.b = this.b.value;
this._value.copy(this._value_pre_conversion);
const conversion = this.options.color_conversion();
if (conversion != null && conversion != ColorConversion.NONE) {
switch (conversion) {
case ColorConversion.GAMMA_TO_LINEAR: {
this._value.convertGammaToLinear();
return;
}
case ColorConversion.LINEAR_TO_GAMMA: {
this._value.convertLinearToGamma();
return;
}
case ColorConversion.SRGB_TO_LINEAR: {
this._value.convertSRGBToLinear();
return;
}
case ColorConversion.LINEAR_TO_SRGB: {
this._value.convertLinearToSRGB();
return;
}
}
TypeAssert.unreachable(conversion);
}
this._value_serialized_dirty = true;
}
// convert(input: ParamInitValuesTypeMap[ParamType.COLOR]): Color | null {
// if (CoreType.isArray(input)) {
// if(input.length == 3){
// if( input.filter(CoreType.isNumber).length > 0 ){
// return new Color().fromArray(input);
// }
// if(first){
// if(CoreType.isNumber(first)){
// return new Color().fromArray(input);
// }
// }
// }
// }
// return new Color();
// }
}