From 1acabdb6da2c893e377a4b333c1f2425190ec70b Mon Sep 17 00:00:00 2001 From: schmelczerandras Date: Wed, 12 May 2021 15:31:01 +0200 Subject: [PATCH] Add support for multiple factory instantiations for MetaCircles --- src/drawables/shapes/meta-circle-factory.ts | 30 +++++++++++++-------- 1 file changed, 19 insertions(+), 11 deletions(-) diff --git a/src/drawables/shapes/meta-circle-factory.ts b/src/drawables/shapes/meta-circle-factory.ts index 637fa40..c716fbd 100644 --- a/src/drawables/shapes/meta-circle-factory.ts +++ b/src/drawables/shapes/meta-circle-factory.ts @@ -2,6 +2,7 @@ import { mat2d, vec2, vec3, vec4 } from 'gl-matrix'; import { codeForColorAccess } from '../../helper/code-for-color-access'; import { DrawableDescriptor } from '../drawable-descriptor'; import { EmptyDrawable } from '../empty-drawable'; +import { numberToGlslFloat } from '../../helper/number-to-glsl-float'; /** * @category Drawable @@ -12,36 +13,41 @@ class MetaCircleBase extends EmptyDrawable { } } +let _id = 0; + /** * @category Drawable */ -export const MetaCircleFactory = (color: vec3 | vec4 | number): typeof MetaCircleBase => { +export const MetaCircleFactory = ( + color: vec3 | vec4 | number, + k = 32 +): typeof MetaCircleBase => { class MetaCircle extends MetaCircleBase { public static descriptor: DrawableDescriptor = { sdf: { shader: ` - uniform vec2 metaCircleCenters[META_CIRCLE_COUNT]; - uniform float metaCircleRadii[META_CIRCLE_COUNT]; + uniform vec2 metaCircleCenters${_id}[META_CIRCLE_COUNT${_id}]; + uniform float metaCircleRadii${_id}[META_CIRCLE_COUNT${_id}]; - const float k = 32.0; - float metaCircleMinDistance(vec2 target, out vec4 color) { + float metaCircleMinDistance${_id}(vec2 target, out vec4 color) { + const float k = ${numberToGlslFloat(k)}; color = ${codeForColorAccess(color)}; float res = 0.0; - for (int i = 0; i < META_CIRCLE_COUNT; i++) { - float dist = distance(metaCircleCenters[i], target) - metaCircleRadii[i]; + for (int i = 0; i < META_CIRCLE_COUNT${_id}; i++) { + float dist = distance(metaCircleCenters${_id}[i], target) - metaCircleRadii${_id}[i]; res += exp2(-k * dist); } return -log2(res) / k; } `, - distanceFunctionName: 'metaCircleMinDistance', + distanceFunctionName: `metaCircleMinDistance${_id}`, }, propertyUniformMapping: { - center: 'metaCircleCenters', - radius: 'metaCircleRadii', + center: `metaCircleCenters${_id}`, + radius: `metaCircleRadii${_id}`, }, - uniformCountMacroName: 'META_CIRCLE_COUNT', + uniformCountMacroName: `META_CIRCLE_COUNT${_id}`, shaderCombinationSteps: [0, 1, 2, 3, 8, 16], empty: new MetaCircle(vec2.create(), 0), }; @@ -58,5 +64,7 @@ export const MetaCircleFactory = (color: vec3 | vec4 | number): typeof MetaCircl } } + _id++; + return MetaCircle; };