@helix3/helix-cli 0.1.4-helix3.24
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.
- package/LICENSE +21 -0
- package/README.md +64 -0
- package/dist/ability.d.ts +73 -0
- package/dist/ability.js +120 -0
- package/dist/ability.js.map +1 -0
- package/dist/api.d.ts +24 -0
- package/dist/api.js +83 -0
- package/dist/api.js.map +1 -0
- package/dist/browserLogin.d.ts +22 -0
- package/dist/browserLogin.js +148 -0
- package/dist/browserLogin.js.map +1 -0
- package/dist/bundle.d.ts +15 -0
- package/dist/bundle.js +98 -0
- package/dist/bundle.js.map +1 -0
- package/dist/character/canonicalSkeleton.d.ts +3 -0
- package/dist/character/canonicalSkeleton.js +23 -0
- package/dist/character/canonicalSkeleton.js.map +1 -0
- package/dist/character/canonicalSkeletonData.d.ts +6 -0
- package/dist/character/canonicalSkeletonData.js +92 -0
- package/dist/character/canonicalSkeletonData.js.map +1 -0
- package/dist/character/esm.d.ts +1 -0
- package/dist/character/esm.js +6 -0
- package/dist/character/esm.js.map +1 -0
- package/dist/character/importCharacter.d.ts +88 -0
- package/dist/character/importCharacter.js +293 -0
- package/dist/character/importCharacter.js.map +1 -0
- package/dist/character/mat4.d.ts +29 -0
- package/dist/character/mat4.js +103 -0
- package/dist/character/mat4.js.map +1 -0
- package/dist/character/meshyToHelixMap.d.ts +2 -0
- package/dist/character/meshyToHelixMap.js +40 -0
- package/dist/character/meshyToHelixMap.js.map +1 -0
- package/dist/character/quat.d.ts +15 -0
- package/dist/character/quat.js +137 -0
- package/dist/character/quat.js.map +1 -0
- package/dist/character/stages/bakeTexture.d.ts +20 -0
- package/dist/character/stages/bakeTexture.js +396 -0
- package/dist/character/stages/bakeTexture.js.map +1 -0
- package/dist/character/stages/conform.d.ts +56 -0
- package/dist/character/stages/conform.js +292 -0
- package/dist/character/stages/conform.js.map +1 -0
- package/dist/character/stages/ktx2.d.ts +22 -0
- package/dist/character/stages/ktx2.js +97 -0
- package/dist/character/stages/ktx2.js.map +1 -0
- package/dist/character/stages/mergeLods.d.ts +15 -0
- package/dist/character/stages/mergeLods.js +42 -0
- package/dist/character/stages/mergeLods.js.map +1 -0
- package/dist/character/stages/report.d.ts +2 -0
- package/dist/character/stages/report.js +19 -0
- package/dist/character/stages/report.js.map +1 -0
- package/dist/character/stages/resizeTextures.d.ts +11 -0
- package/dist/character/stages/resizeTextures.js +62 -0
- package/dist/character/stages/resizeTextures.js.map +1 -0
- package/dist/character/stages/retarget.d.ts +49 -0
- package/dist/character/stages/retarget.js +105 -0
- package/dist/character/stages/retarget.js.map +1 -0
- package/dist/character/stages/retargetClip.d.ts +27 -0
- package/dist/character/stages/retargetClip.js +237 -0
- package/dist/character/stages/retargetClip.js.map +1 -0
- package/dist/character/stages/simplifyMesh.d.ts +15 -0
- package/dist/character/stages/simplifyMesh.js +37 -0
- package/dist/character/stages/simplifyMesh.js.map +1 -0
- package/dist/character/stages/splitFacePrimitive.d.ts +30 -0
- package/dist/character/stages/splitFacePrimitive.js +115 -0
- package/dist/character/stages/splitFacePrimitive.js.map +1 -0
- package/dist/character/stages/weldedSimplify.d.ts +32 -0
- package/dist/character/stages/weldedSimplify.js +202 -0
- package/dist/character/stages/weldedSimplify.js.map +1 -0
- package/dist/character/testutil/syntheticRig.d.ts +9 -0
- package/dist/character/testutil/syntheticRig.js +84 -0
- package/dist/character/testutil/syntheticRig.js.map +1 -0
- package/dist/config.d.ts +25 -0
- package/dist/config.js +103 -0
- package/dist/config.js.map +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.js +378 -0
- package/dist/index.js.map +1 -0
- package/dist/init.d.ts +1 -0
- package/dist/init.js +87 -0
- package/dist/init.js.map +1 -0
- package/dist/initAbility.d.ts +1 -0
- package/dist/initAbility.js +71 -0
- package/dist/initAbility.js.map +1 -0
- package/dist/install.d.ts +51 -0
- package/dist/install.js +201 -0
- package/dist/install.js.map +1 -0
- package/dist/lib.d.ts +88 -0
- package/dist/lib.js +347 -0
- package/dist/lib.js.map +1 -0
- package/dist/package.d.ts +11 -0
- package/dist/package.js +136 -0
- package/dist/package.js.map +1 -0
- package/dist/prompt.d.ts +2 -0
- package/dist/prompt.js +55 -0
- package/dist/prompt.js.map +1 -0
- package/dist/resolve.d.ts +57 -0
- package/dist/resolve.js +103 -0
- package/dist/resolve.js.map +1 -0
- package/dist/tsconfig.build.tsbuildinfo +1 -0
- package/package.json +58 -0
- package/vendor/ability-manifest.mjs +558 -0
- package/vendor/installed-index.mjs +71 -0
|
@@ -0,0 +1,115 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.splitFacePrimitive = splitFacePrimitive;
|
|
4
|
+
// PORTED from helix-web-engine-new/tools/character-pipeline — the source of truth for the character
|
|
5
|
+
// pipeline. SYNC OBLIGATION: fix bugs there first, then mirror the change here; do not diverge.
|
|
6
|
+
const core_1 = require("@gltf-transform/core");
|
|
7
|
+
/**
|
|
8
|
+
* Slices the head geometry out of a single-mesh character into its own 'FaceMesh' node, so the
|
|
9
|
+
* runtime's first-person mode can hide it (CameraRig `fpHideMeshes` matches mesh names containing
|
|
10
|
+
* 'FaceMesh'; the stock character ships its face as a separate part — imports are one welded mesh).
|
|
11
|
+
*
|
|
12
|
+
* The split is WEIGHT-driven and therefore rig-agnostic: after conform the skeleton is canonical,
|
|
13
|
+
* so a triangle belongs to the face part when its mean skin weight into the NECK-AND-UP subtree
|
|
14
|
+
* (neck_01 -> neck_02 -> head -> facial root; falls back to 'head' when no neck joint exists)
|
|
15
|
+
* exceeds 0.5. Rooting at the neck matters on auto-rigged imports: their face skin blends head WITH
|
|
16
|
+
* neck (head alone rarely crosses 0.5 outside the skull), and the stock face part includes a neck
|
|
17
|
+
* skirt too (see CameraRig's skull-measure). Scalp-anchored hair/hats ride along; LONG draped hair
|
|
18
|
+
* that auto-rigs weight to the clavicles stays on the body — in first person it behaves like
|
|
19
|
+
* shoulder-wear, swaying at the screen edges the way the visible shoulders do. Only the index
|
|
20
|
+
* buffer splits — the face primitive SHARES the body's attribute accessors, so the file grows by
|
|
21
|
+
* one index accessor and one node per scene. The MATERIAL however must be a distinct instance
|
|
22
|
+
* (textures still shared): the runtime hides the face by mutating material.colorWrite, and
|
|
23
|
+
* GLTFLoader gives prims that reference one glTF material the same THREE.Material — a shared
|
|
24
|
+
* material would hide the body. For that same reason this stage MUST run AFTER merge-lods: its
|
|
25
|
+
* dedup compares materials by value (names ignored) and would fold the face clone back into the
|
|
26
|
+
* body material. Every scene of the merged document is split (scene i = LOD level i).
|
|
27
|
+
*/
|
|
28
|
+
function splitFacePrimitive(document) {
|
|
29
|
+
let split = false, faceTris = 0, bodyTris = 0, headJoints = 0;
|
|
30
|
+
for (const scene of document.getRoot().listScenes()) {
|
|
31
|
+
let hostNode = null;
|
|
32
|
+
scene.traverse((node) => { if (hostNode === null && node.getMesh() !== null && node.getSkin() !== null)
|
|
33
|
+
hostNode = node; });
|
|
34
|
+
if (hostNode === null)
|
|
35
|
+
continue;
|
|
36
|
+
const host = hostNode;
|
|
37
|
+
const skin = host.getSkin();
|
|
38
|
+
const joints = skin.listJoints();
|
|
39
|
+
const subtreeRoot = joints.find((j) => j.getName() === 'neck_01') ?? joints.find((j) => j.getName() === 'head');
|
|
40
|
+
if (subtreeRoot === undefined)
|
|
41
|
+
continue;
|
|
42
|
+
const headSet = new Set();
|
|
43
|
+
const mark = (node) => {
|
|
44
|
+
const idx = joints.indexOf(node);
|
|
45
|
+
if (idx >= 0)
|
|
46
|
+
headSet.add(idx);
|
|
47
|
+
for (const child of node.listChildren())
|
|
48
|
+
mark(child);
|
|
49
|
+
};
|
|
50
|
+
mark(subtreeRoot);
|
|
51
|
+
headJoints = headSet.size;
|
|
52
|
+
const facePrims = [];
|
|
53
|
+
const el = [];
|
|
54
|
+
for (const prim of host.getMesh().listPrimitives()) {
|
|
55
|
+
const indices = prim.getIndices();
|
|
56
|
+
const j0 = prim.getAttribute('JOINTS_0');
|
|
57
|
+
const w0 = prim.getAttribute('WEIGHTS_0');
|
|
58
|
+
if (prim.getMode() !== 4 || indices === null || j0 === null || w0 === null)
|
|
59
|
+
continue;
|
|
60
|
+
// per-vertex weight into the head subtree (getElement denormalizes quantized weights)
|
|
61
|
+
const headness = new Float32Array(j0.getCount());
|
|
62
|
+
const jv = [];
|
|
63
|
+
for (let v = 0; v < j0.getCount(); v++) {
|
|
64
|
+
j0.getElement(v, jv);
|
|
65
|
+
w0.getElement(v, el);
|
|
66
|
+
let h = 0;
|
|
67
|
+
for (let c = 0; c < 4; c++)
|
|
68
|
+
if (headSet.has(jv[c]))
|
|
69
|
+
h += el[c];
|
|
70
|
+
headness[v] = h;
|
|
71
|
+
}
|
|
72
|
+
const idx = indices.getArray();
|
|
73
|
+
const face = [], body = [];
|
|
74
|
+
for (let i = 0; i < idx.length; i += 3) {
|
|
75
|
+
const mean = (headness[idx[i]] + headness[idx[i + 1]] + headness[idx[i + 2]]) / 3;
|
|
76
|
+
(mean > 0.5 ? face : body).push(idx[i], idx[i + 1], idx[i + 2]);
|
|
77
|
+
}
|
|
78
|
+
if (face.length === 0) {
|
|
79
|
+
bodyTris += idx.length / 3;
|
|
80
|
+
continue;
|
|
81
|
+
}
|
|
82
|
+
const buffer = document.getRoot().listBuffers()[0];
|
|
83
|
+
prim.setIndices(document.createAccessor().setType('SCALAR').setArray(new Uint32Array(body)).setBuffer(buffer));
|
|
84
|
+
const material = prim.getMaterial();
|
|
85
|
+
const facePrim = document.createPrimitive()
|
|
86
|
+
.setMode(4)
|
|
87
|
+
.setMaterial(material !== null ? material.clone().setName(`${material.getName() || 'material'}_FaceMesh`) : null)
|
|
88
|
+
.setIndices(document.createAccessor().setType('SCALAR').setArray(new Uint32Array(face)).setBuffer(buffer));
|
|
89
|
+
for (const semantic of prim.listSemantics())
|
|
90
|
+
facePrim.setAttribute(semantic, prim.getAttribute(semantic));
|
|
91
|
+
facePrims.push(facePrim);
|
|
92
|
+
faceTris += face.length / 3;
|
|
93
|
+
bodyTris += body.length / 3;
|
|
94
|
+
}
|
|
95
|
+
if (facePrims.length === 0)
|
|
96
|
+
continue;
|
|
97
|
+
const faceMesh = document.createMesh('FaceMesh');
|
|
98
|
+
for (const prim of facePrims)
|
|
99
|
+
faceMesh.addPrimitive(prim);
|
|
100
|
+
const faceNode = document.createNode('FaceMesh').setMesh(faceMesh).setSkin(skin);
|
|
101
|
+
for (const parent of host.listParents()) {
|
|
102
|
+
if (parent.propertyType === core_1.PropertyType.NODE) {
|
|
103
|
+
parent.addChild(faceNode);
|
|
104
|
+
break;
|
|
105
|
+
}
|
|
106
|
+
if (parent.propertyType === core_1.PropertyType.SCENE) {
|
|
107
|
+
parent.addChild(faceNode);
|
|
108
|
+
break;
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
split = true;
|
|
112
|
+
}
|
|
113
|
+
return { split, faceTris, bodyTris, headJoints };
|
|
114
|
+
}
|
|
115
|
+
//# sourceMappingURL=splitFacePrimitive.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"splitFacePrimitive.js","sourceRoot":"","sources":["../../../src/character/stages/splitFacePrimitive.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import { Document } from '@gltf-transform/core';
|
|
2
|
+
export interface WeldedSimplifyResult {
|
|
3
|
+
before: number;
|
|
4
|
+
after: number;
|
|
5
|
+
/** Fraction of output triangles whose three corners agreed on one source UV chart (1 = zero smear). */
|
|
6
|
+
uvCoherence: number;
|
|
7
|
+
}
|
|
8
|
+
export interface SeamAnalysis {
|
|
9
|
+
verts: number;
|
|
10
|
+
positions: number;
|
|
11
|
+
charts: number;
|
|
12
|
+
tris: number;
|
|
13
|
+
/** True when the atlas is shredded into micro-charts (>= 1 chart per 50 tris). Attribute-preserving
|
|
14
|
+
* simplify on such a mesh is both floored AND lumpy (only chart interiors may collapse) — route it
|
|
15
|
+
* through weldedSimplify + unwrap + bake instead. */
|
|
16
|
+
microChartAtlas: boolean;
|
|
17
|
+
}
|
|
18
|
+
/** Measures how seam-shredded a mesh is: index-connectivity islands ARE the atlas charts. */
|
|
19
|
+
export declare function analyzeSeams(document: Document): SeamAnalysis;
|
|
20
|
+
/**
|
|
21
|
+
* Seam-breaking simplification for baked-atlas IMPORTS (Meshy-class meshes). Their auto-unwrap shreds
|
|
22
|
+
* the atlas into micro-charts (~7 tris each on the reference warrior), splitting every border vertex;
|
|
23
|
+
* meshopt preserves attribute seams, so attribute-aware simplify floors at the chart-border ring
|
|
24
|
+
* (~34% of source) regardless of error budget. This stage welds vertices by exact position (the
|
|
25
|
+
* position-level surface is a clean manifold that simplifies to any target), then repairs attributes:
|
|
26
|
+
* each output corner is re-pointed at a REAL original vertex — per triangle, the UV chart shared by
|
|
27
|
+
* the most corners wins, so triangles that survived inside one chart keep pristine UVs and only
|
|
28
|
+
* chart-spanning triangles smear. Normals are recomputed smooth (source normals are per-copy shreds);
|
|
29
|
+
* every other attribute (JOINTS/WEIGHTS/...) rides along with the chosen copy, so skinning survives.
|
|
30
|
+
* NEVER use on first-party identity-texture bodies — this trades UV fidelity for triangle count.
|
|
31
|
+
*/
|
|
32
|
+
export declare function weldedSimplify(document: Document, targetTris: number, errorCap?: number): Promise<WeldedSimplifyResult>;
|
|
@@ -0,0 +1,202 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
// PORTED from helix-web-engine-new/tools/character-pipeline — the source of truth for the character
|
|
3
|
+
// pipeline. SYNC OBLIGATION: fix bugs there first, then mirror the change here; do not diverge.
|
|
4
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
5
|
+
exports.analyzeSeams = analyzeSeams;
|
|
6
|
+
exports.weldedSimplify = weldedSimplify;
|
|
7
|
+
const meshoptimizer_1 = require("meshoptimizer");
|
|
8
|
+
const report_1 = require("./report");
|
|
9
|
+
/** Measures how seam-shredded a mesh is: index-connectivity islands ARE the atlas charts. */
|
|
10
|
+
function analyzeSeams(document) {
|
|
11
|
+
let verts = 0, charts = 0, tris = 0;
|
|
12
|
+
const positions = new Set();
|
|
13
|
+
for (const mesh of document.getRoot().listMeshes()) {
|
|
14
|
+
for (const prim of mesh.listPrimitives()) {
|
|
15
|
+
const pos = prim.getAttribute('POSITION');
|
|
16
|
+
const ix = prim.getIndices();
|
|
17
|
+
if (prim.getMode() !== 4 || pos === null || ix === null)
|
|
18
|
+
continue;
|
|
19
|
+
const p = pos.getArray();
|
|
20
|
+
const n = pos.getCount();
|
|
21
|
+
verts += n;
|
|
22
|
+
tris += ix.getCount() / 3;
|
|
23
|
+
for (let v = 0; v < n; v++)
|
|
24
|
+
positions.add(`${p[v * 3]},${p[v * 3 + 1]},${p[v * 3 + 2]}`);
|
|
25
|
+
const parent = new Int32Array(n);
|
|
26
|
+
for (let i = 0; i < n; i++)
|
|
27
|
+
parent[i] = i;
|
|
28
|
+
const find = (x) => { while (parent[x] !== x) {
|
|
29
|
+
parent[x] = parent[parent[x]];
|
|
30
|
+
x = parent[x];
|
|
31
|
+
} return x; };
|
|
32
|
+
const arr = ix.getArray();
|
|
33
|
+
for (let i = 0; i < arr.length; i += 3) {
|
|
34
|
+
const a = find(arr[i]), b = find(arr[i + 1]), c = find(arr[i + 2]);
|
|
35
|
+
parent[b] = a;
|
|
36
|
+
parent[c] = a;
|
|
37
|
+
}
|
|
38
|
+
const roots = new Set();
|
|
39
|
+
for (let i = 0; i < arr.length; i++)
|
|
40
|
+
roots.add(find(arr[i]));
|
|
41
|
+
charts += roots.size;
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
return { verts, positions: positions.size, charts, tris, microChartAtlas: tris > 0 && charts / tris > 0.02 };
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* Seam-breaking simplification for baked-atlas IMPORTS (Meshy-class meshes). Their auto-unwrap shreds
|
|
48
|
+
* the atlas into micro-charts (~7 tris each on the reference warrior), splitting every border vertex;
|
|
49
|
+
* meshopt preserves attribute seams, so attribute-aware simplify floors at the chart-border ring
|
|
50
|
+
* (~34% of source) regardless of error budget. This stage welds vertices by exact position (the
|
|
51
|
+
* position-level surface is a clean manifold that simplifies to any target), then repairs attributes:
|
|
52
|
+
* each output corner is re-pointed at a REAL original vertex — per triangle, the UV chart shared by
|
|
53
|
+
* the most corners wins, so triangles that survived inside one chart keep pristine UVs and only
|
|
54
|
+
* chart-spanning triangles smear. Normals are recomputed smooth (source normals are per-copy shreds);
|
|
55
|
+
* every other attribute (JOINTS/WEIGHTS/...) rides along with the chosen copy, so skinning survives.
|
|
56
|
+
* NEVER use on first-party identity-texture bodies — this trades UV fidelity for triangle count.
|
|
57
|
+
*/
|
|
58
|
+
async function weldedSimplify(document, targetTris, errorCap = 0.05) {
|
|
59
|
+
const before = (0, report_1.countTriangles)(document);
|
|
60
|
+
if (before <= targetTris)
|
|
61
|
+
return { before, after: before, uvCoherence: 1 };
|
|
62
|
+
await meshoptimizer_1.MeshoptSimplifier.ready;
|
|
63
|
+
let coherentTris = 0;
|
|
64
|
+
let outputTris = 0;
|
|
65
|
+
for (const mesh of document.getRoot().listMeshes()) {
|
|
66
|
+
for (const prim of mesh.listPrimitives()) {
|
|
67
|
+
if (prim.getMode() !== 4 || prim.getIndices() === null || prim.getAttribute('POSITION') === null)
|
|
68
|
+
continue;
|
|
69
|
+
const primTris = prim.getIndices().getCount() / 3;
|
|
70
|
+
// Multi-prim imports: each prim gets a share of the target proportional to its share of the tris.
|
|
71
|
+
const primTarget = Math.max(1, Math.round((primTris / before) * targetTris));
|
|
72
|
+
const stats = simplifyPrimitive(document, prim, primTarget, errorCap);
|
|
73
|
+
coherentTris += stats.coherent;
|
|
74
|
+
outputTris += stats.tris;
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
return { before, after: (0, report_1.countTriangles)(document), uvCoherence: outputTris > 0 ? coherentTris / outputTris : 1 };
|
|
78
|
+
}
|
|
79
|
+
function simplifyPrimitive(document, prim, targetTris, errorCap) {
|
|
80
|
+
const idx = prim.getIndices().getArray();
|
|
81
|
+
const pos = prim.getAttribute('POSITION').getArray();
|
|
82
|
+
const nVerts = pos.length / 3;
|
|
83
|
+
// UV chart per original vertex = connected component of the ORIGINAL index topology (charts are
|
|
84
|
+
// fully split at their borders, so index-connectivity islands ARE the atlas charts).
|
|
85
|
+
const parent = new Int32Array(nVerts);
|
|
86
|
+
for (let i = 0; i < nVerts; i++)
|
|
87
|
+
parent[i] = i;
|
|
88
|
+
const find = (x) => { while (parent[x] !== x) {
|
|
89
|
+
parent[x] = parent[parent[x]];
|
|
90
|
+
x = parent[x];
|
|
91
|
+
} return x; };
|
|
92
|
+
for (let i = 0; i < idx.length; i += 3) {
|
|
93
|
+
const a = find(idx[i]), b = find(idx[i + 1]), c = find(idx[i + 2]);
|
|
94
|
+
parent[b] = a;
|
|
95
|
+
parent[c] = a;
|
|
96
|
+
}
|
|
97
|
+
// Weld by exact position -> compacted slots; slotCopies preserves every original co-located vertex.
|
|
98
|
+
const slotByKey = new Map();
|
|
99
|
+
const slotOf = new Uint32Array(nVerts);
|
|
100
|
+
const slotCopies = [];
|
|
101
|
+
for (let v = 0; v < nVerts; v++) {
|
|
102
|
+
const key = `${pos[v * 3]},${pos[v * 3 + 1]},${pos[v * 3 + 2]}`;
|
|
103
|
+
let slot = slotByKey.get(key);
|
|
104
|
+
if (slot === undefined) {
|
|
105
|
+
slot = slotCopies.length;
|
|
106
|
+
slotByKey.set(key, slot);
|
|
107
|
+
slotCopies.push([]);
|
|
108
|
+
}
|
|
109
|
+
slotOf[v] = slot;
|
|
110
|
+
slotCopies[slot].push(v);
|
|
111
|
+
}
|
|
112
|
+
const weldedPos = new Float32Array(slotCopies.length * 3);
|
|
113
|
+
for (let s = 0; s < slotCopies.length; s++) {
|
|
114
|
+
const o = slotCopies[s][0];
|
|
115
|
+
weldedPos[s * 3] = pos[o * 3];
|
|
116
|
+
weldedPos[s * 3 + 1] = pos[o * 3 + 1];
|
|
117
|
+
weldedPos[s * 3 + 2] = pos[o * 3 + 2];
|
|
118
|
+
}
|
|
119
|
+
const weldedIdx = [];
|
|
120
|
+
for (let i = 0; i < idx.length; i += 3) {
|
|
121
|
+
const a = slotOf[idx[i]], b = slotOf[idx[i + 1]], c = slotOf[idx[i + 2]];
|
|
122
|
+
if (a !== b && b !== c && a !== c)
|
|
123
|
+
weldedIdx.push(a, b, c);
|
|
124
|
+
}
|
|
125
|
+
const [simplified] = meshoptimizer_1.MeshoptSimplifier.simplify(new Uint32Array(weldedIdx), weldedPos, 3, targetTris * 3, errorCap, []);
|
|
126
|
+
// Re-point each output corner at a real original vertex: per triangle, the chart covering the most
|
|
127
|
+
// corners wins; corners without a copy in that chart fall back to their first copy (the smear case).
|
|
128
|
+
let coherent = 0;
|
|
129
|
+
const outIdxByCopy = new Map();
|
|
130
|
+
const outIdx = new Uint32Array(simplified.length);
|
|
131
|
+
const chartsOf = (slot) => {
|
|
132
|
+
const charts = new Map();
|
|
133
|
+
for (const copy of slotCopies[slot])
|
|
134
|
+
charts.set(find(copy), copy);
|
|
135
|
+
return charts;
|
|
136
|
+
};
|
|
137
|
+
for (let i = 0; i < simplified.length; i += 3) {
|
|
138
|
+
const corners = [chartsOf(simplified[i]), chartsOf(simplified[i + 1]), chartsOf(simplified[i + 2])];
|
|
139
|
+
const votes = new Map();
|
|
140
|
+
for (const corner of corners)
|
|
141
|
+
for (const chart of corner.keys())
|
|
142
|
+
votes.set(chart, (votes.get(chart) ?? 0) + 1);
|
|
143
|
+
let best = -1, bestVotes = 0;
|
|
144
|
+
for (const [chart, count] of votes)
|
|
145
|
+
if (count > bestVotes) {
|
|
146
|
+
best = chart;
|
|
147
|
+
bestVotes = count;
|
|
148
|
+
}
|
|
149
|
+
if (bestVotes === 3)
|
|
150
|
+
coherent++;
|
|
151
|
+
for (let k = 0; k < 3; k++) {
|
|
152
|
+
const copy = corners[k].get(best) ?? slotCopies[simplified[i + k]][0];
|
|
153
|
+
let mapped = outIdxByCopy.get(copy);
|
|
154
|
+
if (mapped === undefined) {
|
|
155
|
+
mapped = outIdxByCopy.size;
|
|
156
|
+
outIdxByCopy.set(copy, mapped);
|
|
157
|
+
}
|
|
158
|
+
outIdx[i + k] = mapped;
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
// Rebuild the vertex stream as a subset of the ORIGINAL vertices — every attribute stays consistent.
|
|
162
|
+
const buffer = document.getRoot().listBuffers()[0];
|
|
163
|
+
const copyList = [...outIdxByCopy.keys()];
|
|
164
|
+
for (const semantic of prim.listSemantics()) {
|
|
165
|
+
const src = prim.getAttribute(semantic);
|
|
166
|
+
const srcArray = src.getArray();
|
|
167
|
+
const size = src.getElementSize();
|
|
168
|
+
const subset = new srcArray.constructor(copyList.length * size);
|
|
169
|
+
copyList.forEach((copy, out) => { for (let c = 0; c < size; c++)
|
|
170
|
+
subset[out * size + c] = srcArray[copy * size + c]; });
|
|
171
|
+
prim.setAttribute(semantic, document.createAccessor().setType(src.getType()).setArray(subset).setNormalized(src.getNormalized()).setBuffer(buffer));
|
|
172
|
+
}
|
|
173
|
+
prim.setIndices(document.createAccessor().setType('SCALAR').setArray(outIdx).setBuffer(buffer));
|
|
174
|
+
// Smooth normals from the final geometry, shared per welded slot (area-weighted via raw cross products).
|
|
175
|
+
if (prim.getAttribute('NORMAL') !== null) {
|
|
176
|
+
const outPos = prim.getAttribute('POSITION').getArray();
|
|
177
|
+
const acc = new Float32Array(slotCopies.length * 3);
|
|
178
|
+
for (let i = 0; i < outIdx.length; i += 3) {
|
|
179
|
+
const p = [0, 1, 2].map((k) => outIdx[i + k] * 3);
|
|
180
|
+
const ux = outPos[p[1]] - outPos[p[0]], uy = outPos[p[1] + 1] - outPos[p[0] + 1], uz = outPos[p[1] + 2] - outPos[p[0] + 2];
|
|
181
|
+
const vx = outPos[p[2]] - outPos[p[0]], vy = outPos[p[2] + 1] - outPos[p[0] + 1], vz = outPos[p[2] + 2] - outPos[p[0] + 2];
|
|
182
|
+
const nx = uy * vz - uz * vy, ny = uz * vx - ux * vz, nz = ux * vy - uy * vx;
|
|
183
|
+
for (let k = 0; k < 3; k++) {
|
|
184
|
+
const slot = slotOf[copyList[outIdx[i + k]]] * 3;
|
|
185
|
+
acc[slot] = acc[slot] + nx;
|
|
186
|
+
acc[slot + 1] = acc[slot + 1] + ny;
|
|
187
|
+
acc[slot + 2] = acc[slot + 2] + nz;
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
const normals = new Float32Array(copyList.length * 3);
|
|
191
|
+
copyList.forEach((copy, out) => {
|
|
192
|
+
const slot = slotOf[copy] * 3;
|
|
193
|
+
const len = Math.hypot(acc[slot], acc[slot + 1], acc[slot + 2]) || 1;
|
|
194
|
+
normals[out * 3] = acc[slot] / len;
|
|
195
|
+
normals[out * 3 + 1] = acc[slot + 1] / len;
|
|
196
|
+
normals[out * 3 + 2] = acc[slot + 2] / len;
|
|
197
|
+
});
|
|
198
|
+
prim.setAttribute('NORMAL', document.createAccessor().setType('VEC3').setArray(normals).setBuffer(buffer));
|
|
199
|
+
}
|
|
200
|
+
return { tris: outIdx.length / 3, coherent };
|
|
201
|
+
}
|
|
202
|
+
//# sourceMappingURL=weldedSimplify.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"weldedSimplify.js","sourceRoot":"","sources":["../../../src/character/stages/weldedSimplify.ts"],"names":[],"mappings":";AAAA,oGAAoG;AACpG,gGAAgG;;AAyBhG,oCA2BC;AAcD,wCAmBC;AAlFD,iDAAkD;AAClD,qCAA0C;AAoB1C,6FAA6F;AAC7F,SAAgB,YAAY,CAAC,QAAkB;IAC7C,IAAI,KAAK,GAAG,CAAC,EAAE,MAAM,GAAG,CAAC,EAAE,IAAI,GAAG,CAAC,CAAC;IACpC,MAAM,SAAS,GAAG,IAAI,GAAG,EAAU,CAAC;IACpC,KAAK,MAAM,IAAI,IAAI,QAAQ,CAAC,OAAO,EAAE,CAAC,UAAU,EAAE,EAAE,CAAC;QACnD,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,cAAc,EAAE,EAAE,CAAC;YACzC,MAAM,GAAG,GAAG,IAAI,CAAC,YAAY,CAAC,UAAU,CAAC,CAAC;YAC1C,MAAM,EAAE,GAAG,IAAI,CAAC,UAAU,EAAE,CAAC;YAC7B,IAAI,IAAI,CAAC,OAAO,EAAE,KAAK,CAAC,IAAI,GAAG,KAAK,IAAI,IAAI,EAAE,KAAK,IAAI;gBAAE,SAAS;YAClE,MAAM,CAAC,GAAG,GAAG,CAAC,QAAQ,EAAG,CAAC;YAC1B,MAAM,CAAC,GAAG,GAAG,CAAC,QAAQ,EAAE,CAAC;YACzB,KAAK,IAAI,CAAC,CAAC;YACX,IAAI,IAAI,EAAE,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC;YAC1B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE;gBAAE,SAAS,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC;YACzF,MAAM,MAAM,GAAG,IAAI,UAAU,CAAC,CAAC,CAAC,CAAC;YACjC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE;gBAAE,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;YAC1C,MAAM,IAAI,GAAG,CAAC,CAAS,EAAU,EAAE,GAAG,OAAO,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC;gBAAC,MAAM,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,CAAE,CAAE,CAAC;gBAAC,CAAC,GAAG,MAAM,CAAC,CAAC,CAAE,CAAC;YAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC;YAC/H,MAAM,GAAG,GAAG,EAAE,CAAC,QAAQ,EAAG,CAAC;YAC3B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC;gBACvC,MAAM,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAE,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAE,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAE,CAAC,CAAC;gBACtE,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;gBAAC,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;YAC/B,CAAC;YACD,MAAM,KAAK,GAAG,IAAI,GAAG,EAAU,CAAC;YAChC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG,CAAC,MAAM,EAAE,CAAC,EAAE;gBAAE,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAE,CAAC,CAAC,CAAC;YAC9D,MAAM,IAAI,KAAK,CAAC,IAAI,CAAC;QACvB,CAAC;IACH,CAAC;IACD,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,eAAe,EAAE,IAAI,GAAG,CAAC,IAAI,MAAM,GAAG,IAAI,GAAG,IAAI,EAAE,CAAC;AAC/G,CAAC;AAED;;;;;;;;;;;GAWG;AACI,KAAK,UAAU,cAAc,CAAC,QAAkB,EAAE,UAAkB,EAAE,QAAQ,GAAG,IAAI;IAC1F,MAAM,MAAM,GAAG,IAAA,uBAAc,EAAC,QAAQ,CAAC,CAAC;IACxC,IAAI,MAAM,IAAI,UAAU;QAAE,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,WAAW,EAAE,CAAC,EAAE,CAAC;IAE3E,MAAM,iCAAiB,CAAC,KAAK,CAAC;IAC9B,IAAI,YAAY,GAAG,CAAC,CAAC;IACrB,IAAI,UAAU,GAAG,CAAC,CAAC;IACnB,KAAK,MAAM,IAAI,IAAI,QAAQ,CAAC,OAAO,EAAE,CAAC,UAAU,EAAE,EAAE,CAAC;QACnD,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,cAAc,EAAE,EAAE,CAAC;YACzC,IAAI,IAAI,CAAC,OAAO,EAAE,KAAK,CAAC,IAAI,IAAI,CAAC,UAAU,EAAE,KAAK,IAAI,IAAI,IAAI,CAAC,YAAY,CAAC,UAAU,CAAC,KAAK,IAAI;gBAAE,SAAS;YAC3G,MAAM,QAAQ,GAAG,IAAI,CAAC,UAAU,EAAG,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC;YACnD,kGAAkG;YAClG,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,QAAQ,GAAG,MAAM,CAAC,GAAG,UAAU,CAAC,CAAC,CAAC;YAC7E,MAAM,KAAK,GAAG,iBAAiB,CAAC,QAAQ,EAAE,IAAI,EAAE,UAAU,EAAE,QAAQ,CAAC,CAAC;YACtE,YAAY,IAAI,KAAK,CAAC,QAAQ,CAAC;YAC/B,UAAU,IAAI,KAAK,CAAC,IAAI,CAAC;QAC3B,CAAC;IACH,CAAC;IACD,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,IAAA,uBAAc,EAAC,QAAQ,CAAC,EAAE,WAAW,EAAE,UAAU,GAAG,CAAC,CAAC,CAAC,CAAC,YAAY,GAAG,UAAU,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;AAClH,CAAC;AAED,SAAS,iBAAiB,CAAC,QAAkB,EAAE,IAAe,EAAE,UAAkB,EAAE,QAAgB;IAClG,MAAM,GAAG,GAAG,IAAI,CAAC,UAAU,EAAG,CAAC,QAAQ,EAAG,CAAC;IAC3C,MAAM,GAAG,GAAG,IAAI,CAAC,YAAY,CAAC,UAAU,CAAE,CAAC,QAAQ,EAAmB,CAAC;IACvE,MAAM,MAAM,GAAG,GAAG,CAAC,MAAM,GAAG,CAAC,CAAC;IAE9B,gGAAgG;IAChG,qFAAqF;IACrF,MAAM,MAAM,GAAG,IAAI,UAAU,CAAC,MAAM,CAAC,CAAC;IACtC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,EAAE,CAAC,EAAE;QAAE,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;IAC/C,MAAM,IAAI,GAAG,CAAC,CAAS,EAAU,EAAE,GAAG,OAAO,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC;QAAC,MAAM,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,CAAE,CAAE,CAAC;QAAC,CAAC,GAAG,MAAM,CAAC,CAAC,CAAE,CAAC;IAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC;IAC/H,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC;QACvC,MAAM,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAE,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAE,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAE,CAAC,CAAC;QACtE,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;QAAC,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;IAC/B,CAAC;IAED,oGAAoG;IACpG,MAAM,SAAS,GAAG,IAAI,GAAG,EAAkB,CAAC;IAC5C,MAAM,MAAM,GAAG,IAAI,WAAW,CAAC,MAAM,CAAC,CAAC;IACvC,MAAM,UAAU,GAAe,EAAE,CAAC;IAClC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QAChC,MAAM,GAAG,GAAG,GAAG,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC;QAChE,IAAI,IAAI,GAAG,SAAS,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QAC9B,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;YAAC,IAAI,GAAG,UAAU,CAAC,MAAM,CAAC;YAAC,SAAS,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;YAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAAC,CAAC;QACpG,MAAM,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC;QACjB,UAAU,CAAC,IAAI,CAAE,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAC5B,CAAC;IACD,MAAM,SAAS,GAAG,IAAI,YAAY,CAAC,UAAU,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;IAC1D,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,UAAU,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QAC3C,MAAM,CAAC,GAAG,UAAU,CAAC,CAAC,CAAE,CAAC,CAAC,CAAE,CAAC;QAC7B,SAAS,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,GAAG,CAAC,CAAE,CAAC;QAAC,SAAS,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAE,CAAC;QAAC,SAAS,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAE,CAAC;IACjH,CAAC;IACD,MAAM,SAAS,GAAa,EAAE,CAAC;IAC/B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC;QACvC,MAAM,CAAC,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,CAAE,CAAE,EAAE,CAAC,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAE,CAAE,EAAE,CAAC,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAE,CAAE,CAAC;QAC/E,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC;YAAE,SAAS,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;IAC7D,CAAC;IAED,MAAM,CAAC,UAAU,CAAC,GAAG,iCAAiB,CAAC,QAAQ,CAAC,IAAI,WAAW,CAAC,SAAS,CAAC,EAAE,SAAS,EAAE,CAAC,EAAE,UAAU,GAAG,CAAC,EAAE,QAAQ,EAAE,EAAE,CAAC,CAAC;IAExH,mGAAmG;IACnG,qGAAqG;IACrG,IAAI,QAAQ,GAAG,CAAC,CAAC;IACjB,MAAM,YAAY,GAAG,IAAI,GAAG,EAAkB,CAAC;IAC/C,MAAM,MAAM,GAAG,IAAI,WAAW,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC;IAClD,MAAM,QAAQ,GAAG,CAAC,IAAY,EAAuB,EAAE;QACrD,MAAM,MAAM,GAAG,IAAI,GAAG,EAAkB,CAAC;QACzC,KAAK,MAAM,IAAI,IAAI,UAAU,CAAC,IAAI,CAAE;YAAE,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,IAAI,CAAC,CAAC;QACnE,OAAO,MAAM,CAAC;IAChB,CAAC,CAAC;IACF,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,UAAU,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC;QAC9C,MAAM,OAAO,GAAG,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC,CAAE,CAAC,EAAE,QAAQ,CAAC,UAAU,CAAC,CAAC,GAAG,CAAC,CAAE,CAAC,EAAE,QAAQ,CAAC,UAAU,CAAC,CAAC,GAAG,CAAC,CAAE,CAAC,CAAC,CAAC;QACvG,MAAM,KAAK,GAAG,IAAI,GAAG,EAAkB,CAAC;QACxC,KAAK,MAAM,MAAM,IAAI,OAAO;YAAE,KAAK,MAAM,KAAK,IAAI,MAAM,CAAC,IAAI,EAAE;gBAAE,KAAK,CAAC,GAAG,CAAC,KAAK,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;QAC/G,IAAI,IAAI,GAAG,CAAC,CAAC,EAAE,SAAS,GAAG,CAAC,CAAC;QAC7B,KAAK,MAAM,CAAC,KAAK,EAAE,KAAK,CAAC,IAAI,KAAK;YAAE,IAAI,KAAK,GAAG,SAAS,EAAE,CAAC;gBAAC,IAAI,GAAG,KAAK,CAAC;gBAAC,SAAS,GAAG,KAAK,CAAC;YAAC,CAAC;QAC/F,IAAI,SAAS,KAAK,CAAC;YAAE,QAAQ,EAAE,CAAC;QAChC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;YAC3B,MAAM,IAAI,GAAG,OAAO,CAAC,CAAC,CAAE,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,UAAU,CAAC,UAAU,CAAC,CAAC,GAAG,CAAC,CAAE,CAAE,CAAC,CAAC,CAAE,CAAC;YAC1E,IAAI,MAAM,GAAG,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;YACpC,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;gBAAC,MAAM,GAAG,YAAY,CAAC,IAAI,CAAC;gBAAC,YAAY,CAAC,GAAG,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;YAAC,CAAC;YACzF,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,MAAM,CAAC;QACzB,CAAC;IACH,CAAC;IAED,qGAAqG;IACrG,MAAM,MAAM,GAAG,QAAQ,CAAC,OAAO,EAAE,CAAC,WAAW,EAAE,CAAC,CAAC,CAAE,CAAC;IACpD,MAAM,QAAQ,GAAG,CAAC,GAAG,YAAY,CAAC,IAAI,EAAE,CAAC,CAAC;IAC1C,KAAK,MAAM,QAAQ,IAAI,IAAI,CAAC,aAAa,EAAE,EAAE,CAAC;QAC5C,MAAM,GAAG,GAAG,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAE,CAAC;QACzC,MAAM,QAAQ,GAAG,GAAG,CAAC,QAAQ,EAAG,CAAC;QACjC,MAAM,IAAI,GAAG,GAAG,CAAC,cAAc,EAAE,CAAC;QAClC,MAAM,MAAM,GAAG,IAAK,QAAQ,CAAC,WAAkD,CAAC,QAAQ,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;QACxG,QAAQ,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,GAAG,EAAE,EAAE,GAAG,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,EAAE,CAAC,EAAE;YAAE,MAAM,CAAC,GAAG,GAAG,IAAI,GAAG,CAAC,CAAC,GAAG,QAAQ,CAAC,IAAI,GAAG,IAAI,GAAG,CAAC,CAAE,CAAC,CAAC,CAAC,CAAC,CAAC;QACzH,IAAI,CAAC,YAAY,CAAC,QAAQ,EAAE,QAAQ,CAAC,cAAc,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,aAAa,CAAC,GAAG,CAAC,aAAa,EAAE,CAAC,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC;IACtJ,CAAC;IACD,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,cAAc,EAAE,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC;IAEhG,yGAAyG;IACzG,IAAI,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC,KAAK,IAAI,EAAE,CAAC;QACzC,MAAM,MAAM,GAAG,IAAI,CAAC,YAAY,CAAC,UAAU,CAAE,CAAC,QAAQ,EAAmB,CAAC;QAC1E,MAAM,GAAG,GAAG,IAAI,YAAY,CAAC,UAAU,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;QACpD,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC;YAC1C,MAAM,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,CAAE,GAAG,CAAC,CAAC,CAAC;YACnD,MAAM,EAAE,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC,CAAE,CAAE,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC,CAAE,CAAE,EAAE,EAAE,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC,CAAE,GAAG,CAAC,CAAE,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC,CAAE,GAAG,CAAC,CAAE,EAAE,EAAE,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC,CAAE,GAAG,CAAC,CAAE,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC,CAAE,GAAG,CAAC,CAAE,CAAC;YACvI,MAAM,EAAE,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC,CAAE,CAAE,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC,CAAE,CAAE,EAAE,EAAE,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC,CAAE,GAAG,CAAC,CAAE,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC,CAAE,GAAG,CAAC,CAAE,EAAE,EAAE,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC,CAAE,GAAG,CAAC,CAAE,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC,CAAE,GAAG,CAAC,CAAE,CAAC;YACvI,MAAM,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC;YAC7E,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;gBAC3B,MAAM,IAAI,GAAG,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,CAAE,CAAE,CAAE,GAAG,CAAC,CAAC;gBACpD,GAAG,CAAC,IAAI,CAAC,GAAG,GAAG,CAAC,IAAI,CAAE,GAAG,EAAE,CAAC;gBAAC,GAAG,CAAC,IAAI,GAAG,CAAC,CAAC,GAAG,GAAG,CAAC,IAAI,GAAG,CAAC,CAAE,GAAG,EAAE,CAAC;gBAAC,GAAG,CAAC,IAAI,GAAG,CAAC,CAAC,GAAG,GAAG,CAAC,IAAI,GAAG,CAAC,CAAE,GAAG,EAAE,CAAC;YACxG,CAAC;QACH,CAAC;QACD,MAAM,OAAO,GAAG,IAAI,YAAY,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;QACtD,QAAQ,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,GAAG,EAAE,EAAE;YAC7B,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAE,GAAG,CAAC,CAAC;YAC/B,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAE,EAAE,GAAG,CAAC,IAAI,GAAG,CAAC,CAAE,EAAE,GAAG,CAAC,IAAI,GAAG,CAAC,CAAE,CAAC,IAAI,CAAC,CAAC;YACxE,OAAO,CAAC,GAAG,GAAG,CAAC,CAAC,GAAG,GAAG,CAAC,IAAI,CAAE,GAAG,GAAG,CAAC;YAAC,OAAO,CAAC,GAAG,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,GAAG,CAAC,IAAI,GAAG,CAAC,CAAE,GAAG,GAAG,CAAC;YAAC,OAAO,CAAC,GAAG,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,GAAG,CAAC,IAAI,GAAG,CAAC,CAAE,GAAG,GAAG,CAAC;QAChI,CAAC,CAAC,CAAC;QACH,IAAI,CAAC,YAAY,CAAC,QAAQ,EAAE,QAAQ,CAAC,cAAc,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC;IAC7G,CAAC;IAED,OAAO,EAAE,IAAI,EAAE,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,QAAQ,EAAE,CAAC;AAC/C,CAAC"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { Document } from '@gltf-transform/core';
|
|
2
|
+
/**
|
|
3
|
+
* Meshy-pathology plane (2*n*n tris): every triangle carries its own 3 vertices (positions duplicated
|
|
4
|
+
* across faces, up to 6 copies each) and its own UV micro-chart — meshopt seam-locks every vertex, so
|
|
5
|
+
* attribute-preserving simplify barely moves. weldedSimplify must see through it.
|
|
6
|
+
*/
|
|
7
|
+
export declare function buildShreddedPlane(n?: number): Document;
|
|
8
|
+
/** Dense grid plane (2*n*n tris) for simplify tests. */
|
|
9
|
+
export declare function buildDensePlane(n?: number): Document;
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
// PORTED from helix-web-engine-new/tools/character-pipeline — the source of truth for the character
|
|
3
|
+
// pipeline. SYNC OBLIGATION: fix bugs there first, then mirror the change here; do not diverge.
|
|
4
|
+
// Partial port: only the plane builders the ported tests use (the rig/animation helpers stay in the engine tool).
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.buildShreddedPlane = buildShreddedPlane;
|
|
7
|
+
exports.buildDensePlane = buildDensePlane;
|
|
8
|
+
const core_1 = require("@gltf-transform/core");
|
|
9
|
+
/**
|
|
10
|
+
* Meshy-pathology plane (2*n*n tris): every triangle carries its own 3 vertices (positions duplicated
|
|
11
|
+
* across faces, up to 6 copies each) and its own UV micro-chart — meshopt seam-locks every vertex, so
|
|
12
|
+
* attribute-preserving simplify barely moves. weldedSimplify must see through it.
|
|
13
|
+
*/
|
|
14
|
+
function buildShreddedPlane(n = 30) {
|
|
15
|
+
const document = new core_1.Document();
|
|
16
|
+
const buffer = document.createBuffer();
|
|
17
|
+
const scene = document.createScene('scene');
|
|
18
|
+
const verts = [];
|
|
19
|
+
const uvs = [];
|
|
20
|
+
const normals = [];
|
|
21
|
+
const indices = [];
|
|
22
|
+
const charts = 2 * n * n;
|
|
23
|
+
const chartCols = Math.ceil(Math.sqrt(charts));
|
|
24
|
+
let face = 0;
|
|
25
|
+
const emit = (corners) => {
|
|
26
|
+
const cu = (face % chartCols) / chartCols;
|
|
27
|
+
const cv = Math.floor(face / chartCols) / chartCols;
|
|
28
|
+
for (const [x, y] of corners) {
|
|
29
|
+
indices.push(verts.length / 3);
|
|
30
|
+
verts.push(x / n, y / n, 0);
|
|
31
|
+
uvs.push(cu + (x % 2) / (2 * chartCols), cv + (y % 2) / (2 * chartCols));
|
|
32
|
+
normals.push(0, 0, 1);
|
|
33
|
+
}
|
|
34
|
+
face++;
|
|
35
|
+
};
|
|
36
|
+
for (let y = 0; y < n; y++) {
|
|
37
|
+
for (let x = 0; x < n; x++) {
|
|
38
|
+
emit([[x, y], [x + 1, y], [x, y + 1]]);
|
|
39
|
+
emit([[x + 1, y], [x + 1, y + 1], [x, y + 1]]);
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
const prim = document
|
|
43
|
+
.createPrimitive()
|
|
44
|
+
.setMode(4)
|
|
45
|
+
.setIndices(document.createAccessor().setType('SCALAR').setArray(new Uint32Array(indices)).setBuffer(buffer))
|
|
46
|
+
.setAttribute('POSITION', document.createAccessor().setType('VEC3').setArray(new Float32Array(verts)).setBuffer(buffer))
|
|
47
|
+
.setAttribute('NORMAL', document.createAccessor().setType('VEC3').setArray(new Float32Array(normals)).setBuffer(buffer))
|
|
48
|
+
.setAttribute('TEXCOORD_0', document.createAccessor().setType('VEC2').setArray(new Float32Array(uvs)).setBuffer(buffer));
|
|
49
|
+
scene.addChild(document.createNode('plane').setMesh(document.createMesh('plane').addPrimitive(prim)));
|
|
50
|
+
return document;
|
|
51
|
+
}
|
|
52
|
+
/** Dense grid plane (2*n*n tris) for simplify tests. */
|
|
53
|
+
function buildDensePlane(n = 30) {
|
|
54
|
+
const document = new core_1.Document();
|
|
55
|
+
const buffer = document.createBuffer();
|
|
56
|
+
const scene = document.createScene('scene');
|
|
57
|
+
const verts = [];
|
|
58
|
+
const uvs = [];
|
|
59
|
+
for (let y = 0; y <= n; y++) {
|
|
60
|
+
for (let x = 0; x <= n; x++) {
|
|
61
|
+
verts.push(x / n, y / n, 0);
|
|
62
|
+
uvs.push(x / n, y / n);
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
const indices = [];
|
|
66
|
+
for (let y = 0; y < n; y++) {
|
|
67
|
+
for (let x = 0; x < n; x++) {
|
|
68
|
+
const a = y * (n + 1) + x;
|
|
69
|
+
const b = a + 1;
|
|
70
|
+
const c = a + n + 1;
|
|
71
|
+
const d = c + 1;
|
|
72
|
+
indices.push(a, b, c, b, d, c);
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
const prim = document
|
|
76
|
+
.createPrimitive()
|
|
77
|
+
.setMode(4)
|
|
78
|
+
.setIndices(document.createAccessor().setType('SCALAR').setArray(new Uint32Array(indices)).setBuffer(buffer))
|
|
79
|
+
.setAttribute('POSITION', document.createAccessor().setType('VEC3').setArray(new Float32Array(verts)).setBuffer(buffer))
|
|
80
|
+
.setAttribute('TEXCOORD_0', document.createAccessor().setType('VEC2').setArray(new Float32Array(uvs)).setBuffer(buffer));
|
|
81
|
+
scene.addChild(document.createNode('plane').setMesh(document.createMesh('plane').addPrimitive(prim)));
|
|
82
|
+
return document;
|
|
83
|
+
}
|
|
84
|
+
//# sourceMappingURL=syntheticRig.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"syntheticRig.js","sourceRoot":"","sources":["../../../src/character/testutil/syntheticRig.ts"],"names":[],"mappings":"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"}
|
package/dist/config.d.ts
ADDED
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
export type CliCredentials = {
|
|
2
|
+
apiUrl: string;
|
|
3
|
+
token: string;
|
|
4
|
+
expiresAt: string;
|
|
5
|
+
username: string;
|
|
6
|
+
};
|
|
7
|
+
type HelixEnvName = 'staging' | 'helix3' | 'production';
|
|
8
|
+
export declare function resolveEnvironment(scope: string, override?: {
|
|
9
|
+
apiUrl?: string;
|
|
10
|
+
webUrl?: string;
|
|
11
|
+
}): {
|
|
12
|
+
scope: string;
|
|
13
|
+
env: HelixEnvName;
|
|
14
|
+
apiUrl: string;
|
|
15
|
+
webUrl: string;
|
|
16
|
+
};
|
|
17
|
+
export declare const HELIX_SCOPE: string;
|
|
18
|
+
export declare const HELIX_ENV: HelixEnvName;
|
|
19
|
+
export declare const DEFAULT_API_URL: string;
|
|
20
|
+
export declare const DEFAULT_WEB_URL: string;
|
|
21
|
+
export declare function saveCredentials(creds: CliCredentials): void;
|
|
22
|
+
export declare function loadCredentials(): CliCredentials | null;
|
|
23
|
+
export declare function clearCredentials(): void;
|
|
24
|
+
export declare function jwtExpiresAtIso(token: string): string;
|
|
25
|
+
export {};
|
package/dist/config.js
ADDED
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.DEFAULT_WEB_URL = exports.DEFAULT_API_URL = exports.HELIX_ENV = exports.HELIX_SCOPE = void 0;
|
|
4
|
+
exports.resolveEnvironment = resolveEnvironment;
|
|
5
|
+
exports.saveCredentials = saveCredentials;
|
|
6
|
+
exports.loadCredentials = loadCredentials;
|
|
7
|
+
exports.clearCredentials = clearCredentials;
|
|
8
|
+
exports.jwtExpiresAtIso = jwtExpiresAtIso;
|
|
9
|
+
const node_fs_1 = require("node:fs");
|
|
10
|
+
const node_os_1 = require("node:os");
|
|
11
|
+
const node_path_1 = require("node:path");
|
|
12
|
+
const browserLogin_1 = require("./browserLogin");
|
|
13
|
+
const CONFIG_DIR = (0, node_path_1.join)((0, node_os_1.homedir)(), '.helix');
|
|
14
|
+
const CREDENTIALS_FILE = (0, node_path_1.join)(CONFIG_DIR, 'credentials.json');
|
|
15
|
+
// The npm scope this build was published under selects its default environment:
|
|
16
|
+
// non-prod lanes republish every @helix package under their scope (@helixdev = staging,
|
|
17
|
+
// @helix3 = helix3 — see publish-npm.mjs), production stays @hypersoniclabs. Read from our
|
|
18
|
+
// own package.json `name` (dist/.. at runtime) — a lane tarball carries the rewritten
|
|
19
|
+
// scope; file:-linked local dev reads @hypersoniclabs → production.
|
|
20
|
+
function ownScope() {
|
|
21
|
+
try {
|
|
22
|
+
const name = JSON.parse((0, node_fs_1.readFileSync)((0, node_path_1.join)(__dirname, '..', 'package.json'), 'utf8')).name;
|
|
23
|
+
return name?.startsWith('@') ? name.split('/')[0] : '@hypersoniclabs';
|
|
24
|
+
}
|
|
25
|
+
catch {
|
|
26
|
+
return '@hypersoniclabs';
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
const ENVIRONMENTS = {
|
|
30
|
+
production: { apiUrl: 'https://api.helixgame.com', webUrl: 'https://helixgame.com' },
|
|
31
|
+
staging: { apiUrl: 'https://helix-backend-staging.up.railway.app', webUrl: 'https://next.helixgame.com' },
|
|
32
|
+
helix3: { apiUrl: 'https://helix-backend-api-helix3.up.railway.app', webUrl: 'https://new.helixgame.com' },
|
|
33
|
+
};
|
|
34
|
+
const SCOPE_ENVS = { '@helixdev': 'staging', '@helix3': 'helix3' };
|
|
35
|
+
// Pure resolver (testable without the ambient package.json / process.env): the npm scope
|
|
36
|
+
// picks the environment; HELIX_API_URL/HELIX_WEB_URL override. The site is its OWN value —
|
|
37
|
+
// only an API-only override derives it (api.-strip); otherwise the env default applies.
|
|
38
|
+
function resolveEnvironment(scope, override = {}) {
|
|
39
|
+
const env = SCOPE_ENVS[scope] ?? 'production';
|
|
40
|
+
const preset = ENVIRONMENTS[env];
|
|
41
|
+
const apiUrl = override.apiUrl ?? preset.apiUrl;
|
|
42
|
+
const webUrl = override.webUrl ?? (override.apiUrl ? (0, browserLogin_1.deriveWebUrl)(apiUrl) : preset.webUrl);
|
|
43
|
+
return { scope, env, apiUrl, webUrl };
|
|
44
|
+
}
|
|
45
|
+
// This build's resolved scope/environment + default API & website URLs. Scope comes from
|
|
46
|
+
// our own package.json name; HELIX_API_URL/HELIX_WEB_URL override per run.
|
|
47
|
+
const RESOLVED = resolveEnvironment(ownScope(), {
|
|
48
|
+
apiUrl: process.env.HELIX_API_URL,
|
|
49
|
+
webUrl: process.env.HELIX_WEB_URL,
|
|
50
|
+
});
|
|
51
|
+
exports.HELIX_SCOPE = RESOLVED.scope;
|
|
52
|
+
exports.HELIX_ENV = RESOLVED.env;
|
|
53
|
+
exports.DEFAULT_API_URL = RESOLVED.apiUrl;
|
|
54
|
+
exports.DEFAULT_WEB_URL = RESOLVED.webUrl;
|
|
55
|
+
function saveCredentials(creds) {
|
|
56
|
+
(0, node_fs_1.mkdirSync)(CONFIG_DIR, { recursive: true });
|
|
57
|
+
(0, node_fs_1.writeFileSync)(CREDENTIALS_FILE, JSON.stringify(creds, null, 2), {
|
|
58
|
+
mode: 0o600,
|
|
59
|
+
});
|
|
60
|
+
try {
|
|
61
|
+
(0, node_fs_1.chmodSync)(CREDENTIALS_FILE, 0o600);
|
|
62
|
+
}
|
|
63
|
+
catch {
|
|
64
|
+
// Windows: mode bits are advisory; the file lives under the user profile.
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
function loadCredentials() {
|
|
68
|
+
try {
|
|
69
|
+
const creds = JSON.parse((0, node_fs_1.readFileSync)(CREDENTIALS_FILE, 'utf8'));
|
|
70
|
+
if (creds.expiresAt && new Date(creds.expiresAt).getTime() < Date.now()) {
|
|
71
|
+
return null;
|
|
72
|
+
}
|
|
73
|
+
return creds;
|
|
74
|
+
}
|
|
75
|
+
catch {
|
|
76
|
+
return null;
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
function clearCredentials() {
|
|
80
|
+
try {
|
|
81
|
+
(0, node_fs_1.writeFileSync)(CREDENTIALS_FILE, '{}', { mode: 0o600 });
|
|
82
|
+
}
|
|
83
|
+
catch {
|
|
84
|
+
// nothing stored — already logged out.
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
// Reads the `exp` (seconds) claim from a JWT without verifying its signature —
|
|
88
|
+
// just to surface a friendly expiry to the user and to expire the stored
|
|
89
|
+
// credentials locally. Returns '' if the token is not a decodable JWT.
|
|
90
|
+
function jwtExpiresAtIso(token) {
|
|
91
|
+
try {
|
|
92
|
+
const payload = token.split('.')[1];
|
|
93
|
+
if (!payload)
|
|
94
|
+
return '';
|
|
95
|
+
const json = Buffer.from(payload, 'base64url').toString('utf8');
|
|
96
|
+
const exp = JSON.parse(json).exp;
|
|
97
|
+
return typeof exp === 'number' ? new Date(exp * 1000).toISOString() : '';
|
|
98
|
+
}
|
|
99
|
+
catch {
|
|
100
|
+
return '';
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
//# sourceMappingURL=config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
ADDED