UNPKG

polygonjs-engine

Version:

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

273 lines (272 loc) 8.19 kB
import {TypedCopNode} from "../_Base"; import { UVMapping, CubeReflectionMapping, CubeRefractionMapping, EquirectangularReflectionMapping, EquirectangularRefractionMapping, CubeUVReflectionMapping, CubeUVRefractionMapping, ClampToEdgeWrapping, RepeatWrapping, MirroredRepeatWrapping, LinearEncoding, sRGBEncoding, GammaEncoding, RGBEEncoding, LogLuvEncoding, RGBM7Encoding, RGBM16Encoding, RGBDEncoding, BasicDepthPacking, RGBADepthPacking } from "three/src/constants"; import { MAG_FILTER_DEFAULT_VALUE, MAG_FILTER_MENU_ENTRIES, MIN_FILTER_DEFAULT_VALUE, MIN_FILTER_MENU_ENTRIES } from "../../../../core/cop/ConstantFilter"; const MAPPINGS = [ {UVMapping}, {CubeReflectionMapping}, {CubeRefractionMapping}, {EquirectangularReflectionMapping}, {EquirectangularRefractionMapping}, {CubeUVReflectionMapping}, {CubeUVRefractionMapping} ]; const ENCODINGS = [ {LinearEncoding}, {sRGBEncoding}, {GammaEncoding}, {RGBEEncoding}, {LogLuvEncoding}, {RGBM7Encoding}, {RGBM16Encoding}, {RGBDEncoding}, {BasicDepthPacking}, {RGBADepthPacking} ]; const WRAPPINGS = [{ClampToEdgeWrapping}, {RepeatWrapping}, {MirroredRepeatWrapping}]; import {NodeParamsConfig, ParamConfig} from "../../utils/params/ParamsConfig"; import {CopRendererController} from "./RendererController"; export function TextureParamConfig(Base3) { return class Mixin extends Base3 { constructor() { super(...arguments); this.tencoding = ParamConfig.BOOLEAN(0); this.encoding = ParamConfig.INTEGER(LinearEncoding, { visibleIf: {tencoding: 1}, menu: { entries: ENCODINGS.map((m) => { return { name: Object.keys(m)[0], value: Object.values(m)[0] }; }) } }); this.tmapping = ParamConfig.BOOLEAN(0); this.mapping = ParamConfig.INTEGER(UVMapping, { visibleIf: {tmapping: 1}, menu: { entries: MAPPINGS.map((m) => { return { name: Object.keys(m)[0], value: Object.values(m)[0] }; }) } }); this.twrap = ParamConfig.BOOLEAN(0); this.wrapS = ParamConfig.INTEGER(Object.values(WRAPPINGS[0])[0], { visibleIf: {twrap: 1}, menu: { entries: WRAPPINGS.map((m) => { return { name: Object.keys(m)[0], value: Object.values(m)[0] }; }) } }); this.wrapT = ParamConfig.INTEGER(Object.values(WRAPPINGS[0])[0], { visibleIf: {twrap: 1}, menu: { entries: WRAPPINGS.map((m) => { return { name: Object.keys(m)[0], value: Object.values(m)[0] }; }) } }); this.wrapSep = ParamConfig.SEPARATOR(null, { visibleIf: {twrap: 1} }); this.tminfilter = ParamConfig.BOOLEAN(0); this.minFilter = ParamConfig.INTEGER(MIN_FILTER_DEFAULT_VALUE, { visibleIf: {tminfilter: 1}, menu: { entries: MIN_FILTER_MENU_ENTRIES } }); this.tmagfilter = ParamConfig.BOOLEAN(0); this.magFilter = ParamConfig.INTEGER(MAG_FILTER_DEFAULT_VALUE, { visibleIf: {tmagfilter: 1}, menu: { entries: MAG_FILTER_MENU_ENTRIES } }); this.tanisotropy = ParamConfig.BOOLEAN(0); this.useRendererMaxAnisotropy = ParamConfig.BOOLEAN(1, { visibleIf: {tanisotropy: 1} }); this.anisotropy = ParamConfig.INTEGER(1, { visibleIf: {tanisotropy: 1, useRendererMaxAnisotropy: 0}, range: [0, 32], rangeLocked: [true, false] }); this.useCameraRenderer = ParamConfig.BOOLEAN(0, { visibleIf: {tanisotropy: 1, useRendererMaxAnisotropy: 1} }); this.anisotropySep = ParamConfig.SEPARATOR(null, { visibleIf: {tanisotropy: 1} }); this.tflipY = ParamConfig.BOOLEAN(0); this.flipY = ParamConfig.BOOLEAN(0, {visibleIf: {tflipY: 1}}); this.ttransform = ParamConfig.BOOLEAN(0); this.offset = ParamConfig.VECTOR2([0, 0], { visibleIf: {ttransform: 1}, cook: false, callback: (node) => { TextureParamsController.PARAM_CALLBACK_update_offset(node); } }); this.repeat = ParamConfig.VECTOR2([1, 1], { visibleIf: {ttransform: 1}, cook: false, callback: (node) => { TextureParamsController.PARAM_CALLBACK_update_repeat(node); } }); this.rotation = ParamConfig.FLOAT(0, { range: [-1, 1], visibleIf: {ttransform: 1}, cook: false, callback: (node) => { TextureParamsController.PARAM_CALLBACK_update_rotation(node); } }); this.center = ParamConfig.VECTOR2([0, 0], { visibleIf: {ttransform: 1}, cook: false, callback: (node) => { TextureParamsController.PARAM_CALLBACK_update_center(node); } }); } }; } class TextureParamsConfig extends TextureParamConfig(NodeParamsConfig) { } const ParamsConfig2 = new TextureParamsConfig(); class TextureCopNode extends TypedCopNode { constructor() { super(...arguments); this.params_config = ParamsConfig2; this.texture_params_controller = new TextureParamsController(this); } } export class TextureParamsController { constructor(node) { this.node = node; } update(texture) { const pv = this.node.pv; if (pv.tencoding) { texture.encoding = pv.encoding; } if (pv.tmapping) { texture.mapping = pv.mapping; } if (pv.twrap) { texture.wrapS = pv.wrapS; texture.wrapT = pv.wrapT; } if (pv.tminfilter) { texture.minFilter = pv.minFilter; } if (pv.tminfilter) { texture.magFilter = pv.magFilter; } this._update_anisotropy(texture); texture.flipY = pv.tflipY && pv.flipY; this._update_texture_transform(texture); } async _update_anisotropy(texture) { const pv = this.node.pv; if (!pv.tanisotropy) { return; } this._renderer_controller = this._renderer_controller || new CopRendererController(this.node); const renderer = await this._renderer_controller.renderer(); const max_anisotropy = renderer.capabilities.getMaxAnisotropy(); if (pv.useRendererMaxAnisotropy) { texture.anisotropy = max_anisotropy; } else { texture.anisotropy = Math.min(pv.anisotropy, max_anisotropy); } } _update_texture_transform(texture) { if (!this.node.pv.ttransform) { return; } this._update_offset(texture, false); this._update_repeat(texture, false); this._update_rotation(texture, false); this._update_center(texture, false); texture.updateMatrix(); } _update_offset(texture, update_matrix) { texture.offset.copy(this.node.pv.offset); if (update_matrix) { texture.updateMatrix(); } } _update_repeat(texture, update_matrix) { texture.repeat.copy(this.node.pv.repeat); if (update_matrix) { texture.updateMatrix(); } } _update_rotation(texture, update_matrix) { texture.rotation = this.node.pv.rotation; if (update_matrix) { texture.updateMatrix(); } } _update_center(texture, update_matrix) { texture.center.copy(this.node.pv.center); if (update_matrix) { texture.updateMatrix(); } } static PARAM_CALLBACK_update_offset(node) { const texture = node.container_controller.container.texture(); node.texture_params_controller._update_offset(texture, true); } static PARAM_CALLBACK_update_repeat(node) { const texture = node.container_controller.container.texture(); node.texture_params_controller._update_repeat(texture, true); } static PARAM_CALLBACK_update_rotation(node) { const texture = node.container_controller.container.texture(); node.texture_params_controller._update_rotation(texture, true); } static PARAM_CALLBACK_update_center(node) { const texture = node.container_controller.container.texture(); node.texture_params_controller._update_center(texture, true); } }