Restore WebGL book quality settings

This commit is contained in:
2026-06-07 11:13:05 +02:00
parent 777e39a650
commit 1b593c8c7b
6 changed files with 247 additions and 69 deletions
+43 -5
View File
@@ -4,6 +4,10 @@ export const PROCEDURAL_BOOK = {
PAGE_COUNT_MIN: 40,
PAGE_COUNT_MAX: 500,
PAGE_COUNT_STEP: 10,
TRIM_WIDTH_IN: 4.25,
TRIM_HEIGHT_IN: 6.87,
PAPER_CALIPER_MM: 0.097,
PAGES_PER_BUNDLE: 10,
PAGE_LINE_SEGMENTS: 48,
PAGE_DEPTH: 2.24,
PAGE_WIDTH: 2.24 * (4.25 / 6.87),
@@ -16,11 +20,16 @@ export const PROCEDURAL_BOOK = {
raisedHingeY: 0.056,
paperContactOffset: 0.0012,
singlePageCoverGap: 0.006,
bundleSpacing: 0.014
bundleSpacing: 0.0062
}
};
PROCEDURAL_BOOK.PAGE_SPLINE_LENGTH = PROCEDURAL_BOOK.PAGE_WIDTH;
PROCEDURAL_BOOK.COVER_OVERHANG = (PROCEDURAL_BOOK.COVER_DEPTH - PROCEDURAL_BOOK.PAGE_DEPTH) * 0.5;
PROCEDURAL_BOOK.MODEL_UNITS_PER_INCH = PROCEDURAL_BOOK.PAGE_DEPTH / PROCEDURAL_BOOK.TRIM_HEIGHT_IN;
PROCEDURAL_BOOK.PAPER_CALIPER_IN = PROCEDURAL_BOOK.PAPER_CALIPER_MM / 25.4;
PROCEDURAL_BOOK.SHEET_THICKNESS_MODEL = PROCEDURAL_BOOK.PAPER_CALIPER_IN * PROCEDURAL_BOOK.MODEL_UNITS_PER_INCH;
PROCEDURAL_BOOK.BUNDLE_SHEET_COUNT = PROCEDURAL_BOOK.PAGES_PER_BUNDLE / 2;
PROCEDURAL_BOOK.BUNDLE_THICKNESS_MODEL = PROCEDURAL_BOOK.SHEET_THICKNESS_MODEL * PROCEDURAL_BOOK.BUNDLE_SHEET_COUNT;
export function snapProceduralPageCount(value) {
const parsed = Number.parseFloat(value);
@@ -32,6 +41,33 @@ export function snapProceduralPageCount(value) {
);
}
export function calculateProceduralBookThickness(pageCountValue) {
const pageCount = snapProceduralPageCount(pageCountValue);
const sheetCount = Math.max(1, pageCount / 2);
const bundleCount = Math.max(4, Math.round(pageCount / PROCEDURAL_BOOK.PAGES_PER_BUNDLE));
const sheetThicknessIn = PROCEDURAL_BOOK.PAPER_CALIPER_IN;
const sheetThicknessModel = PROCEDURAL_BOOK.SHEET_THICKNESS_MODEL;
const bundleSheetCount = PROCEDURAL_BOOK.BUNDLE_SHEET_COUNT;
const bundleThicknessIn = sheetThicknessIn * bundleSheetCount;
const bundleThicknessModel = sheetThicknessModel * bundleSheetCount;
const textBlockThicknessIn = sheetThicknessIn * sheetCount;
const textBlockThicknessModel = sheetThicknessModel * sheetCount;
return {
pageCount,
sheetCount,
bundleCount,
sheetThicknessIn,
sheetThicknessModel,
bundleSheetCount,
bundleThicknessIn,
bundleThicknessModel,
tenPageStackThicknessIn: bundleThicknessIn,
tenPageStackThicknessModel: bundleThicknessModel,
textBlockThicknessIn,
textBlockThicknessModel
};
}
export function createProceduralBookModel(options = {}) {
const context = createBookContext(options);
const group = new THREE.Group();
@@ -104,7 +140,8 @@ function calculateBookModel(context) {
const pageWidth = PROCEDURAL_BOOK.PAGE_WIDTH;
const pageDepth = PROCEDURAL_BOOK.PAGE_DEPTH;
const coverDepth = PROCEDURAL_BOOK.COVER_DEPTH;
const bundleCount = Math.max(4, Math.round(context.pageCount / 10));
const thickness = calculateProceduralBookThickness(context.pageCount);
const bundleCount = thickness.bundleCount;
const spineWidth = calculateSpineWidth(bundleCount);
const leftCount = calculateLeftBundleCount(context, bundleCount);
const spineHalf = spineArcHalf(spineWidth);
@@ -125,6 +162,7 @@ function calculateBookModel(context) {
coverOuterX,
bundleSpacing,
leftCount,
thickness,
lines
};
}
@@ -872,9 +910,9 @@ function pointAtMeasuredPathDistance(support, distance) {
function calculateSpineWidth(bundleCount) {
const minimumWidth = 0.006;
if (bundleCount <= 1) return minimumWidth;
const targetArcLength = (bundleCount - 1) * PROCEDURAL_BOOK.PROFILE.bundleSpacing + PROCEDURAL_BOOK.OPEN_SEAM_GAP;
const targetArcLength = (bundleCount - 1) * PROCEDURAL_BOOK.BUNDLE_THICKNESS_MODEL + PROCEDURAL_BOOK.OPEN_SEAM_GAP;
let low = minimumWidth;
let high = Math.max(minimumWidth, bundleCount * PROCEDURAL_BOOK.PROFILE.bundleSpacing * 1.4);
let high = Math.max(minimumWidth, bundleCount * PROCEDURAL_BOOK.BUNDLE_THICKNESS_MODEL * 1.4);
while (measureSpineArcLength(high) < targetArcLength) high *= 1.25;
for (let i = 0; i < 24; i += 1) {
const mid = (low + high) * 0.5;
@@ -887,7 +925,7 @@ function calculateSpineWidth(bundleCount) {
function calculateBundleSpacing(bundleCount, spineWidth, leftCount) {
const rightCount = bundleCount - leftCount;
const stackIntervals = Math.max(0, leftCount - 1) + Math.max(0, rightCount - 1);
if (stackIntervals <= 0) return PROCEDURAL_BOOK.PROFILE.bundleSpacing;
if (stackIntervals <= 0) return PROCEDURAL_BOOK.BUNDLE_THICKNESS_MODEL;
return Math.max(0.001, (measureSpineArcLength(spineWidth) - PROCEDURAL_BOOK.OPEN_SEAM_GAP) / stackIntervals);
}