@forgeax/engine-geometry 0.1.19 → 0.1.21
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/README.md +12 -0
- package/dist/.tsbuildinfo +1 -1
- package/dist/__tests__/mesh-builder.integration.test.d.ts +2 -0
- package/dist/__tests__/mesh-builder.integration.test.d.ts.map +1 -0
- package/dist/__tests__/mesh-builder.unit.test.d.ts +2 -0
- package/dist/__tests__/mesh-builder.unit.test.d.ts.map +1 -0
- package/dist/__tests__/teapot.unit.test.d.ts +2 -0
- package/dist/__tests__/teapot.unit.test.d.ts.map +1 -0
- package/dist/assets/mesh-binary.d.ts.map +1 -1
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.mjs +1883 -2
- package/dist/index.mjs.map +1 -1
- package/dist/mesh-builder.d.ts +28 -0
- package/dist/mesh-builder.d.ts.map +1 -0
- package/dist/teapot.d.ts +14 -0
- package/dist/teapot.d.ts.map +1 -0
- package/package.json +5 -5
- package/src/__tests__/mesh-builder.integration.test.ts +58 -0
- package/src/__tests__/mesh-builder.unit.test.ts +96 -0
- package/src/__tests__/teapot.unit.test.ts +48 -0
- package/src/assets/mesh-binary.ts +12 -1
- package/src/index.ts +11 -1
- package/src/mesh-builder.ts +457 -0
- package/src/teapot.ts +263 -0
package/dist/index.mjs
CHANGED
|
@@ -1114,6 +1114,9 @@ function normalizeMeshPayload(payload, refs) {
|
|
|
1114
1114
|
if (payload === null || typeof payload !== "object" || Array.isArray(payload)) return void 0;
|
|
1115
1115
|
const source = payload;
|
|
1116
1116
|
if (source.kind !== "mesh") return void 0;
|
|
1117
|
+
const sourceAttributes = source.attributes !== null && typeof source.attributes === "object" ? source.attributes : void 0;
|
|
1118
|
+
const projection = sourceAttributes === void 0 ? void 0 : deriveVertexLayoutProjection(sourceAttributes);
|
|
1119
|
+
const floatsPerVertex = projection === void 0 || projection.attributes.length === 0 ? PROCEDURAL_FLOATS_PER_VERTEX : projection.arrayStride / Float32Array.BYTES_PER_ELEMENT;
|
|
1117
1120
|
return meshFromParts(
|
|
1118
1121
|
{
|
|
1119
1122
|
vertices: source.vertices,
|
|
@@ -1124,7 +1127,7 @@ function normalizeMeshPayload(payload, refs) {
|
|
|
1124
1127
|
...Array.isArray(source.materialSlots) ? { materialSlots: source.materialSlots } : {},
|
|
1125
1128
|
...source.morphTargets === void 0 ? {} : { morphTargets: source.morphTargets },
|
|
1126
1129
|
...source.morphWeights === void 0 ? {} : { morphWeights: source.morphWeights },
|
|
1127
|
-
floatsPerVertex
|
|
1130
|
+
floatsPerVertex
|
|
1128
1131
|
},
|
|
1129
1132
|
refs
|
|
1130
1133
|
);
|
|
@@ -2325,6 +2328,1884 @@ function createEdgesGeometry(source, thresholdAngleDegrees = DEFAULT_THRESHOLD_D
|
|
|
2325
2328
|
);
|
|
2326
2329
|
return lineMesh(edges.map(({ a, b }) => ({ a, b })));
|
|
2327
2330
|
}
|
|
2331
|
+
var ATTRIBUTE_KEYS = [
|
|
2332
|
+
"position",
|
|
2333
|
+
"normal",
|
|
2334
|
+
"uv",
|
|
2335
|
+
"tangent",
|
|
2336
|
+
"skinIndex",
|
|
2337
|
+
"skinWeight",
|
|
2338
|
+
"uv1",
|
|
2339
|
+
"uv2",
|
|
2340
|
+
"uv3",
|
|
2341
|
+
"uv4",
|
|
2342
|
+
"uv5",
|
|
2343
|
+
"uv6",
|
|
2344
|
+
"uv7",
|
|
2345
|
+
"color"
|
|
2346
|
+
];
|
|
2347
|
+
var ATTRIBUTE_COMPONENTS = {
|
|
2348
|
+
position: 3,
|
|
2349
|
+
normal: 3,
|
|
2350
|
+
uv: 2,
|
|
2351
|
+
tangent: 4,
|
|
2352
|
+
skinIndex: 4,
|
|
2353
|
+
skinWeight: 4,
|
|
2354
|
+
uv1: 2,
|
|
2355
|
+
uv2: 2,
|
|
2356
|
+
uv3: 2,
|
|
2357
|
+
uv4: 2,
|
|
2358
|
+
uv5: 2,
|
|
2359
|
+
uv6: 2,
|
|
2360
|
+
uv7: 2,
|
|
2361
|
+
color: 4
|
|
2362
|
+
};
|
|
2363
|
+
var TOPOLOGIES = [
|
|
2364
|
+
"point-list",
|
|
2365
|
+
"line-list",
|
|
2366
|
+
"line-strip",
|
|
2367
|
+
"triangle-list",
|
|
2368
|
+
"triangle-strip"
|
|
2369
|
+
];
|
|
2370
|
+
function failure(field, value, reason) {
|
|
2371
|
+
return err(
|
|
2372
|
+
new AssetError({
|
|
2373
|
+
code: "asset-invalid-value",
|
|
2374
|
+
expected: `valid MeshBuilder ${field}: ${reason}`,
|
|
2375
|
+
hint: ASSET_ERROR_HINTS["asset-invalid-value"],
|
|
2376
|
+
detail: { field, value, reason }
|
|
2377
|
+
})
|
|
2378
|
+
);
|
|
2379
|
+
}
|
|
2380
|
+
function sourceView(key, value) {
|
|
2381
|
+
if (key === "skinIndex") {
|
|
2382
|
+
if (value instanceof Uint16Array) return value;
|
|
2383
|
+
if (value instanceof ArrayBuffer && value.byteLength % Uint16Array.BYTES_PER_ELEMENT === 0) {
|
|
2384
|
+
return new Uint16Array(value);
|
|
2385
|
+
}
|
|
2386
|
+
return void 0;
|
|
2387
|
+
}
|
|
2388
|
+
if (value instanceof Float32Array) return value;
|
|
2389
|
+
if (value instanceof ArrayBuffer && value.byteLength % Float32Array.BYTES_PER_ELEMENT === 0) {
|
|
2390
|
+
return new Float32Array(value);
|
|
2391
|
+
}
|
|
2392
|
+
return void 0;
|
|
2393
|
+
}
|
|
2394
|
+
function cloneAttribute(key, value) {
|
|
2395
|
+
const view = sourceView(key, value);
|
|
2396
|
+
if (view === void 0) return void 0;
|
|
2397
|
+
return view.slice();
|
|
2398
|
+
}
|
|
2399
|
+
function attributeKeys(attributes) {
|
|
2400
|
+
return ATTRIBUTE_KEYS.filter((key) => attributes[key] !== void 0);
|
|
2401
|
+
}
|
|
2402
|
+
function appendArray(target, source) {
|
|
2403
|
+
if (target instanceof Uint16Array && source instanceof Uint16Array) {
|
|
2404
|
+
const output = new Uint16Array(target.length + source.length);
|
|
2405
|
+
output.set(target, 0);
|
|
2406
|
+
output.set(source, target.length);
|
|
2407
|
+
return output;
|
|
2408
|
+
}
|
|
2409
|
+
if (target instanceof Float32Array && source instanceof Float32Array) {
|
|
2410
|
+
const output = new Float32Array(target.length + source.length);
|
|
2411
|
+
output.set(target, 0);
|
|
2412
|
+
output.set(source, target.length);
|
|
2413
|
+
return output;
|
|
2414
|
+
}
|
|
2415
|
+
return target;
|
|
2416
|
+
}
|
|
2417
|
+
function copySlots(slots) {
|
|
2418
|
+
return (slots ?? [{ slotName: "Default" }]).map((slot) => ({
|
|
2419
|
+
slotName: slot.slotName,
|
|
2420
|
+
...slot.sourceKey === void 0 ? {} : { sourceKey: slot.sourceKey },
|
|
2421
|
+
...slot.defaultMaterial === void 0 ? {} : { defaultMaterial: slot.defaultMaterial }
|
|
2422
|
+
}));
|
|
2423
|
+
}
|
|
2424
|
+
function validateAttributeBatch(attributes) {
|
|
2425
|
+
const keys = attributeKeys(attributes);
|
|
2426
|
+
if (keys.length === 0)
|
|
2427
|
+
return failure("attributes", [], "at least one canonical attribute is required");
|
|
2428
|
+
const position = attributes.position;
|
|
2429
|
+
if (position === void 0)
|
|
2430
|
+
return failure("attributes.position", void 0, "position is required");
|
|
2431
|
+
const positionView = sourceView("position", position);
|
|
2432
|
+
if (positionView === void 0) {
|
|
2433
|
+
return failure(
|
|
2434
|
+
"attributes.position",
|
|
2435
|
+
typeof position,
|
|
2436
|
+
"position must use Float32Array or ArrayBuffer"
|
|
2437
|
+
);
|
|
2438
|
+
}
|
|
2439
|
+
if (positionView.length === 0 || positionView.length % 3 !== 0) {
|
|
2440
|
+
return failure(
|
|
2441
|
+
"attributes.position",
|
|
2442
|
+
positionView.length,
|
|
2443
|
+
"position cardinality must be a non-zero multiple of 3"
|
|
2444
|
+
);
|
|
2445
|
+
}
|
|
2446
|
+
const vertexCount = positionView.length / 3;
|
|
2447
|
+
for (const key of keys) {
|
|
2448
|
+
const value = attributes[key];
|
|
2449
|
+
if (value === void 0) continue;
|
|
2450
|
+
const view = sourceView(key, value);
|
|
2451
|
+
if (view === void 0) {
|
|
2452
|
+
return failure(
|
|
2453
|
+
key,
|
|
2454
|
+
typeof value,
|
|
2455
|
+
key === "skinIndex" ? "storage must be Uint16Array" : "storage must be Float32Array"
|
|
2456
|
+
);
|
|
2457
|
+
}
|
|
2458
|
+
const expectedLength = vertexCount * ATTRIBUTE_COMPONENTS[key];
|
|
2459
|
+
if (view.length !== expectedLength) {
|
|
2460
|
+
return failure(key, view.length, `cardinality must be ${expectedLength}`);
|
|
2461
|
+
}
|
|
2462
|
+
for (let elementIndex = 0; elementIndex < view.length; elementIndex += 1) {
|
|
2463
|
+
const valueAt = view[elementIndex];
|
|
2464
|
+
if (valueAt === void 0 || !Number.isFinite(valueAt)) {
|
|
2465
|
+
return failure(key, valueAt, `${key}[${elementIndex}] must be finite`);
|
|
2466
|
+
}
|
|
2467
|
+
if (key === "skinIndex" && (!Number.isInteger(valueAt) || valueAt < 0 || valueAt > 65535)) {
|
|
2468
|
+
return failure(key, valueAt, `${key}[${elementIndex}] must be an integer in [0, 65535]`);
|
|
2469
|
+
}
|
|
2470
|
+
}
|
|
2471
|
+
}
|
|
2472
|
+
return ok({ keys, vertexCount });
|
|
2473
|
+
}
|
|
2474
|
+
function validateSlots(slots) {
|
|
2475
|
+
if (slots.length === 0)
|
|
2476
|
+
return failure("materialSlots", slots.length, "at least one material slot is required");
|
|
2477
|
+
const names = /* @__PURE__ */ new Set();
|
|
2478
|
+
for (let index = 0; index < slots.length; index += 1) {
|
|
2479
|
+
const slot = slots[index];
|
|
2480
|
+
const name = slot?.slotName.trim() ?? "";
|
|
2481
|
+
if (name.length === 0 || names.has(name)) {
|
|
2482
|
+
return failure(`materialSlots[${index}].slotName`, name, "must be non-empty and unique");
|
|
2483
|
+
}
|
|
2484
|
+
names.add(name);
|
|
2485
|
+
}
|
|
2486
|
+
return ok(void 0);
|
|
2487
|
+
}
|
|
2488
|
+
function completedSubmeshes(requested, vertexCount, indexCount, materialSlotCount) {
|
|
2489
|
+
const source = requested.length === 0 ? [
|
|
2490
|
+
{
|
|
2491
|
+
indexOffset: 0,
|
|
2492
|
+
indexCount,
|
|
2493
|
+
vertexCount,
|
|
2494
|
+
topology: "triangle-list",
|
|
2495
|
+
materialSlot: 0
|
|
2496
|
+
}
|
|
2497
|
+
] : requested;
|
|
2498
|
+
const output = [];
|
|
2499
|
+
for (let index = 0; index < source.length; index += 1) {
|
|
2500
|
+
const candidate = source[index];
|
|
2501
|
+
if (candidate === void 0)
|
|
2502
|
+
return failure(`submeshes[${index}]`, void 0, "entry is required");
|
|
2503
|
+
const indexOffset = candidate.indexOffset ?? 0;
|
|
2504
|
+
const submeshIndexCount = candidate.indexCount ?? (indexCount > 0 ? indexCount : 0);
|
|
2505
|
+
const submeshVertexCount = candidate.vertexCount ?? vertexCount;
|
|
2506
|
+
const topology = candidate.topology ?? "triangle-list";
|
|
2507
|
+
const materialSlot = candidate.materialSlot ?? index;
|
|
2508
|
+
if (!TOPOLOGIES.includes(topology)) {
|
|
2509
|
+
return failure(
|
|
2510
|
+
`submeshes[${index}].topology`,
|
|
2511
|
+
topology,
|
|
2512
|
+
"must be a WebGPU primitive topology"
|
|
2513
|
+
);
|
|
2514
|
+
}
|
|
2515
|
+
if (!Number.isInteger(indexOffset) || indexOffset < 0 || !Number.isInteger(submeshIndexCount) || submeshIndexCount < 0 || !Number.isInteger(submeshVertexCount) || submeshVertexCount < 0 || submeshVertexCount > vertexCount || !Number.isInteger(materialSlot) || materialSlot < 0 || materialSlot >= materialSlotCount) {
|
|
2516
|
+
return failure(
|
|
2517
|
+
`submeshes[${index}]`,
|
|
2518
|
+
JSON.stringify(candidate),
|
|
2519
|
+
"range and material slot are invalid"
|
|
2520
|
+
);
|
|
2521
|
+
}
|
|
2522
|
+
if (indexCount === 0 && (indexOffset !== 0 || submeshIndexCount !== 0)) {
|
|
2523
|
+
return failure(
|
|
2524
|
+
`submeshes[${index}]`,
|
|
2525
|
+
JSON.stringify(candidate),
|
|
2526
|
+
"non-indexed meshes use indexOffset=0 and indexCount=0"
|
|
2527
|
+
);
|
|
2528
|
+
}
|
|
2529
|
+
if (indexCount > 0 && indexOffset + submeshIndexCount > indexCount) {
|
|
2530
|
+
return failure(
|
|
2531
|
+
`submeshes[${index}]`,
|
|
2532
|
+
JSON.stringify(candidate),
|
|
2533
|
+
"index range exceeds the accumulated index buffer"
|
|
2534
|
+
);
|
|
2535
|
+
}
|
|
2536
|
+
if (indexCount === 0 && (topology === "line-strip" || topology === "triangle-strip")) {
|
|
2537
|
+
return failure(
|
|
2538
|
+
`submeshes[${index}].topology`,
|
|
2539
|
+
topology,
|
|
2540
|
+
"strip topology requires an index buffer"
|
|
2541
|
+
);
|
|
2542
|
+
}
|
|
2543
|
+
output.push({
|
|
2544
|
+
indexOffset,
|
|
2545
|
+
indexCount: submeshIndexCount,
|
|
2546
|
+
vertexCount: submeshVertexCount,
|
|
2547
|
+
topology,
|
|
2548
|
+
materialSlot
|
|
2549
|
+
});
|
|
2550
|
+
}
|
|
2551
|
+
return ok(Object.freeze(output));
|
|
2552
|
+
}
|
|
2553
|
+
function createMeshBuilder(options = {}) {
|
|
2554
|
+
const attributes = {};
|
|
2555
|
+
const indices = [];
|
|
2556
|
+
const submeshes = [];
|
|
2557
|
+
const materialSlots = copySlots(options.materialSlots);
|
|
2558
|
+
const appendVertices = (batch) => {
|
|
2559
|
+
const checked = validateAttributeBatch(batch);
|
|
2560
|
+
if (!checked.ok) return checked;
|
|
2561
|
+
const incomingKeys = checked.value.keys;
|
|
2562
|
+
const existingKeys = ATTRIBUTE_KEYS.filter((key) => attributes[key] !== void 0);
|
|
2563
|
+
if (existingKeys.length > 0 && existingKeys.join("|") !== incomingKeys.join("|")) {
|
|
2564
|
+
return failure(
|
|
2565
|
+
"attributes",
|
|
2566
|
+
incomingKeys.join(","),
|
|
2567
|
+
"every appended batch must carry the same canonical keys"
|
|
2568
|
+
);
|
|
2569
|
+
}
|
|
2570
|
+
for (const key of incomingKeys) {
|
|
2571
|
+
const value = batch[key];
|
|
2572
|
+
if (value === void 0) continue;
|
|
2573
|
+
const cloned = cloneAttribute(key, value);
|
|
2574
|
+
if (cloned === void 0) return failure(key, typeof value, "storage could not be cloned");
|
|
2575
|
+
const previous = attributes[key];
|
|
2576
|
+
attributes[key] = previous === void 0 ? cloned : appendArray(previous, cloned);
|
|
2577
|
+
}
|
|
2578
|
+
return ok(void 0);
|
|
2579
|
+
};
|
|
2580
|
+
const appendIndices = (batch) => {
|
|
2581
|
+
for (let index = 0; index < batch.length; index += 1) {
|
|
2582
|
+
const value = Number(batch[index]);
|
|
2583
|
+
if (!Number.isInteger(value) || value < 0 || value > 4294967295) {
|
|
2584
|
+
return failure("indices", value, `indices[${index}] must be an integer in [0, 2^32-1]`);
|
|
2585
|
+
}
|
|
2586
|
+
indices.push(value);
|
|
2587
|
+
}
|
|
2588
|
+
return ok(void 0);
|
|
2589
|
+
};
|
|
2590
|
+
const addSubmesh = (submesh) => {
|
|
2591
|
+
if (submesh === null || typeof submesh !== "object") {
|
|
2592
|
+
return failure("submeshes", submesh, "entry must be an object");
|
|
2593
|
+
}
|
|
2594
|
+
submeshes.push({ ...submesh });
|
|
2595
|
+
return ok(void 0);
|
|
2596
|
+
};
|
|
2597
|
+
const build = () => {
|
|
2598
|
+
const source = attributes;
|
|
2599
|
+
const checked = validateAttributeBatch(source);
|
|
2600
|
+
if (!checked.ok) return checked;
|
|
2601
|
+
const slotCheck = validateSlots(materialSlots);
|
|
2602
|
+
if (!slotCheck.ok) return slotCheck;
|
|
2603
|
+
const vertexCount = checked.value.vertexCount;
|
|
2604
|
+
const position = source.position;
|
|
2605
|
+
if (position === void 0)
|
|
2606
|
+
return failure("attributes.position", void 0, "position is required");
|
|
2607
|
+
const positionView = sourceView("position", position);
|
|
2608
|
+
if (!(positionView instanceof Float32Array)) {
|
|
2609
|
+
return failure("attributes.position", typeof position, "position storage is invalid");
|
|
2610
|
+
}
|
|
2611
|
+
let maxIndex = 0;
|
|
2612
|
+
for (const value of indices) maxIndex = Math.max(maxIndex, value);
|
|
2613
|
+
const indexArray2 = indices.length === 0 ? void 0 : maxIndex <= 65535 ? new Uint16Array(indices) : new Uint32Array(indices);
|
|
2614
|
+
if (indexArray2 !== void 0) {
|
|
2615
|
+
for (let index = 0; index < indexArray2.length; index += 1) {
|
|
2616
|
+
const value = indexArray2[index];
|
|
2617
|
+
if (value === void 0 || value >= vertexCount) {
|
|
2618
|
+
return failure(
|
|
2619
|
+
"indices",
|
|
2620
|
+
value ?? -1,
|
|
2621
|
+
`indices[${index}] must be less than vertexCount (${vertexCount})`
|
|
2622
|
+
);
|
|
2623
|
+
}
|
|
2624
|
+
}
|
|
2625
|
+
}
|
|
2626
|
+
const packed = packInterleavedVertexAttributes(source, vertexCount);
|
|
2627
|
+
if (!packed.ok) return packed;
|
|
2628
|
+
const ranges = completedSubmeshes(
|
|
2629
|
+
submeshes,
|
|
2630
|
+
vertexCount,
|
|
2631
|
+
indexArray2?.length ?? 0,
|
|
2632
|
+
materialSlots.length
|
|
2633
|
+
);
|
|
2634
|
+
if (!ranges.ok) return ranges;
|
|
2635
|
+
const aabb = box3.fromPositions(box3.create(), positionView);
|
|
2636
|
+
const copiedAttributes = {};
|
|
2637
|
+
for (const key of checked.value.keys) {
|
|
2638
|
+
const value = source[key];
|
|
2639
|
+
if (value === void 0) continue;
|
|
2640
|
+
const cloned = cloneAttribute(key, value);
|
|
2641
|
+
if (cloned === void 0) return failure(key, typeof value, "storage could not be cloned");
|
|
2642
|
+
if (key === "skinIndex") {
|
|
2643
|
+
if (!(cloned instanceof Uint16Array)) {
|
|
2644
|
+
return failure(key, typeof value, "skinIndex storage must be Uint16Array");
|
|
2645
|
+
}
|
|
2646
|
+
copiedAttributes.skinIndex = cloned;
|
|
2647
|
+
} else {
|
|
2648
|
+
if (!(cloned instanceof Float32Array)) {
|
|
2649
|
+
return failure(key, typeof value, `${key} storage must be Float32Array`);
|
|
2650
|
+
}
|
|
2651
|
+
copiedAttributes[key] = cloned;
|
|
2652
|
+
}
|
|
2653
|
+
}
|
|
2654
|
+
const mesh = {
|
|
2655
|
+
kind: "mesh",
|
|
2656
|
+
vertices: packed.value.vertices.slice(),
|
|
2657
|
+
...indexArray2 === void 0 ? {} : { indices: indexArray2.slice() },
|
|
2658
|
+
attributes: copiedAttributes,
|
|
2659
|
+
aabb: Float32Array.from(aabb),
|
|
2660
|
+
submeshes: ranges.value,
|
|
2661
|
+
materialSlots: Object.freeze(materialSlots.map((slot) => ({ ...slot })))
|
|
2662
|
+
};
|
|
2663
|
+
return ok(Object.freeze(mesh));
|
|
2664
|
+
};
|
|
2665
|
+
if (options.attributes !== void 0) {
|
|
2666
|
+
const result = appendVertices(options.attributes);
|
|
2667
|
+
if (!result.ok) {
|
|
2668
|
+
const constructionError = result.error;
|
|
2669
|
+
return {
|
|
2670
|
+
appendVertices,
|
|
2671
|
+
appendIndices,
|
|
2672
|
+
addSubmesh,
|
|
2673
|
+
build: () => err(constructionError)
|
|
2674
|
+
};
|
|
2675
|
+
}
|
|
2676
|
+
}
|
|
2677
|
+
if (options.indices !== void 0) {
|
|
2678
|
+
const result = appendIndices(options.indices);
|
|
2679
|
+
if (!result.ok) {
|
|
2680
|
+
const constructionError = result.error;
|
|
2681
|
+
return {
|
|
2682
|
+
appendVertices,
|
|
2683
|
+
appendIndices,
|
|
2684
|
+
addSubmesh,
|
|
2685
|
+
build: () => err(constructionError)
|
|
2686
|
+
};
|
|
2687
|
+
}
|
|
2688
|
+
}
|
|
2689
|
+
for (const submesh of options.submeshes ?? []) submeshes.push({ ...submesh });
|
|
2690
|
+
return { appendVertices, appendIndices, addSubmesh, build };
|
|
2691
|
+
}
|
|
2692
|
+
var PATCHES = new Uint16Array([
|
|
2693
|
+
0,
|
|
2694
|
+
1,
|
|
2695
|
+
2,
|
|
2696
|
+
3,
|
|
2697
|
+
4,
|
|
2698
|
+
5,
|
|
2699
|
+
6,
|
|
2700
|
+
7,
|
|
2701
|
+
8,
|
|
2702
|
+
9,
|
|
2703
|
+
10,
|
|
2704
|
+
11,
|
|
2705
|
+
12,
|
|
2706
|
+
13,
|
|
2707
|
+
14,
|
|
2708
|
+
15,
|
|
2709
|
+
3,
|
|
2710
|
+
16,
|
|
2711
|
+
17,
|
|
2712
|
+
18,
|
|
2713
|
+
7,
|
|
2714
|
+
19,
|
|
2715
|
+
20,
|
|
2716
|
+
21,
|
|
2717
|
+
11,
|
|
2718
|
+
22,
|
|
2719
|
+
23,
|
|
2720
|
+
24,
|
|
2721
|
+
15,
|
|
2722
|
+
25,
|
|
2723
|
+
26,
|
|
2724
|
+
27,
|
|
2725
|
+
18,
|
|
2726
|
+
28,
|
|
2727
|
+
29,
|
|
2728
|
+
30,
|
|
2729
|
+
21,
|
|
2730
|
+
31,
|
|
2731
|
+
32,
|
|
2732
|
+
33,
|
|
2733
|
+
24,
|
|
2734
|
+
34,
|
|
2735
|
+
35,
|
|
2736
|
+
36,
|
|
2737
|
+
27,
|
|
2738
|
+
37,
|
|
2739
|
+
38,
|
|
2740
|
+
39,
|
|
2741
|
+
30,
|
|
2742
|
+
40,
|
|
2743
|
+
41,
|
|
2744
|
+
0,
|
|
2745
|
+
33,
|
|
2746
|
+
42,
|
|
2747
|
+
43,
|
|
2748
|
+
4,
|
|
2749
|
+
36,
|
|
2750
|
+
44,
|
|
2751
|
+
45,
|
|
2752
|
+
8,
|
|
2753
|
+
39,
|
|
2754
|
+
46,
|
|
2755
|
+
47,
|
|
2756
|
+
12,
|
|
2757
|
+
12,
|
|
2758
|
+
13,
|
|
2759
|
+
14,
|
|
2760
|
+
15,
|
|
2761
|
+
48,
|
|
2762
|
+
49,
|
|
2763
|
+
50,
|
|
2764
|
+
51,
|
|
2765
|
+
52,
|
|
2766
|
+
53,
|
|
2767
|
+
54,
|
|
2768
|
+
55,
|
|
2769
|
+
56,
|
|
2770
|
+
57,
|
|
2771
|
+
58,
|
|
2772
|
+
59,
|
|
2773
|
+
15,
|
|
2774
|
+
25,
|
|
2775
|
+
26,
|
|
2776
|
+
27,
|
|
2777
|
+
51,
|
|
2778
|
+
60,
|
|
2779
|
+
61,
|
|
2780
|
+
62,
|
|
2781
|
+
55,
|
|
2782
|
+
63,
|
|
2783
|
+
64,
|
|
2784
|
+
65,
|
|
2785
|
+
59,
|
|
2786
|
+
66,
|
|
2787
|
+
67,
|
|
2788
|
+
68,
|
|
2789
|
+
27,
|
|
2790
|
+
37,
|
|
2791
|
+
38,
|
|
2792
|
+
39,
|
|
2793
|
+
62,
|
|
2794
|
+
69,
|
|
2795
|
+
70,
|
|
2796
|
+
71,
|
|
2797
|
+
65,
|
|
2798
|
+
72,
|
|
2799
|
+
73,
|
|
2800
|
+
74,
|
|
2801
|
+
68,
|
|
2802
|
+
75,
|
|
2803
|
+
76,
|
|
2804
|
+
77,
|
|
2805
|
+
39,
|
|
2806
|
+
46,
|
|
2807
|
+
47,
|
|
2808
|
+
12,
|
|
2809
|
+
71,
|
|
2810
|
+
78,
|
|
2811
|
+
79,
|
|
2812
|
+
48,
|
|
2813
|
+
74,
|
|
2814
|
+
80,
|
|
2815
|
+
81,
|
|
2816
|
+
52,
|
|
2817
|
+
77,
|
|
2818
|
+
82,
|
|
2819
|
+
83,
|
|
2820
|
+
56,
|
|
2821
|
+
56,
|
|
2822
|
+
57,
|
|
2823
|
+
58,
|
|
2824
|
+
59,
|
|
2825
|
+
84,
|
|
2826
|
+
85,
|
|
2827
|
+
86,
|
|
2828
|
+
87,
|
|
2829
|
+
88,
|
|
2830
|
+
89,
|
|
2831
|
+
90,
|
|
2832
|
+
91,
|
|
2833
|
+
92,
|
|
2834
|
+
93,
|
|
2835
|
+
94,
|
|
2836
|
+
95,
|
|
2837
|
+
59,
|
|
2838
|
+
66,
|
|
2839
|
+
67,
|
|
2840
|
+
68,
|
|
2841
|
+
87,
|
|
2842
|
+
96,
|
|
2843
|
+
97,
|
|
2844
|
+
98,
|
|
2845
|
+
91,
|
|
2846
|
+
99,
|
|
2847
|
+
100,
|
|
2848
|
+
101,
|
|
2849
|
+
95,
|
|
2850
|
+
102,
|
|
2851
|
+
103,
|
|
2852
|
+
104,
|
|
2853
|
+
68,
|
|
2854
|
+
75,
|
|
2855
|
+
76,
|
|
2856
|
+
77,
|
|
2857
|
+
98,
|
|
2858
|
+
105,
|
|
2859
|
+
106,
|
|
2860
|
+
107,
|
|
2861
|
+
101,
|
|
2862
|
+
108,
|
|
2863
|
+
109,
|
|
2864
|
+
110,
|
|
2865
|
+
104,
|
|
2866
|
+
111,
|
|
2867
|
+
112,
|
|
2868
|
+
113,
|
|
2869
|
+
77,
|
|
2870
|
+
82,
|
|
2871
|
+
83,
|
|
2872
|
+
56,
|
|
2873
|
+
107,
|
|
2874
|
+
114,
|
|
2875
|
+
115,
|
|
2876
|
+
84,
|
|
2877
|
+
110,
|
|
2878
|
+
116,
|
|
2879
|
+
117,
|
|
2880
|
+
88,
|
|
2881
|
+
113,
|
|
2882
|
+
118,
|
|
2883
|
+
119,
|
|
2884
|
+
92,
|
|
2885
|
+
120,
|
|
2886
|
+
121,
|
|
2887
|
+
122,
|
|
2888
|
+
123,
|
|
2889
|
+
124,
|
|
2890
|
+
125,
|
|
2891
|
+
126,
|
|
2892
|
+
127,
|
|
2893
|
+
128,
|
|
2894
|
+
129,
|
|
2895
|
+
130,
|
|
2896
|
+
131,
|
|
2897
|
+
132,
|
|
2898
|
+
133,
|
|
2899
|
+
134,
|
|
2900
|
+
135,
|
|
2901
|
+
123,
|
|
2902
|
+
136,
|
|
2903
|
+
137,
|
|
2904
|
+
120,
|
|
2905
|
+
127,
|
|
2906
|
+
138,
|
|
2907
|
+
139,
|
|
2908
|
+
124,
|
|
2909
|
+
131,
|
|
2910
|
+
140,
|
|
2911
|
+
141,
|
|
2912
|
+
128,
|
|
2913
|
+
135,
|
|
2914
|
+
142,
|
|
2915
|
+
143,
|
|
2916
|
+
132,
|
|
2917
|
+
132,
|
|
2918
|
+
133,
|
|
2919
|
+
134,
|
|
2920
|
+
135,
|
|
2921
|
+
144,
|
|
2922
|
+
145,
|
|
2923
|
+
146,
|
|
2924
|
+
147,
|
|
2925
|
+
148,
|
|
2926
|
+
149,
|
|
2927
|
+
150,
|
|
2928
|
+
151,
|
|
2929
|
+
68,
|
|
2930
|
+
152,
|
|
2931
|
+
153,
|
|
2932
|
+
154,
|
|
2933
|
+
135,
|
|
2934
|
+
142,
|
|
2935
|
+
143,
|
|
2936
|
+
132,
|
|
2937
|
+
147,
|
|
2938
|
+
155,
|
|
2939
|
+
156,
|
|
2940
|
+
144,
|
|
2941
|
+
151,
|
|
2942
|
+
157,
|
|
2943
|
+
158,
|
|
2944
|
+
148,
|
|
2945
|
+
154,
|
|
2946
|
+
159,
|
|
2947
|
+
160,
|
|
2948
|
+
68,
|
|
2949
|
+
161,
|
|
2950
|
+
162,
|
|
2951
|
+
163,
|
|
2952
|
+
164,
|
|
2953
|
+
165,
|
|
2954
|
+
166,
|
|
2955
|
+
167,
|
|
2956
|
+
168,
|
|
2957
|
+
169,
|
|
2958
|
+
170,
|
|
2959
|
+
171,
|
|
2960
|
+
172,
|
|
2961
|
+
173,
|
|
2962
|
+
174,
|
|
2963
|
+
175,
|
|
2964
|
+
176,
|
|
2965
|
+
164,
|
|
2966
|
+
177,
|
|
2967
|
+
178,
|
|
2968
|
+
161,
|
|
2969
|
+
168,
|
|
2970
|
+
179,
|
|
2971
|
+
180,
|
|
2972
|
+
165,
|
|
2973
|
+
172,
|
|
2974
|
+
181,
|
|
2975
|
+
182,
|
|
2976
|
+
169,
|
|
2977
|
+
176,
|
|
2978
|
+
183,
|
|
2979
|
+
184,
|
|
2980
|
+
173,
|
|
2981
|
+
173,
|
|
2982
|
+
174,
|
|
2983
|
+
175,
|
|
2984
|
+
176,
|
|
2985
|
+
185,
|
|
2986
|
+
186,
|
|
2987
|
+
187,
|
|
2988
|
+
188,
|
|
2989
|
+
189,
|
|
2990
|
+
190,
|
|
2991
|
+
191,
|
|
2992
|
+
192,
|
|
2993
|
+
193,
|
|
2994
|
+
194,
|
|
2995
|
+
195,
|
|
2996
|
+
196,
|
|
2997
|
+
176,
|
|
2998
|
+
183,
|
|
2999
|
+
184,
|
|
3000
|
+
173,
|
|
3001
|
+
188,
|
|
3002
|
+
197,
|
|
3003
|
+
198,
|
|
3004
|
+
185,
|
|
3005
|
+
192,
|
|
3006
|
+
199,
|
|
3007
|
+
200,
|
|
3008
|
+
189,
|
|
3009
|
+
196,
|
|
3010
|
+
201,
|
|
3011
|
+
202,
|
|
3012
|
+
193,
|
|
3013
|
+
203,
|
|
3014
|
+
203,
|
|
3015
|
+
203,
|
|
3016
|
+
203,
|
|
3017
|
+
204,
|
|
3018
|
+
205,
|
|
3019
|
+
206,
|
|
3020
|
+
207,
|
|
3021
|
+
208,
|
|
3022
|
+
208,
|
|
3023
|
+
208,
|
|
3024
|
+
208,
|
|
3025
|
+
209,
|
|
3026
|
+
210,
|
|
3027
|
+
211,
|
|
3028
|
+
212,
|
|
3029
|
+
203,
|
|
3030
|
+
203,
|
|
3031
|
+
203,
|
|
3032
|
+
203,
|
|
3033
|
+
207,
|
|
3034
|
+
213,
|
|
3035
|
+
214,
|
|
3036
|
+
215,
|
|
3037
|
+
208,
|
|
3038
|
+
208,
|
|
3039
|
+
208,
|
|
3040
|
+
208,
|
|
3041
|
+
212,
|
|
3042
|
+
216,
|
|
3043
|
+
217,
|
|
3044
|
+
218,
|
|
3045
|
+
203,
|
|
3046
|
+
203,
|
|
3047
|
+
203,
|
|
3048
|
+
203,
|
|
3049
|
+
215,
|
|
3050
|
+
219,
|
|
3051
|
+
220,
|
|
3052
|
+
221,
|
|
3053
|
+
208,
|
|
3054
|
+
208,
|
|
3055
|
+
208,
|
|
3056
|
+
208,
|
|
3057
|
+
218,
|
|
3058
|
+
222,
|
|
3059
|
+
223,
|
|
3060
|
+
224,
|
|
3061
|
+
203,
|
|
3062
|
+
203,
|
|
3063
|
+
203,
|
|
3064
|
+
203,
|
|
3065
|
+
221,
|
|
3066
|
+
225,
|
|
3067
|
+
226,
|
|
3068
|
+
204,
|
|
3069
|
+
208,
|
|
3070
|
+
208,
|
|
3071
|
+
208,
|
|
3072
|
+
208,
|
|
3073
|
+
224,
|
|
3074
|
+
227,
|
|
3075
|
+
228,
|
|
3076
|
+
209,
|
|
3077
|
+
209,
|
|
3078
|
+
210,
|
|
3079
|
+
211,
|
|
3080
|
+
212,
|
|
3081
|
+
229,
|
|
3082
|
+
230,
|
|
3083
|
+
231,
|
|
3084
|
+
232,
|
|
3085
|
+
233,
|
|
3086
|
+
234,
|
|
3087
|
+
235,
|
|
3088
|
+
236,
|
|
3089
|
+
237,
|
|
3090
|
+
238,
|
|
3091
|
+
239,
|
|
3092
|
+
240,
|
|
3093
|
+
212,
|
|
3094
|
+
216,
|
|
3095
|
+
217,
|
|
3096
|
+
218,
|
|
3097
|
+
232,
|
|
3098
|
+
241,
|
|
3099
|
+
242,
|
|
3100
|
+
243,
|
|
3101
|
+
236,
|
|
3102
|
+
244,
|
|
3103
|
+
245,
|
|
3104
|
+
246,
|
|
3105
|
+
240,
|
|
3106
|
+
247,
|
|
3107
|
+
248,
|
|
3108
|
+
249,
|
|
3109
|
+
218,
|
|
3110
|
+
222,
|
|
3111
|
+
223,
|
|
3112
|
+
224,
|
|
3113
|
+
243,
|
|
3114
|
+
250,
|
|
3115
|
+
251,
|
|
3116
|
+
252,
|
|
3117
|
+
246,
|
|
3118
|
+
253,
|
|
3119
|
+
254,
|
|
3120
|
+
255,
|
|
3121
|
+
249,
|
|
3122
|
+
256,
|
|
3123
|
+
257,
|
|
3124
|
+
258,
|
|
3125
|
+
224,
|
|
3126
|
+
227,
|
|
3127
|
+
228,
|
|
3128
|
+
209,
|
|
3129
|
+
252,
|
|
3130
|
+
259,
|
|
3131
|
+
260,
|
|
3132
|
+
229,
|
|
3133
|
+
255,
|
|
3134
|
+
261,
|
|
3135
|
+
262,
|
|
3136
|
+
233,
|
|
3137
|
+
258,
|
|
3138
|
+
263,
|
|
3139
|
+
264,
|
|
3140
|
+
237,
|
|
3141
|
+
265,
|
|
3142
|
+
265,
|
|
3143
|
+
265,
|
|
3144
|
+
265,
|
|
3145
|
+
266,
|
|
3146
|
+
267,
|
|
3147
|
+
268,
|
|
3148
|
+
269,
|
|
3149
|
+
270,
|
|
3150
|
+
271,
|
|
3151
|
+
272,
|
|
3152
|
+
273,
|
|
3153
|
+
92,
|
|
3154
|
+
119,
|
|
3155
|
+
118,
|
|
3156
|
+
113,
|
|
3157
|
+
265,
|
|
3158
|
+
265,
|
|
3159
|
+
265,
|
|
3160
|
+
265,
|
|
3161
|
+
269,
|
|
3162
|
+
274,
|
|
3163
|
+
275,
|
|
3164
|
+
276,
|
|
3165
|
+
273,
|
|
3166
|
+
277,
|
|
3167
|
+
278,
|
|
3168
|
+
279,
|
|
3169
|
+
113,
|
|
3170
|
+
112,
|
|
3171
|
+
111,
|
|
3172
|
+
104,
|
|
3173
|
+
265,
|
|
3174
|
+
265,
|
|
3175
|
+
265,
|
|
3176
|
+
265,
|
|
3177
|
+
276,
|
|
3178
|
+
280,
|
|
3179
|
+
281,
|
|
3180
|
+
282,
|
|
3181
|
+
279,
|
|
3182
|
+
283,
|
|
3183
|
+
284,
|
|
3184
|
+
285,
|
|
3185
|
+
104,
|
|
3186
|
+
103,
|
|
3187
|
+
102,
|
|
3188
|
+
95,
|
|
3189
|
+
265,
|
|
3190
|
+
265,
|
|
3191
|
+
265,
|
|
3192
|
+
265,
|
|
3193
|
+
282,
|
|
3194
|
+
286,
|
|
3195
|
+
287,
|
|
3196
|
+
266,
|
|
3197
|
+
285,
|
|
3198
|
+
288,
|
|
3199
|
+
289,
|
|
3200
|
+
270,
|
|
3201
|
+
95,
|
|
3202
|
+
94,
|
|
3203
|
+
93,
|
|
3204
|
+
92
|
|
3205
|
+
]);
|
|
3206
|
+
var CONTROL_POINTS = new Float32Array([
|
|
3207
|
+
1.4,
|
|
3208
|
+
0,
|
|
3209
|
+
2.4,
|
|
3210
|
+
1.4,
|
|
3211
|
+
-0.784,
|
|
3212
|
+
2.4,
|
|
3213
|
+
0.784,
|
|
3214
|
+
-1.4,
|
|
3215
|
+
2.4,
|
|
3216
|
+
0,
|
|
3217
|
+
-1.4,
|
|
3218
|
+
2.4,
|
|
3219
|
+
1.3375,
|
|
3220
|
+
0,
|
|
3221
|
+
2.53125,
|
|
3222
|
+
1.3375,
|
|
3223
|
+
-0.749,
|
|
3224
|
+
2.53125,
|
|
3225
|
+
0.749,
|
|
3226
|
+
-1.3375,
|
|
3227
|
+
2.53125,
|
|
3228
|
+
0,
|
|
3229
|
+
-1.3375,
|
|
3230
|
+
2.53125,
|
|
3231
|
+
1.4375,
|
|
3232
|
+
0,
|
|
3233
|
+
2.53125,
|
|
3234
|
+
1.4375,
|
|
3235
|
+
-0.805,
|
|
3236
|
+
2.53125,
|
|
3237
|
+
0.805,
|
|
3238
|
+
-1.4375,
|
|
3239
|
+
2.53125,
|
|
3240
|
+
0,
|
|
3241
|
+
-1.4375,
|
|
3242
|
+
2.53125,
|
|
3243
|
+
1.5,
|
|
3244
|
+
0,
|
|
3245
|
+
2.4,
|
|
3246
|
+
1.5,
|
|
3247
|
+
-0.84,
|
|
3248
|
+
2.4,
|
|
3249
|
+
0.84,
|
|
3250
|
+
-1.5,
|
|
3251
|
+
2.4,
|
|
3252
|
+
0,
|
|
3253
|
+
-1.5,
|
|
3254
|
+
2.4,
|
|
3255
|
+
-0.784,
|
|
3256
|
+
-1.4,
|
|
3257
|
+
2.4,
|
|
3258
|
+
-1.4,
|
|
3259
|
+
-0.784,
|
|
3260
|
+
2.4,
|
|
3261
|
+
-1.4,
|
|
3262
|
+
0,
|
|
3263
|
+
2.4,
|
|
3264
|
+
-0.749,
|
|
3265
|
+
-1.3375,
|
|
3266
|
+
2.53125,
|
|
3267
|
+
-1.3375,
|
|
3268
|
+
-0.749,
|
|
3269
|
+
2.53125,
|
|
3270
|
+
-1.3375,
|
|
3271
|
+
0,
|
|
3272
|
+
2.53125,
|
|
3273
|
+
-0.805,
|
|
3274
|
+
-1.4375,
|
|
3275
|
+
2.53125,
|
|
3276
|
+
-1.4375,
|
|
3277
|
+
-0.805,
|
|
3278
|
+
2.53125,
|
|
3279
|
+
-1.4375,
|
|
3280
|
+
0,
|
|
3281
|
+
2.53125,
|
|
3282
|
+
-0.84,
|
|
3283
|
+
-1.5,
|
|
3284
|
+
2.4,
|
|
3285
|
+
-1.5,
|
|
3286
|
+
-0.84,
|
|
3287
|
+
2.4,
|
|
3288
|
+
-1.5,
|
|
3289
|
+
0,
|
|
3290
|
+
2.4,
|
|
3291
|
+
-1.4,
|
|
3292
|
+
0.784,
|
|
3293
|
+
2.4,
|
|
3294
|
+
-0.784,
|
|
3295
|
+
1.4,
|
|
3296
|
+
2.4,
|
|
3297
|
+
0,
|
|
3298
|
+
1.4,
|
|
3299
|
+
2.4,
|
|
3300
|
+
-1.3375,
|
|
3301
|
+
0.749,
|
|
3302
|
+
2.53125,
|
|
3303
|
+
-0.749,
|
|
3304
|
+
1.3375,
|
|
3305
|
+
2.53125,
|
|
3306
|
+
0,
|
|
3307
|
+
1.3375,
|
|
3308
|
+
2.53125,
|
|
3309
|
+
-1.4375,
|
|
3310
|
+
0.805,
|
|
3311
|
+
2.53125,
|
|
3312
|
+
-0.805,
|
|
3313
|
+
1.4375,
|
|
3314
|
+
2.53125,
|
|
3315
|
+
0,
|
|
3316
|
+
1.4375,
|
|
3317
|
+
2.53125,
|
|
3318
|
+
-1.5,
|
|
3319
|
+
0.84,
|
|
3320
|
+
2.4,
|
|
3321
|
+
-0.84,
|
|
3322
|
+
1.5,
|
|
3323
|
+
2.4,
|
|
3324
|
+
0,
|
|
3325
|
+
1.5,
|
|
3326
|
+
2.4,
|
|
3327
|
+
0.784,
|
|
3328
|
+
1.4,
|
|
3329
|
+
2.4,
|
|
3330
|
+
1.4,
|
|
3331
|
+
0.784,
|
|
3332
|
+
2.4,
|
|
3333
|
+
0.749,
|
|
3334
|
+
1.3375,
|
|
3335
|
+
2.53125,
|
|
3336
|
+
1.3375,
|
|
3337
|
+
0.749,
|
|
3338
|
+
2.53125,
|
|
3339
|
+
0.805,
|
|
3340
|
+
1.4375,
|
|
3341
|
+
2.53125,
|
|
3342
|
+
1.4375,
|
|
3343
|
+
0.805,
|
|
3344
|
+
2.53125,
|
|
3345
|
+
0.84,
|
|
3346
|
+
1.5,
|
|
3347
|
+
2.4,
|
|
3348
|
+
1.5,
|
|
3349
|
+
0.84,
|
|
3350
|
+
2.4,
|
|
3351
|
+
1.75,
|
|
3352
|
+
0,
|
|
3353
|
+
1.875,
|
|
3354
|
+
1.75,
|
|
3355
|
+
-0.98,
|
|
3356
|
+
1.875,
|
|
3357
|
+
0.98,
|
|
3358
|
+
-1.75,
|
|
3359
|
+
1.875,
|
|
3360
|
+
0,
|
|
3361
|
+
-1.75,
|
|
3362
|
+
1.875,
|
|
3363
|
+
2,
|
|
3364
|
+
0,
|
|
3365
|
+
1.35,
|
|
3366
|
+
2,
|
|
3367
|
+
-1.12,
|
|
3368
|
+
1.35,
|
|
3369
|
+
1.12,
|
|
3370
|
+
-2,
|
|
3371
|
+
1.35,
|
|
3372
|
+
0,
|
|
3373
|
+
-2,
|
|
3374
|
+
1.35,
|
|
3375
|
+
2,
|
|
3376
|
+
0,
|
|
3377
|
+
0.9,
|
|
3378
|
+
2,
|
|
3379
|
+
-1.12,
|
|
3380
|
+
0.9,
|
|
3381
|
+
1.12,
|
|
3382
|
+
-2,
|
|
3383
|
+
0.9,
|
|
3384
|
+
0,
|
|
3385
|
+
-2,
|
|
3386
|
+
0.9,
|
|
3387
|
+
-0.98,
|
|
3388
|
+
-1.75,
|
|
3389
|
+
1.875,
|
|
3390
|
+
-1.75,
|
|
3391
|
+
-0.98,
|
|
3392
|
+
1.875,
|
|
3393
|
+
-1.75,
|
|
3394
|
+
0,
|
|
3395
|
+
1.875,
|
|
3396
|
+
-1.12,
|
|
3397
|
+
-2,
|
|
3398
|
+
1.35,
|
|
3399
|
+
-2,
|
|
3400
|
+
-1.12,
|
|
3401
|
+
1.35,
|
|
3402
|
+
-2,
|
|
3403
|
+
0,
|
|
3404
|
+
1.35,
|
|
3405
|
+
-1.12,
|
|
3406
|
+
-2,
|
|
3407
|
+
0.9,
|
|
3408
|
+
-2,
|
|
3409
|
+
-1.12,
|
|
3410
|
+
0.9,
|
|
3411
|
+
-2,
|
|
3412
|
+
0,
|
|
3413
|
+
0.9,
|
|
3414
|
+
-1.75,
|
|
3415
|
+
0.98,
|
|
3416
|
+
1.875,
|
|
3417
|
+
-0.98,
|
|
3418
|
+
1.75,
|
|
3419
|
+
1.875,
|
|
3420
|
+
0,
|
|
3421
|
+
1.75,
|
|
3422
|
+
1.875,
|
|
3423
|
+
-2,
|
|
3424
|
+
1.12,
|
|
3425
|
+
1.35,
|
|
3426
|
+
-1.12,
|
|
3427
|
+
2,
|
|
3428
|
+
1.35,
|
|
3429
|
+
0,
|
|
3430
|
+
2,
|
|
3431
|
+
1.35,
|
|
3432
|
+
-2,
|
|
3433
|
+
1.12,
|
|
3434
|
+
0.9,
|
|
3435
|
+
-1.12,
|
|
3436
|
+
2,
|
|
3437
|
+
0.9,
|
|
3438
|
+
0,
|
|
3439
|
+
2,
|
|
3440
|
+
0.9,
|
|
3441
|
+
0.98,
|
|
3442
|
+
1.75,
|
|
3443
|
+
1.875,
|
|
3444
|
+
1.75,
|
|
3445
|
+
0.98,
|
|
3446
|
+
1.875,
|
|
3447
|
+
1.12,
|
|
3448
|
+
2,
|
|
3449
|
+
1.35,
|
|
3450
|
+
2,
|
|
3451
|
+
1.12,
|
|
3452
|
+
1.35,
|
|
3453
|
+
1.12,
|
|
3454
|
+
2,
|
|
3455
|
+
0.9,
|
|
3456
|
+
2,
|
|
3457
|
+
1.12,
|
|
3458
|
+
0.9,
|
|
3459
|
+
2,
|
|
3460
|
+
0,
|
|
3461
|
+
0.45,
|
|
3462
|
+
2,
|
|
3463
|
+
-1.12,
|
|
3464
|
+
0.45,
|
|
3465
|
+
1.12,
|
|
3466
|
+
-2,
|
|
3467
|
+
0.45,
|
|
3468
|
+
0,
|
|
3469
|
+
-2,
|
|
3470
|
+
0.45,
|
|
3471
|
+
1.5,
|
|
3472
|
+
0,
|
|
3473
|
+
0.225,
|
|
3474
|
+
1.5,
|
|
3475
|
+
-0.84,
|
|
3476
|
+
0.225,
|
|
3477
|
+
0.84,
|
|
3478
|
+
-1.5,
|
|
3479
|
+
0.225,
|
|
3480
|
+
0,
|
|
3481
|
+
-1.5,
|
|
3482
|
+
0.225,
|
|
3483
|
+
1.5,
|
|
3484
|
+
0,
|
|
3485
|
+
0.15,
|
|
3486
|
+
1.5,
|
|
3487
|
+
-0.84,
|
|
3488
|
+
0.15,
|
|
3489
|
+
0.84,
|
|
3490
|
+
-1.5,
|
|
3491
|
+
0.15,
|
|
3492
|
+
0,
|
|
3493
|
+
-1.5,
|
|
3494
|
+
0.15,
|
|
3495
|
+
-1.12,
|
|
3496
|
+
-2,
|
|
3497
|
+
0.45,
|
|
3498
|
+
-2,
|
|
3499
|
+
-1.12,
|
|
3500
|
+
0.45,
|
|
3501
|
+
-2,
|
|
3502
|
+
0,
|
|
3503
|
+
0.45,
|
|
3504
|
+
-0.84,
|
|
3505
|
+
-1.5,
|
|
3506
|
+
0.225,
|
|
3507
|
+
-1.5,
|
|
3508
|
+
-0.84,
|
|
3509
|
+
0.225,
|
|
3510
|
+
-1.5,
|
|
3511
|
+
0,
|
|
3512
|
+
0.225,
|
|
3513
|
+
-0.84,
|
|
3514
|
+
-1.5,
|
|
3515
|
+
0.15,
|
|
3516
|
+
-1.5,
|
|
3517
|
+
-0.84,
|
|
3518
|
+
0.15,
|
|
3519
|
+
-1.5,
|
|
3520
|
+
0,
|
|
3521
|
+
0.15,
|
|
3522
|
+
-2,
|
|
3523
|
+
1.12,
|
|
3524
|
+
0.45,
|
|
3525
|
+
-1.12,
|
|
3526
|
+
2,
|
|
3527
|
+
0.45,
|
|
3528
|
+
0,
|
|
3529
|
+
2,
|
|
3530
|
+
0.45,
|
|
3531
|
+
-1.5,
|
|
3532
|
+
0.84,
|
|
3533
|
+
0.225,
|
|
3534
|
+
-0.84,
|
|
3535
|
+
1.5,
|
|
3536
|
+
0.225,
|
|
3537
|
+
0,
|
|
3538
|
+
1.5,
|
|
3539
|
+
0.225,
|
|
3540
|
+
-1.5,
|
|
3541
|
+
0.84,
|
|
3542
|
+
0.15,
|
|
3543
|
+
-0.84,
|
|
3544
|
+
1.5,
|
|
3545
|
+
0.15,
|
|
3546
|
+
0,
|
|
3547
|
+
1.5,
|
|
3548
|
+
0.15,
|
|
3549
|
+
1.12,
|
|
3550
|
+
2,
|
|
3551
|
+
0.45,
|
|
3552
|
+
2,
|
|
3553
|
+
1.12,
|
|
3554
|
+
0.45,
|
|
3555
|
+
0.84,
|
|
3556
|
+
1.5,
|
|
3557
|
+
0.225,
|
|
3558
|
+
1.5,
|
|
3559
|
+
0.84,
|
|
3560
|
+
0.225,
|
|
3561
|
+
0.84,
|
|
3562
|
+
1.5,
|
|
3563
|
+
0.15,
|
|
3564
|
+
1.5,
|
|
3565
|
+
0.84,
|
|
3566
|
+
0.15,
|
|
3567
|
+
-1.6,
|
|
3568
|
+
0,
|
|
3569
|
+
2.025,
|
|
3570
|
+
-1.6,
|
|
3571
|
+
-0.3,
|
|
3572
|
+
2.025,
|
|
3573
|
+
-1.5,
|
|
3574
|
+
-0.3,
|
|
3575
|
+
2.25,
|
|
3576
|
+
-1.5,
|
|
3577
|
+
0,
|
|
3578
|
+
2.25,
|
|
3579
|
+
-2.3,
|
|
3580
|
+
0,
|
|
3581
|
+
2.025,
|
|
3582
|
+
-2.3,
|
|
3583
|
+
-0.3,
|
|
3584
|
+
2.025,
|
|
3585
|
+
-2.5,
|
|
3586
|
+
-0.3,
|
|
3587
|
+
2.25,
|
|
3588
|
+
-2.5,
|
|
3589
|
+
0,
|
|
3590
|
+
2.25,
|
|
3591
|
+
-2.7,
|
|
3592
|
+
0,
|
|
3593
|
+
2.025,
|
|
3594
|
+
-2.7,
|
|
3595
|
+
-0.3,
|
|
3596
|
+
2.025,
|
|
3597
|
+
-3,
|
|
3598
|
+
-0.3,
|
|
3599
|
+
2.25,
|
|
3600
|
+
-3,
|
|
3601
|
+
0,
|
|
3602
|
+
2.25,
|
|
3603
|
+
-2.7,
|
|
3604
|
+
0,
|
|
3605
|
+
1.8,
|
|
3606
|
+
-2.7,
|
|
3607
|
+
-0.3,
|
|
3608
|
+
1.8,
|
|
3609
|
+
-3,
|
|
3610
|
+
-0.3,
|
|
3611
|
+
1.8,
|
|
3612
|
+
-3,
|
|
3613
|
+
0,
|
|
3614
|
+
1.8,
|
|
3615
|
+
-1.5,
|
|
3616
|
+
0.3,
|
|
3617
|
+
2.25,
|
|
3618
|
+
-1.6,
|
|
3619
|
+
0.3,
|
|
3620
|
+
2.025,
|
|
3621
|
+
-2.5,
|
|
3622
|
+
0.3,
|
|
3623
|
+
2.25,
|
|
3624
|
+
-2.3,
|
|
3625
|
+
0.3,
|
|
3626
|
+
2.025,
|
|
3627
|
+
-3,
|
|
3628
|
+
0.3,
|
|
3629
|
+
2.25,
|
|
3630
|
+
-2.7,
|
|
3631
|
+
0.3,
|
|
3632
|
+
2.025,
|
|
3633
|
+
-3,
|
|
3634
|
+
0.3,
|
|
3635
|
+
1.8,
|
|
3636
|
+
-2.7,
|
|
3637
|
+
0.3,
|
|
3638
|
+
1.8,
|
|
3639
|
+
-2.7,
|
|
3640
|
+
0,
|
|
3641
|
+
1.575,
|
|
3642
|
+
-2.7,
|
|
3643
|
+
-0.3,
|
|
3644
|
+
1.575,
|
|
3645
|
+
-3,
|
|
3646
|
+
-0.3,
|
|
3647
|
+
1.35,
|
|
3648
|
+
-3,
|
|
3649
|
+
0,
|
|
3650
|
+
1.35,
|
|
3651
|
+
-2.5,
|
|
3652
|
+
0,
|
|
3653
|
+
1.125,
|
|
3654
|
+
-2.5,
|
|
3655
|
+
-0.3,
|
|
3656
|
+
1.125,
|
|
3657
|
+
-2.65,
|
|
3658
|
+
-0.3,
|
|
3659
|
+
0.9375,
|
|
3660
|
+
-2.65,
|
|
3661
|
+
0,
|
|
3662
|
+
0.9375,
|
|
3663
|
+
-2,
|
|
3664
|
+
-0.3,
|
|
3665
|
+
0.9,
|
|
3666
|
+
-1.9,
|
|
3667
|
+
-0.3,
|
|
3668
|
+
0.6,
|
|
3669
|
+
-1.9,
|
|
3670
|
+
0,
|
|
3671
|
+
0.6,
|
|
3672
|
+
-3,
|
|
3673
|
+
0.3,
|
|
3674
|
+
1.35,
|
|
3675
|
+
-2.7,
|
|
3676
|
+
0.3,
|
|
3677
|
+
1.575,
|
|
3678
|
+
-2.65,
|
|
3679
|
+
0.3,
|
|
3680
|
+
0.9375,
|
|
3681
|
+
-2.5,
|
|
3682
|
+
0.3,
|
|
3683
|
+
1.125,
|
|
3684
|
+
-1.9,
|
|
3685
|
+
0.3,
|
|
3686
|
+
0.6,
|
|
3687
|
+
-2,
|
|
3688
|
+
0.3,
|
|
3689
|
+
0.9,
|
|
3690
|
+
1.7,
|
|
3691
|
+
0,
|
|
3692
|
+
1.425,
|
|
3693
|
+
1.7,
|
|
3694
|
+
-0.66,
|
|
3695
|
+
1.425,
|
|
3696
|
+
1.7,
|
|
3697
|
+
-0.66,
|
|
3698
|
+
0.6,
|
|
3699
|
+
1.7,
|
|
3700
|
+
0,
|
|
3701
|
+
0.6,
|
|
3702
|
+
2.6,
|
|
3703
|
+
0,
|
|
3704
|
+
1.425,
|
|
3705
|
+
2.6,
|
|
3706
|
+
-0.66,
|
|
3707
|
+
1.425,
|
|
3708
|
+
3.1,
|
|
3709
|
+
-0.66,
|
|
3710
|
+
0.825,
|
|
3711
|
+
3.1,
|
|
3712
|
+
0,
|
|
3713
|
+
0.825,
|
|
3714
|
+
2.3,
|
|
3715
|
+
0,
|
|
3716
|
+
2.1,
|
|
3717
|
+
2.3,
|
|
3718
|
+
-0.25,
|
|
3719
|
+
2.1,
|
|
3720
|
+
2.4,
|
|
3721
|
+
-0.25,
|
|
3722
|
+
2.025,
|
|
3723
|
+
2.4,
|
|
3724
|
+
0,
|
|
3725
|
+
2.025,
|
|
3726
|
+
2.7,
|
|
3727
|
+
0,
|
|
3728
|
+
2.4,
|
|
3729
|
+
2.7,
|
|
3730
|
+
-0.25,
|
|
3731
|
+
2.4,
|
|
3732
|
+
3.3,
|
|
3733
|
+
-0.25,
|
|
3734
|
+
2.4,
|
|
3735
|
+
3.3,
|
|
3736
|
+
0,
|
|
3737
|
+
2.4,
|
|
3738
|
+
1.7,
|
|
3739
|
+
0.66,
|
|
3740
|
+
0.6,
|
|
3741
|
+
1.7,
|
|
3742
|
+
0.66,
|
|
3743
|
+
1.425,
|
|
3744
|
+
3.1,
|
|
3745
|
+
0.66,
|
|
3746
|
+
0.825,
|
|
3747
|
+
2.6,
|
|
3748
|
+
0.66,
|
|
3749
|
+
1.425,
|
|
3750
|
+
2.4,
|
|
3751
|
+
0.25,
|
|
3752
|
+
2.025,
|
|
3753
|
+
2.3,
|
|
3754
|
+
0.25,
|
|
3755
|
+
2.1,
|
|
3756
|
+
3.3,
|
|
3757
|
+
0.25,
|
|
3758
|
+
2.4,
|
|
3759
|
+
2.7,
|
|
3760
|
+
0.25,
|
|
3761
|
+
2.4,
|
|
3762
|
+
2.8,
|
|
3763
|
+
0,
|
|
3764
|
+
2.475,
|
|
3765
|
+
2.8,
|
|
3766
|
+
-0.25,
|
|
3767
|
+
2.475,
|
|
3768
|
+
3.525,
|
|
3769
|
+
-0.25,
|
|
3770
|
+
2.49375,
|
|
3771
|
+
3.525,
|
|
3772
|
+
0,
|
|
3773
|
+
2.49375,
|
|
3774
|
+
2.9,
|
|
3775
|
+
0,
|
|
3776
|
+
2.475,
|
|
3777
|
+
2.9,
|
|
3778
|
+
-0.15,
|
|
3779
|
+
2.475,
|
|
3780
|
+
3.45,
|
|
3781
|
+
-0.15,
|
|
3782
|
+
2.5125,
|
|
3783
|
+
3.45,
|
|
3784
|
+
0,
|
|
3785
|
+
2.5125,
|
|
3786
|
+
2.8,
|
|
3787
|
+
0,
|
|
3788
|
+
2.4,
|
|
3789
|
+
2.8,
|
|
3790
|
+
-0.15,
|
|
3791
|
+
2.4,
|
|
3792
|
+
3.2,
|
|
3793
|
+
-0.15,
|
|
3794
|
+
2.4,
|
|
3795
|
+
3.2,
|
|
3796
|
+
0,
|
|
3797
|
+
2.4,
|
|
3798
|
+
3.525,
|
|
3799
|
+
0.25,
|
|
3800
|
+
2.49375,
|
|
3801
|
+
2.8,
|
|
3802
|
+
0.25,
|
|
3803
|
+
2.475,
|
|
3804
|
+
3.45,
|
|
3805
|
+
0.15,
|
|
3806
|
+
2.5125,
|
|
3807
|
+
2.9,
|
|
3808
|
+
0.15,
|
|
3809
|
+
2.475,
|
|
3810
|
+
3.2,
|
|
3811
|
+
0.15,
|
|
3812
|
+
2.4,
|
|
3813
|
+
2.8,
|
|
3814
|
+
0.15,
|
|
3815
|
+
2.4,
|
|
3816
|
+
0,
|
|
3817
|
+
0,
|
|
3818
|
+
3.15,
|
|
3819
|
+
0.8,
|
|
3820
|
+
0,
|
|
3821
|
+
3.15,
|
|
3822
|
+
0.8,
|
|
3823
|
+
-0.45,
|
|
3824
|
+
3.15,
|
|
3825
|
+
0.45,
|
|
3826
|
+
-0.8,
|
|
3827
|
+
3.15,
|
|
3828
|
+
0,
|
|
3829
|
+
-0.8,
|
|
3830
|
+
3.15,
|
|
3831
|
+
0,
|
|
3832
|
+
0,
|
|
3833
|
+
2.85,
|
|
3834
|
+
0.2,
|
|
3835
|
+
0,
|
|
3836
|
+
2.7,
|
|
3837
|
+
0.2,
|
|
3838
|
+
-0.112,
|
|
3839
|
+
2.7,
|
|
3840
|
+
0.112,
|
|
3841
|
+
-0.2,
|
|
3842
|
+
2.7,
|
|
3843
|
+
0,
|
|
3844
|
+
-0.2,
|
|
3845
|
+
2.7,
|
|
3846
|
+
-0.45,
|
|
3847
|
+
-0.8,
|
|
3848
|
+
3.15,
|
|
3849
|
+
-0.8,
|
|
3850
|
+
-0.45,
|
|
3851
|
+
3.15,
|
|
3852
|
+
-0.8,
|
|
3853
|
+
0,
|
|
3854
|
+
3.15,
|
|
3855
|
+
-0.112,
|
|
3856
|
+
-0.2,
|
|
3857
|
+
2.7,
|
|
3858
|
+
-0.2,
|
|
3859
|
+
-0.112,
|
|
3860
|
+
2.7,
|
|
3861
|
+
-0.2,
|
|
3862
|
+
0,
|
|
3863
|
+
2.7,
|
|
3864
|
+
-0.8,
|
|
3865
|
+
0.45,
|
|
3866
|
+
3.15,
|
|
3867
|
+
-0.45,
|
|
3868
|
+
0.8,
|
|
3869
|
+
3.15,
|
|
3870
|
+
0,
|
|
3871
|
+
0.8,
|
|
3872
|
+
3.15,
|
|
3873
|
+
-0.2,
|
|
3874
|
+
0.112,
|
|
3875
|
+
2.7,
|
|
3876
|
+
-0.112,
|
|
3877
|
+
0.2,
|
|
3878
|
+
2.7,
|
|
3879
|
+
0,
|
|
3880
|
+
0.2,
|
|
3881
|
+
2.7,
|
|
3882
|
+
0.45,
|
|
3883
|
+
0.8,
|
|
3884
|
+
3.15,
|
|
3885
|
+
0.8,
|
|
3886
|
+
0.45,
|
|
3887
|
+
3.15,
|
|
3888
|
+
0.112,
|
|
3889
|
+
0.2,
|
|
3890
|
+
2.7,
|
|
3891
|
+
0.2,
|
|
3892
|
+
0.112,
|
|
3893
|
+
2.7,
|
|
3894
|
+
0.4,
|
|
3895
|
+
0,
|
|
3896
|
+
2.55,
|
|
3897
|
+
0.4,
|
|
3898
|
+
-0.224,
|
|
3899
|
+
2.55,
|
|
3900
|
+
0.224,
|
|
3901
|
+
-0.4,
|
|
3902
|
+
2.55,
|
|
3903
|
+
0,
|
|
3904
|
+
-0.4,
|
|
3905
|
+
2.55,
|
|
3906
|
+
1.3,
|
|
3907
|
+
0,
|
|
3908
|
+
2.55,
|
|
3909
|
+
1.3,
|
|
3910
|
+
-0.728,
|
|
3911
|
+
2.55,
|
|
3912
|
+
0.728,
|
|
3913
|
+
-1.3,
|
|
3914
|
+
2.55,
|
|
3915
|
+
0,
|
|
3916
|
+
-1.3,
|
|
3917
|
+
2.55,
|
|
3918
|
+
1.3,
|
|
3919
|
+
0,
|
|
3920
|
+
2.4,
|
|
3921
|
+
1.3,
|
|
3922
|
+
-0.728,
|
|
3923
|
+
2.4,
|
|
3924
|
+
0.728,
|
|
3925
|
+
-1.3,
|
|
3926
|
+
2.4,
|
|
3927
|
+
0,
|
|
3928
|
+
-1.3,
|
|
3929
|
+
2.4,
|
|
3930
|
+
-0.224,
|
|
3931
|
+
-0.4,
|
|
3932
|
+
2.55,
|
|
3933
|
+
-0.4,
|
|
3934
|
+
-0.224,
|
|
3935
|
+
2.55,
|
|
3936
|
+
-0.4,
|
|
3937
|
+
0,
|
|
3938
|
+
2.55,
|
|
3939
|
+
-0.728,
|
|
3940
|
+
-1.3,
|
|
3941
|
+
2.55,
|
|
3942
|
+
-1.3,
|
|
3943
|
+
-0.728,
|
|
3944
|
+
2.55,
|
|
3945
|
+
-1.3,
|
|
3946
|
+
0,
|
|
3947
|
+
2.55,
|
|
3948
|
+
-0.728,
|
|
3949
|
+
-1.3,
|
|
3950
|
+
2.4,
|
|
3951
|
+
-1.3,
|
|
3952
|
+
-0.728,
|
|
3953
|
+
2.4,
|
|
3954
|
+
-1.3,
|
|
3955
|
+
0,
|
|
3956
|
+
2.4,
|
|
3957
|
+
-0.4,
|
|
3958
|
+
0.224,
|
|
3959
|
+
2.55,
|
|
3960
|
+
-0.224,
|
|
3961
|
+
0.4,
|
|
3962
|
+
2.55,
|
|
3963
|
+
0,
|
|
3964
|
+
0.4,
|
|
3965
|
+
2.55,
|
|
3966
|
+
-1.3,
|
|
3967
|
+
0.728,
|
|
3968
|
+
2.55,
|
|
3969
|
+
-0.728,
|
|
3970
|
+
1.3,
|
|
3971
|
+
2.55,
|
|
3972
|
+
0,
|
|
3973
|
+
1.3,
|
|
3974
|
+
2.55,
|
|
3975
|
+
-1.3,
|
|
3976
|
+
0.728,
|
|
3977
|
+
2.4,
|
|
3978
|
+
-0.728,
|
|
3979
|
+
1.3,
|
|
3980
|
+
2.4,
|
|
3981
|
+
0,
|
|
3982
|
+
1.3,
|
|
3983
|
+
2.4,
|
|
3984
|
+
0.224,
|
|
3985
|
+
0.4,
|
|
3986
|
+
2.55,
|
|
3987
|
+
0.4,
|
|
3988
|
+
0.224,
|
|
3989
|
+
2.55,
|
|
3990
|
+
0.728,
|
|
3991
|
+
1.3,
|
|
3992
|
+
2.55,
|
|
3993
|
+
1.3,
|
|
3994
|
+
0.728,
|
|
3995
|
+
2.55,
|
|
3996
|
+
0.728,
|
|
3997
|
+
1.3,
|
|
3998
|
+
2.4,
|
|
3999
|
+
1.3,
|
|
4000
|
+
0.728,
|
|
4001
|
+
2.4,
|
|
4002
|
+
0,
|
|
4003
|
+
0,
|
|
4004
|
+
0,
|
|
4005
|
+
1.425,
|
|
4006
|
+
0,
|
|
4007
|
+
0,
|
|
4008
|
+
1.425,
|
|
4009
|
+
0.798,
|
|
4010
|
+
0,
|
|
4011
|
+
0.798,
|
|
4012
|
+
1.425,
|
|
4013
|
+
0,
|
|
4014
|
+
0,
|
|
4015
|
+
1.425,
|
|
4016
|
+
0,
|
|
4017
|
+
1.5,
|
|
4018
|
+
0,
|
|
4019
|
+
0.075,
|
|
4020
|
+
1.5,
|
|
4021
|
+
0.84,
|
|
4022
|
+
0.075,
|
|
4023
|
+
0.84,
|
|
4024
|
+
1.5,
|
|
4025
|
+
0.075,
|
|
4026
|
+
0,
|
|
4027
|
+
1.5,
|
|
4028
|
+
0.075,
|
|
4029
|
+
-0.798,
|
|
4030
|
+
1.425,
|
|
4031
|
+
0,
|
|
4032
|
+
-1.425,
|
|
4033
|
+
0.798,
|
|
4034
|
+
0,
|
|
4035
|
+
-1.425,
|
|
4036
|
+
0,
|
|
4037
|
+
0,
|
|
4038
|
+
-0.84,
|
|
4039
|
+
1.5,
|
|
4040
|
+
0.075,
|
|
4041
|
+
-1.5,
|
|
4042
|
+
0.84,
|
|
4043
|
+
0.075,
|
|
4044
|
+
-1.5,
|
|
4045
|
+
0,
|
|
4046
|
+
0.075,
|
|
4047
|
+
-1.425,
|
|
4048
|
+
-0.798,
|
|
4049
|
+
0,
|
|
4050
|
+
-0.798,
|
|
4051
|
+
-1.425,
|
|
4052
|
+
0,
|
|
4053
|
+
0,
|
|
4054
|
+
-1.425,
|
|
4055
|
+
0,
|
|
4056
|
+
-1.5,
|
|
4057
|
+
-0.84,
|
|
4058
|
+
0.075,
|
|
4059
|
+
-0.84,
|
|
4060
|
+
-1.5,
|
|
4061
|
+
0.075,
|
|
4062
|
+
0,
|
|
4063
|
+
-1.5,
|
|
4064
|
+
0.075,
|
|
4065
|
+
0.798,
|
|
4066
|
+
-1.425,
|
|
4067
|
+
0,
|
|
4068
|
+
1.425,
|
|
4069
|
+
-0.798,
|
|
4070
|
+
0,
|
|
4071
|
+
0.84,
|
|
4072
|
+
-1.5,
|
|
4073
|
+
0.075,
|
|
4074
|
+
1.5,
|
|
4075
|
+
-0.84,
|
|
4076
|
+
0.075
|
|
4077
|
+
]);
|
|
4078
|
+
function basis(value) {
|
|
4079
|
+
const inverse = 1 - value;
|
|
4080
|
+
return [
|
|
4081
|
+
inverse * inverse * inverse,
|
|
4082
|
+
3 * value * inverse * inverse,
|
|
4083
|
+
3 * value * value * inverse,
|
|
4084
|
+
value * value * value
|
|
4085
|
+
];
|
|
4086
|
+
}
|
|
4087
|
+
function derivativeBasis(value) {
|
|
4088
|
+
const inverse = 1 - value;
|
|
4089
|
+
return [
|
|
4090
|
+
-3 * inverse * inverse,
|
|
4091
|
+
3 * inverse * inverse - 6 * value * inverse,
|
|
4092
|
+
6 * value * inverse - 3 * value * value,
|
|
4093
|
+
3 * value * value
|
|
4094
|
+
];
|
|
4095
|
+
}
|
|
4096
|
+
function evaluatePatch(surface, s, t, fitLid, blinn) {
|
|
4097
|
+
const sb = basis(s);
|
|
4098
|
+
const tb = basis(t);
|
|
4099
|
+
const dsb = derivativeBasis(s);
|
|
4100
|
+
const dtb = derivativeBasis(t);
|
|
4101
|
+
const point = [0, 0, 0];
|
|
4102
|
+
const ds = [0, 0, 0];
|
|
4103
|
+
const dt = [0, 0, 0];
|
|
4104
|
+
for (let row = 0; row < 4; row++) {
|
|
4105
|
+
for (let column = 0; column < 4; column++) {
|
|
4106
|
+
const control = PATCHES[surface * 16 + row * 4 + column] ?? 0;
|
|
4107
|
+
const source = control * 3;
|
|
4108
|
+
for (let axis = 0; axis < 3; axis++) {
|
|
4109
|
+
const lidScale = fitLid && surface >= 20 && surface < 28 && axis !== 2 ? 1.077 : 1;
|
|
4110
|
+
let value = (CONTROL_POINTS[source + axis] ?? 0) * lidScale;
|
|
4111
|
+
if (!blinn && axis === 2) value *= 1.3;
|
|
4112
|
+
const pointWeight = value * (sb[row] ?? 0) * (tb[column] ?? 0);
|
|
4113
|
+
const dsWeight = value * (dsb[row] ?? 0) * (tb[column] ?? 0);
|
|
4114
|
+
const dtWeight = value * (sb[row] ?? 0) * (dtb[column] ?? 0);
|
|
4115
|
+
point[axis] = (point[axis] ?? 0) + pointWeight;
|
|
4116
|
+
ds[axis] = (ds[axis] ?? 0) + dsWeight;
|
|
4117
|
+
dt[axis] = (dt[axis] ?? 0) + dtWeight;
|
|
4118
|
+
}
|
|
4119
|
+
}
|
|
4120
|
+
}
|
|
4121
|
+
return { point, ds, dt };
|
|
4122
|
+
}
|
|
4123
|
+
function cross2(a, b) {
|
|
4124
|
+
return [a[1] * b[2] - a[2] * b[1], a[2] * b[0] - a[0] * b[2], a[0] * b[1] - a[1] * b[0]];
|
|
4125
|
+
}
|
|
4126
|
+
function normalize(value) {
|
|
4127
|
+
const length = Math.hypot(value[0], value[1], value[2]);
|
|
4128
|
+
return length > 0 ? [value[0] / length, value[1] / length, value[2] / length] : [0, 1, 0];
|
|
4129
|
+
}
|
|
4130
|
+
function createTeapotGeometry(size = 0.8, segments = 18, bottom = true, lid = true, body = true, fitLid = true, blinn = true) {
|
|
4131
|
+
if (!Number.isFinite(size) || size <= 0 || !Number.isFinite(segments) || segments < 2) {
|
|
4132
|
+
return err(
|
|
4133
|
+
new AssetError({
|
|
4134
|
+
code: "asset-parse-failed",
|
|
4135
|
+
expected: "finite positive size and segments >= 2",
|
|
4136
|
+
hint: ASSET_ERROR_HINTS["asset-parse-failed"],
|
|
4137
|
+
detail: { field: "parameters", value: size, reason: `segments=${segments}` }
|
|
4138
|
+
})
|
|
4139
|
+
);
|
|
4140
|
+
}
|
|
4141
|
+
const steps = Math.max(2, Math.floor(segments));
|
|
4142
|
+
const maxHeight = 3.15 * (blinn ? 1 : 1.3);
|
|
4143
|
+
const maxHeight2 = maxHeight / 2;
|
|
4144
|
+
const trueSize = size / maxHeight2;
|
|
4145
|
+
const firstSurface = body ? 0 : 20;
|
|
4146
|
+
const lastSurface = bottom ? 32 : 28;
|
|
4147
|
+
const activeSurfaces = [];
|
|
4148
|
+
for (let surface = firstSurface; surface < lastSurface; surface++) {
|
|
4149
|
+
if (lid || surface < 20 || surface >= 28) activeSurfaces.push(surface);
|
|
4150
|
+
}
|
|
4151
|
+
const vertices = new Float32Array(
|
|
4152
|
+
activeSurfaces.length * (steps + 1) * (steps + 1) * FACTORY_FLOATS_PER_VERTEX
|
|
4153
|
+
);
|
|
4154
|
+
const indices = [];
|
|
4155
|
+
const stride = steps + 1;
|
|
4156
|
+
let vertex = 0;
|
|
4157
|
+
const positions = [];
|
|
4158
|
+
for (const surface of activeSurfaces) {
|
|
4159
|
+
const surfaceStart = vertex;
|
|
4160
|
+
for (let sStep = 0; sStep <= steps; sStep++) {
|
|
4161
|
+
const s = sStep / steps;
|
|
4162
|
+
for (let tStep = 0; tStep <= steps; tStep++) {
|
|
4163
|
+
const t = tStep / steps;
|
|
4164
|
+
const evaluated = evaluatePatch(surface, s, t, fitLid, blinn);
|
|
4165
|
+
const normalRaw = cross2(evaluated.dt, evaluated.ds);
|
|
4166
|
+
const normal = evaluated.point[0] === 0 && evaluated.point[1] === 0 ? [0, evaluated.point[2] > maxHeight2 ? 1 : -1, 0] : normalize([normalRaw[0], normalRaw[2], -normalRaw[1]]);
|
|
4167
|
+
const position = [
|
|
4168
|
+
Math.fround(trueSize * evaluated.point[0]),
|
|
4169
|
+
Math.fround(trueSize * (evaluated.point[2] - maxHeight2)),
|
|
4170
|
+
Math.fround(-trueSize * evaluated.point[1])
|
|
4171
|
+
];
|
|
4172
|
+
const base = vertex * FACTORY_FLOATS_PER_VERTEX;
|
|
4173
|
+
vertices[base] = position[0];
|
|
4174
|
+
vertices[base + 1] = position[1];
|
|
4175
|
+
vertices[base + 2] = position[2];
|
|
4176
|
+
vertices[base + 3] = normal[0];
|
|
4177
|
+
vertices[base + 4] = normal[1];
|
|
4178
|
+
vertices[base + 5] = normal[2];
|
|
4179
|
+
vertices[base + 6] = 1 - t;
|
|
4180
|
+
vertices[base + 7] = 1 - s;
|
|
4181
|
+
positions.push(position);
|
|
4182
|
+
vertex++;
|
|
4183
|
+
}
|
|
4184
|
+
}
|
|
4185
|
+
for (let sStep = 0; sStep < steps; sStep++) {
|
|
4186
|
+
for (let tStep = 0; tStep < steps; tStep++) {
|
|
4187
|
+
const v1 = surfaceStart + sStep * stride + tStep;
|
|
4188
|
+
const v2 = v1 + 1;
|
|
4189
|
+
const v3 = v2 + stride;
|
|
4190
|
+
const v4 = v1 + stride;
|
|
4191
|
+
const same = (a, b) => positions[a]?.[0] === positions[b]?.[0] && positions[a]?.[1] === positions[b]?.[1] && positions[a]?.[2] === positions[b]?.[2];
|
|
4192
|
+
if (!same(v1, v2) && !same(v1, v3) && !same(v2, v3)) indices.push(v1, v2, v3);
|
|
4193
|
+
if (!same(v1, v3) && !same(v1, v4) && !same(v3, v4)) indices.push(v1, v3, v4);
|
|
4194
|
+
}
|
|
4195
|
+
}
|
|
4196
|
+
}
|
|
4197
|
+
const mesh = meshFromInterleaved(vertices, new Uint32Array(indices));
|
|
4198
|
+
if (!mesh.ok) return mesh;
|
|
4199
|
+
return ok({
|
|
4200
|
+
...mesh.value,
|
|
4201
|
+
provenance: {
|
|
4202
|
+
source: "three.js",
|
|
4203
|
+
commit: "ad005397bbd15b0a9fcd5159c782eba56e1cba2a",
|
|
4204
|
+
path: "examples/jsm/geometries/TeapotGeometry.js",
|
|
4205
|
+
license: "MIT"
|
|
4206
|
+
}
|
|
4207
|
+
});
|
|
4208
|
+
}
|
|
2328
4209
|
function createTorusGeometry(radius, tube, radialSegments = 8, tubularSegments = 24) {
|
|
2329
4210
|
if (radius <= 0) return err(degenerate(`radius=${radius}`));
|
|
2330
4211
|
if (tube <= 0) return err(degenerate(`tube=${tube}`));
|
|
@@ -2384,6 +4265,6 @@ function createTorusGeometry(radius, tube, radialSegments = 8, tubularSegments =
|
|
|
2384
4265
|
return meshFromInterleaved(vertices, indices);
|
|
2385
4266
|
}
|
|
2386
4267
|
|
|
2387
|
-
export { PROCEDURAL_FLOATS_PER_VERTEX, VertexAttributePackError, buildMeshAttributeMapForUvSets, compute2dBounds, computeTangentVec4, create2dGeometry, create2dRingGeometry, createBoxGeometry, createCapsuleGeometry, createConeGeometry, createCylinderGeometry, createEdgesGeometry, createPlaneGeometry, createPrimitiveMesh, createSphereGeometry, createTorusGeometry, createWireframeGeometry, deriveVertexBufferLayout, deriveVertexBufferLayoutFromProjection, deriveVertexLayoutProjection, deriveVertexLayoutProjectionFromMask, meshAssetContribution, meshAssetDecoder, meshAssetKind, meshFromInterleaved, packInterleavedVertexAttributes };
|
|
4268
|
+
export { PROCEDURAL_FLOATS_PER_VERTEX, VertexAttributePackError, buildMeshAttributeMapForUvSets, compute2dBounds, computeTangentVec4, create2dGeometry, create2dRingGeometry, createBoxGeometry, createCapsuleGeometry, createConeGeometry, createCylinderGeometry, createEdgesGeometry, createMeshBuilder, createPlaneGeometry, createPrimitiveMesh, createSphereGeometry, createTeapotGeometry, createTorusGeometry, createWireframeGeometry, deriveVertexBufferLayout, deriveVertexBufferLayoutFromProjection, deriveVertexLayoutProjection, deriveVertexLayoutProjectionFromMask, meshAssetContribution, meshAssetDecoder, meshAssetKind, meshFromInterleaved, packInterleavedVertexAttributes };
|
|
2388
4269
|
//# sourceMappingURL=index.mjs.map
|
|
2389
4270
|
//# sourceMappingURL=index.mjs.map
|