polygonjs-engine
Version:
node-based webgl 3D engine https://polygonjs.com
117 lines (116 loc) • 3.69 kB
JavaScript
import {TypedSopNode} from "./_Base";
import {JsonDataLoader} from "../../../core/loader/geometry/JsonData";
import {NodeParamsConfig, ParamConfig} from "../utils/params/ParamsConfig";
import {CsvLoader} from "../../../core/loader/geometry/Csv";
import {ObjectType} from "../../../core/geometry/Constant";
import {ASSETS_ROOT} from "../../../../tests/helpers/AssetsUtils";
export var DataType;
(function(DataType2) {
DataType2["JSON"] = "json";
DataType2["CSV"] = "csv";
})(DataType || (DataType = {}));
export const DATA_TYPES = [DataType.JSON, DataType.CSV];
const DEFAULT_URL = `${ASSETS_ROOT}/nodes/sop/DataUrl/basic.json`;
class DataUrlSopParamsConfig extends NodeParamsConfig {
constructor() {
super(...arguments);
this.dataType = ParamConfig.INTEGER(DATA_TYPES.indexOf(DataType.JSON), {
menu: {
entries: DATA_TYPES.map((t, i) => {
return {
name: t,
value: i
};
})
}
});
this.url = ParamConfig.STRING(DEFAULT_URL);
this.jsonDataKeysPrefix = ParamConfig.STRING("", {
visibleIf: {dataType: DATA_TYPES.indexOf(DataType.JSON)}
});
this.skipEntries = ParamConfig.STRING("", {
visibleIf: {dataType: DATA_TYPES.indexOf(DataType.JSON)}
});
this.convert = ParamConfig.BOOLEAN(0, {
visibleIf: {dataType: DATA_TYPES.indexOf(DataType.JSON)}
});
this.convertToNumeric = ParamConfig.STRING("", {
visibleIf: {
dataType: DATA_TYPES.indexOf(DataType.JSON),
convert: 1
}
});
this.readAttribNamesFromFile = ParamConfig.BOOLEAN(1, {
visibleIf: {dataType: DATA_TYPES.indexOf(DataType.CSV)}
});
this.attribNames = ParamConfig.STRING("height scale", {
visibleIf: {
dataType: DATA_TYPES.indexOf(DataType.CSV),
readAttribNamesFromFile: 0
}
});
this.reload = ParamConfig.BUTTON(null, {
callback: (node, param) => {
DataUrlSopNode.PARAM_CALLBACK_reload(node, param);
}
});
}
}
const ParamsConfig2 = new DataUrlSopParamsConfig();
export class DataUrlSopNode extends TypedSopNode {
constructor() {
super(...arguments);
this.params_config = ParamsConfig2;
}
static type() {
return "dataUrl";
}
async cook() {
switch (DATA_TYPES[this.pv.dataType]) {
case DataType.JSON:
return this._load_json();
case DataType.CSV:
return this._load_csv();
}
}
_url() {
const assets_root = this.scene().assets.root();
if (assets_root) {
return `${assets_root}${this.pv.url}`;
} else {
return this.pv.url;
}
}
_load_json() {
const loader = new JsonDataLoader({
dataKeysPrefix: this.pv.jsonDataKeysPrefix,
skipEntries: this.pv.skipEntries,
doConvert: this.pv.convert,
convertToNumeric: this.pv.convertToNumeric
});
loader.load(this._url(), this._on_load.bind(this), void 0, this._on_error.bind(this));
}
_on_load(geometry) {
this.setGeometry(geometry, ObjectType.POINTS);
}
_on_error(error) {
this.states.error.set(`could not load geometry from ${this._url()} (${error})`);
this.cookController.end_cook();
}
async _load_csv() {
const attribNames = this.pv.readAttribNamesFromFile ? void 0 : this.pv.attribNames.split(" ");
const loader = new CsvLoader(attribNames);
const geometry = await loader.load(this._url());
if (geometry) {
this.setGeometry(geometry, ObjectType.POINTS);
} else {
this.states.error.set("could not generate points");
}
}
static PARAM_CALLBACK_reload(node, param) {
node.param_callback_reload();
}
param_callback_reload() {
this.p.url.setDirty();
}
}