Restore WebGL book quality settings
This commit is contained in:
@@ -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);
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user