@tolokoban/tgd 2.0.75 → 2.0.77
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
|
@@ -31,13 +31,43 @@ export interface TgdPainterPointsCloudOptions {
|
|
|
31
31
|
mustDeleteTexture?: boolean;
|
|
32
32
|
texture?: TgdTexture2D;
|
|
33
33
|
/**
|
|
34
|
-
* The content of a fragment shader function
|
|
34
|
+
* The content of a fragment shader function that takes
|
|
35
35
|
* `vec4 color` as argument and must return a `vec4` color.
|
|
36
36
|
*
|
|
37
|
+
* The following uniforms are available:
|
|
38
|
+
*
|
|
39
|
+
* ```glsl
|
|
40
|
+
* uniform float uniSpecularExponent;
|
|
41
|
+
* uniform float uniSpecularIntensity;
|
|
42
|
+
* uniform float uniShadowThickness;
|
|
43
|
+
* uniform float uniShadowIntensity;
|
|
44
|
+
* uniform float uniLight;
|
|
45
|
+
* ```
|
|
46
|
+
*
|
|
37
47
|
* You can also use `TgdPainterPointsCloud.fragCode*()` static functions
|
|
38
48
|
* to provide preset functions.
|
|
39
49
|
*/
|
|
40
50
|
fragCode?: TgdCodeBloc;
|
|
51
|
+
/**
|
|
52
|
+
* Default to 10
|
|
53
|
+
*/
|
|
54
|
+
specularExponent?: number;
|
|
55
|
+
/**
|
|
56
|
+
* Default to 0.33
|
|
57
|
+
*/
|
|
58
|
+
specularIntensity?: number;
|
|
59
|
+
/**
|
|
60
|
+
* Default to 0.5
|
|
61
|
+
*/
|
|
62
|
+
shadowIntensity?: number;
|
|
63
|
+
/**
|
|
64
|
+
* Default to 1
|
|
65
|
+
*/
|
|
66
|
+
shadowThickness?: number;
|
|
67
|
+
/**
|
|
68
|
+
* Default to 1
|
|
69
|
+
*/
|
|
70
|
+
light?: number;
|
|
41
71
|
}
|
|
42
72
|
export declare class TgdPainterPointsCloud extends TgdPainter {
|
|
43
73
|
readonly context: TgdContext;
|
|
@@ -49,6 +79,7 @@ export declare class TgdPainterPointsCloud extends TgdPainter {
|
|
|
49
79
|
specularIntensity: number;
|
|
50
80
|
shadowThickness: number;
|
|
51
81
|
shadowIntensity: number;
|
|
82
|
+
light: number;
|
|
52
83
|
}>): TgdCodeBloc;
|
|
53
84
|
readonly count: number;
|
|
54
85
|
texture: TgdTexture2D;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"points-cloud.d.ts","sourceRoot":"","sources":["../../../src/painter/points-cloud/points-cloud.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAA;AAC3C,OAAO,EAAE,UAAU,EAAE,MAAM,YAAY,CAAA;AAIvC,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAA;AAGzC,OAAO,EAAE,WAAW,EAAsC,MAAM,aAAa,CAAA;AAE7E,MAAM,WAAW,4BAA4B;IACzC,IAAI,CAAC,EAAE,MAAM,CAAA;IACb;;;OAGG;IACH,SAAS,EAAE,YAAY,CAAA;IACvB;;;OAGG;IACH,MAAM,CAAC,EAAE,YAAY,CAAA;IACrB;;;;OAIG;IACH,gBAAgB,CAAC,EAAE,MAAM,CAAA;IACzB;;;;;;OAMG;IACH,eAAe,CAAC,EAAE,MAAM,CAAA;IACxB,iBAAiB,CAAC,EAAE,OAAO,CAAA;IAC3B,OAAO,CAAC,EAAE,YAAY,CAAA;IACtB
|
|
1
|
+
{"version":3,"file":"points-cloud.d.ts","sourceRoot":"","sources":["../../../src/painter/points-cloud/points-cloud.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAA;AAC3C,OAAO,EAAE,UAAU,EAAE,MAAM,YAAY,CAAA;AAIvC,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAA;AAGzC,OAAO,EAAE,WAAW,EAAsC,MAAM,aAAa,CAAA;AAE7E,MAAM,WAAW,4BAA4B;IACzC,IAAI,CAAC,EAAE,MAAM,CAAA;IACb;;;OAGG;IACH,SAAS,EAAE,YAAY,CAAA;IACvB;;;OAGG;IACH,MAAM,CAAC,EAAE,YAAY,CAAA;IACrB;;;;OAIG;IACH,gBAAgB,CAAC,EAAE,MAAM,CAAA;IACzB;;;;;;OAMG;IACH,eAAe,CAAC,EAAE,MAAM,CAAA;IACxB,iBAAiB,CAAC,EAAE,OAAO,CAAA;IAC3B,OAAO,CAAC,EAAE,YAAY,CAAA;IACtB;;;;;;;;;;;;;;;;OAgBG;IACH,QAAQ,CAAC,EAAE,WAAW,CAAA;IACtB;;OAEG;IACH,gBAAgB,CAAC,EAAE,MAAM,CAAA;IACzB;;OAEG;IACH,iBAAiB,CAAC,EAAE,MAAM,CAAA;IAC1B;;OAEG;IACH,eAAe,CAAC,EAAE,MAAM,CAAA;IACxB;;OAEG;IACH,eAAe,CAAC,EAAE,MAAM,CAAA;IACxB;;OAEG;IACH,KAAK,CAAC,EAAE,MAAM,CAAA;CACjB;AAED,qBAAa,qBAAsB,SAAQ,UAAU;aAqE7B,OAAO,EAAE,UAAU;IApEvC;;OAEG;IACH,MAAM,CAAC,cAAc,CACjB,OAAO,GAAE,OAAO,CAAC;QACb,gBAAgB,EAAE,MAAM,CAAA;QACxB,iBAAiB,EAAE,MAAM,CAAA;QACzB,eAAe,EAAE,MAAM,CAAA;QACvB,eAAe,EAAE,MAAM,CAAA;QACvB,KAAK,EAAE,MAAM,CAAA;KAChB,CAAM,GACR,WAAW;IAsCd,SAAgB,KAAK,EAAE,MAAM,CAAA;IACtB,OAAO,EAAE,YAAY,CAAA;IACrB,gBAAgB,SAAI;IACpB,eAAe,SAAI;IAEnB,gBAAgB,SAAK;IACrB,iBAAiB,SAAO;IACxB,eAAe,SAAM;IACrB,eAAe,SAAI;IACnB,KAAK,SAAI;IAEhB,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAc;IACxC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAc;IACrC,OAAO,CAAC,QAAQ,CAAC,oBAAoB,CAAS;IAC9C,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAY;IACpC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAY;IACpC,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAgB;gBAGhB,OAAO,EAAE,UAAU,EACnC,OAAO,EAAE,4BAA4B;IAgDzC,MAAM,IAAI,IAAI;IAMd,KAAK,IAAI,IAAI;IA4Bb,OAAO,CAAC,aAAa;IAUrB,OAAO,CAAC,aAAa;CA+DxB"}
|
|
@@ -11,19 +11,34 @@ export class TgdPainterPointsCloud extends TgdPainter {
|
|
|
11
11
|
* Draw spheres with simple diffuse/specular material.
|
|
12
12
|
*/
|
|
13
13
|
static fragCodeSphere(options = {}) {
|
|
14
|
-
const { specularExponent
|
|
14
|
+
const { specularExponent, specularIntensity, shadowThickness, shadowIntensity, light, } = options;
|
|
15
|
+
const SpE = typeof specularExponent === "number"
|
|
16
|
+
? specularExponent.toFixed(6)
|
|
17
|
+
: "uniSpecularExponent";
|
|
18
|
+
const SpI = typeof specularIntensity === "number"
|
|
19
|
+
? specularIntensity.toFixed(6)
|
|
20
|
+
: "uniSpecularIntensity";
|
|
21
|
+
const ShT = typeof shadowThickness === "number"
|
|
22
|
+
? shadowThickness.toFixed(6)
|
|
23
|
+
: "uniShadowThickness";
|
|
24
|
+
const ShI = typeof shadowIntensity === "number"
|
|
25
|
+
? shadowIntensity.toFixed(6)
|
|
26
|
+
: "uniShadowIntensity";
|
|
27
|
+
const L = typeof light === "number" ? light.toFixed(6) : "uniLight";
|
|
15
28
|
return [
|
|
16
29
|
"vec2 coords = 2.0 * (gl_PointCoord - vec2(.5));",
|
|
17
30
|
"float len = 1.0 - dot(coords, coords);",
|
|
18
31
|
"if (len < 0.0) discard;",
|
|
19
32
|
"gl_FragDepth = gl_FragCoord.z - len * 1e-5;",
|
|
20
|
-
`float light = smoothstep(0.0, ${
|
|
21
|
-
|
|
22
|
-
|
|
33
|
+
`float light = smoothstep(0.0, ${ShT}, len) * ${ShI} + (1.0 - ${ShI});`,
|
|
34
|
+
specularIntensity
|
|
35
|
+
? `float spec = pow(len, ${SpE}) * ${SpI};`
|
|
36
|
+
: "// No specular.",
|
|
37
|
+
`return color * vec4(vec3(light * ${L}), 1.0) + vec4(vec3(spec), 0.0);`,
|
|
23
38
|
];
|
|
24
39
|
}
|
|
25
40
|
constructor(context, options) {
|
|
26
|
-
var _a, _b, _c, _d, _e;
|
|
41
|
+
var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k;
|
|
27
42
|
super();
|
|
28
43
|
this.context = context;
|
|
29
44
|
this.radiusMultiplier = 1;
|
|
@@ -36,12 +51,17 @@ export class TgdPainterPointsCloud extends TgdPainter {
|
|
|
36
51
|
this.name = (_a = options.name) !== null && _a !== void 0 ? _a : this.name;
|
|
37
52
|
this.radiusMultiplier = (_b = options.radiusMultiplier) !== null && _b !== void 0 ? _b : 1;
|
|
38
53
|
this.minSizeInPixels = (_c = options.minSizeInPixels) !== null && _c !== void 0 ? _c : 0;
|
|
54
|
+
this.specularExponent = (_d = options.specularExponent) !== null && _d !== void 0 ? _d : 10;
|
|
55
|
+
this.specularIntensity = (_e = options.specularIntensity) !== null && _e !== void 0 ? _e : 0.33;
|
|
56
|
+
this.shadowIntensity = (_f = options.shadowIntensity) !== null && _f !== void 0 ? _f : 0.5;
|
|
57
|
+
this.shadowThickness = (_g = options.shadowThickness) !== null && _g !== void 0 ? _g : 1;
|
|
58
|
+
this.light = (_h = options.light) !== null && _h !== void 0 ? _h : 1;
|
|
39
59
|
this.dataPoint = options.dataPoint;
|
|
40
60
|
if ((this.dataPoint.length & 3) !== 0) {
|
|
41
61
|
throw new Error(`dataPoint must have a length that is an integral multiple of 4: [x, y, z, radius, ...]!\ndataPoint.length === ${this.dataPoint.length}`);
|
|
42
62
|
}
|
|
43
63
|
this.dataUV =
|
|
44
|
-
(
|
|
64
|
+
(_j = options.dataUV) !== null && _j !== void 0 ? _j : new Float32Array(this.dataPoint.length >> 1);
|
|
45
65
|
if (this.dataPoint.length !== this.dataUV.length * 2) {
|
|
46
66
|
const message = `dataUV must be half of the size of dataPoint: [u, v, ...]!\ndataPoint.length === ${this.dataPoint.length}, \ndataUV.length === ${this.dataUV.length}`;
|
|
47
67
|
console.error("[TgdPainterPointsCloud]", message);
|
|
@@ -52,7 +72,7 @@ export class TgdPainterPointsCloud extends TgdPainter {
|
|
|
52
72
|
}
|
|
53
73
|
if (options.texture) {
|
|
54
74
|
this.texture = options.texture;
|
|
55
|
-
this.textureMustBeDeleted = (
|
|
75
|
+
this.textureMustBeDeleted = (_k = options.mustDeleteTexture) !== null && _k !== void 0 ? _k : false;
|
|
56
76
|
}
|
|
57
77
|
else {
|
|
58
78
|
this.texture = new TgdTexture2D(context).loadBitmap(tgdCanvasCreateGradientHorizontal(128, tgdColorMakeHueWheel({ luminance: 0.2 })));
|
|
@@ -103,11 +123,6 @@ export class TgdPainterPointsCloud extends TgdPainter {
|
|
|
103
123
|
uniMinSizeInPixels: "float",
|
|
104
124
|
uniRadiusMultiplier: "float",
|
|
105
125
|
uniHalfScreenHeightInPixels: "float",
|
|
106
|
-
uniSpecularExponent: "float",
|
|
107
|
-
uniSpecularIntensity: "float",
|
|
108
|
-
uniShadowIntensity: "float",
|
|
109
|
-
uniShadowThickness: "float",
|
|
110
|
-
uniLight: "float",
|
|
111
126
|
uniModelViewMatrix: "mat4",
|
|
112
127
|
uniProjectionMatrix: "mat4",
|
|
113
128
|
},
|
|
@@ -132,6 +147,11 @@ export class TgdPainterPointsCloud extends TgdPainter {
|
|
|
132
147
|
const frag = new TgdShaderFragment({
|
|
133
148
|
uniforms: {
|
|
134
149
|
uniTexture: "sampler2D",
|
|
150
|
+
uniSpecularExponent: "float",
|
|
151
|
+
uniSpecularIntensity: "float",
|
|
152
|
+
uniShadowIntensity: "float",
|
|
153
|
+
uniShadowThickness: "float",
|
|
154
|
+
uniLight: "float",
|
|
135
155
|
},
|
|
136
156
|
varying: {
|
|
137
157
|
varUV: "vec2",
|
|
@@ -145,10 +165,11 @@ export class TgdPainterPointsCloud extends TgdPainter {
|
|
|
145
165
|
"float len = 1.0 - dot(coords, coords);",
|
|
146
166
|
"if (len < 0.0) discard;",
|
|
147
167
|
"gl_FragDepth = gl_FragCoord.z - len * 1e-5;",
|
|
148
|
-
`float light = smoothstep(0.0, uniShadowThickness, len) * uniShadowIntensity + (1 - uniShadowIntensity);`,
|
|
168
|
+
`float light = smoothstep(0.0, uniShadowThickness, len) * uniShadowIntensity + (1.0 - uniShadowIntensity);`,
|
|
149
169
|
`float spec = pow(len, uniSpecularExponent) * uniSpecularIntensity;`,
|
|
150
170
|
"return color * vec4(vec3(light * uniLight), 1.0) + vec4(vec3(spec), 0.0);",
|
|
151
171
|
],
|
|
172
|
+
"}",
|
|
152
173
|
],
|
|
153
174
|
},
|
|
154
175
|
mainCode: [
|
|
@@ -160,4 +181,4 @@ export class TgdPainterPointsCloud extends TgdPainter {
|
|
|
160
181
|
return program;
|
|
161
182
|
}
|
|
162
183
|
}
|
|
163
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
184
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicG9pbnRzLWNsb3VkLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL3BhaW50ZXIvcG9pbnRzLWNsb3VkL3BvaW50cy1jbG91ZC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sY0FBYyxDQUFBO0FBQzNDLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxZQUFZLENBQUE7QUFDdkMsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGNBQWMsQ0FBQTtBQUN6QyxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sY0FBYyxDQUFBO0FBQ3pDLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxVQUFVLENBQUE7QUFFekMsT0FBTyxFQUFFLGlDQUFpQyxFQUFFLE1BQU0sWUFBWSxDQUFBO0FBQzlELE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLFlBQVksQ0FBQTtBQUNqRCxPQUFPLEVBQWUsaUJBQWlCLEVBQUUsZUFBZSxFQUFFLE1BQU0sYUFBYSxDQUFBO0FBc0U3RSxNQUFNLE9BQU8scUJBQXNCLFNBQVEsVUFBVTtJQUNqRDs7T0FFRztJQUNILE1BQU0sQ0FBQyxjQUFjLENBQ2pCLFVBTUssRUFBRTtRQUVQLE1BQU0sRUFDRixnQkFBZ0IsRUFDaEIsaUJBQWlCLEVBQ2pCLGVBQWUsRUFDZixlQUFlLEVBQ2YsS0FBSyxHQUNSLEdBQUcsT0FBTyxDQUFBO1FBQ1gsTUFBTSxHQUFHLEdBQ0wsT0FBTyxnQkFBZ0IsS0FBSyxRQUFRO1lBQ2hDLENBQUMsQ0FBQyxnQkFBZ0IsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDO1lBQzdCLENBQUMsQ0FBQyxxQkFBcUIsQ0FBQTtRQUMvQixNQUFNLEdBQUcsR0FDTCxPQUFPLGlCQUFpQixLQUFLLFFBQVE7WUFDakMsQ0FBQyxDQUFDLGlCQUFpQixDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUM7WUFDOUIsQ0FBQyxDQUFDLHNCQUFzQixDQUFBO1FBQ2hDLE1BQU0s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
|