@polygonjs/polygonjs
Version:
node-based WebGL 3D engine https://polygonjs.com
90 lines (89 loc) • 3.15 kB
JavaScript
;
import { BaseSopOperation } from "./_Base";
import { InputCloneMode } from "../../poly/InputCloneMode";
import { Color } from "three";
import { SORTED_PALETTE_NAMES } from "../../../core/color/chromotomeWrapper";
import { AttribClass, ATTRIBUTE_CLASSES } from "../../../core/geometry/Constant";
import { TypeAssert } from "../../poly/Assert";
import { coreObjectClassFactory, corePointClassFactory } from "../../../core/geometry/CoreObjectFactory";
export class PaletteSopOperation extends BaseSopOperation {
static type() {
return "palette";
}
cook(inputCoreGroups, params) {
const coreGroup = inputCoreGroups[0];
const colors = [params.color1, params.color2, params.color3, params.color4, params.color5];
this._addAttribute(ATTRIBUTE_CLASSES[params.class], coreGroup, params, colors);
return coreGroup;
}
async _addAttribute(attribClass, coreGroup, params, colors) {
var _a, _b;
switch (attribClass) {
case AttribClass.POINT:
return await this._setVertexColor(coreGroup, params, colors);
case AttribClass.VERTEX:
(_a = this.states) == null ? void 0 : _a.error.set("vertex not supported yet");
return;
case AttribClass.PRIMITIVE:
(_b = this.states) == null ? void 0 : _b.error.set("primitive not supported yet");
return;
case AttribClass.OBJECT:
return await this._setObjectColor(coreGroup, params, colors);
case AttribClass.CORE_GROUP:
return;
}
TypeAssert.unreachable(attribClass);
}
_setObjectColor(coreGroup, params, colors) {
const objects = coreGroup.allObjects();
let i = 0;
for (let object of objects) {
const color = colors[i % params.colorsCount];
coreObjectClassFactory(object).addAttribute(object, "color", color.clone());
i++;
}
return coreGroup;
}
_setVertexColor(coreGroup, params, colors) {
const objects = coreGroup.threejsObjectsWithGeo();
for (let object of objects) {
this._setVertexColorToObject(object, params, colors);
}
}
_setVertexColorToObject(object, params, colors) {
if (params.colorsCount <= 0) {
return;
}
const corePointClass = corePointClassFactory(object);
const geometry = object.geometry;
if (!geometry) {
return;
}
let colorAttrib = geometry.getAttribute("color");
if (!colorAttrib) {
corePointClass.addNumericAttribute(object, "color", 3, [0, 0, 0]);
colorAttrib = geometry.getAttribute("color");
}
if (!colorAttrib) {
return;
}
const array = colorAttrib.array;
let ptIndex = 0;
for (let i = 0; i < array.length; i += 3) {
const color = colors[ptIndex % params.colorsCount];
color.toArray(array, i);
ptIndex++;
}
}
}
PaletteSopOperation.DEFAULT_PARAMS = {
class: ATTRIBUTE_CLASSES.indexOf(AttribClass.POINT),
paletteName: SORTED_PALETTE_NAMES[0],
colorsCount: 0,
color1: new Color(1, 1, 1),
color2: new Color(1, 1, 1),
color3: new Color(1, 1, 1),
color4: new Color(1, 1, 1),
color5: new Color(1, 1, 1)
};
PaletteSopOperation.INPUT_CLONED_STATE = InputCloneMode.FROM_NODE;