@plasius/gpu-camera 0.1.0
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/CHANGELOG.md +65 -0
- package/LICENSE +203 -0
- package/README.md +101 -0
- package/dist/index.cjs +685 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.js +654 -0
- package/dist/index.js.map +1 -0
- package/legal/CLA-REGISTRY.csv +2 -0
- package/legal/CLA.md +22 -0
- package/legal/CORPORATE_CLA.md +57 -0
- package/legal/INDIVIDUAL_CLA.md +91 -0
- package/package.json +71 -0
- package/src/index.d.ts +224 -0
- package/src/index.js +759 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/index.js"],"sourcesContent":["const EPSILON = 1e-6;\nconst DEFAULT_VIEWPORT = Object.freeze({\n x: 0,\n y: 0,\n width: 1,\n height: 1,\n});\n\nconst DEFAULT_UP = Object.freeze([0, 1, 0]);\n\nexport const cameraProjectionKinds = Object.freeze([\n \"perspective\",\n \"orthographic\",\n]);\n\nexport const cameraControlKinds = Object.freeze([\n \"set-look-at\",\n \"orbit\",\n \"pan\",\n \"truck\",\n \"dolly\",\n]);\n\nfunction nowMs(timeSource) {\n if (typeof timeSource === \"function\") {\n return Number(timeSource()) || Date.now();\n }\n if (typeof performance !== \"undefined\" && typeof performance.now === \"function\") {\n return performance.now();\n }\n return Date.now();\n}\n\nfunction clamp(value, min, max) {\n return Math.min(max, Math.max(min, value));\n}\n\nfunction finiteNumber(value, fallback = 0) {\n const number = Number(value);\n return Number.isFinite(number) ? number : fallback;\n}\n\nfunction cloneVec3(value, fallback = [0, 0, 0]) {\n if (!Array.isArray(value) || value.length < 3) {\n return [...fallback];\n }\n return [\n finiteNumber(value[0], fallback[0]),\n finiteNumber(value[1], fallback[1]),\n finiteNumber(value[2], fallback[2]),\n ];\n}\n\nfunction addVec3(a, b) {\n return [a[0] + b[0], a[1] + b[1], a[2] + b[2]];\n}\n\nfunction subVec3(a, b) {\n return [a[0] - b[0], a[1] - b[1], a[2] - b[2]];\n}\n\nfunction scaleVec3(vector, scalar) {\n return [vector[0] * scalar, vector[1] * scalar, vector[2] * scalar];\n}\n\nfunction dotVec3(a, b) {\n return a[0] * b[0] + a[1] * b[1] + a[2] * b[2];\n}\n\nfunction crossVec3(a, b) {\n return [\n a[1] * b[2] - a[2] * b[1],\n a[2] * b[0] - a[0] * b[2],\n a[0] * b[1] - a[1] * b[0],\n ];\n}\n\nfunction lengthVec3(vector) {\n return Math.hypot(vector[0], vector[1], vector[2]);\n}\n\nfunction normalizeVec3(vector, fallback = [0, 0, 1]) {\n const length = lengthVec3(vector);\n if (length <= EPSILON) {\n return [...fallback];\n }\n return [vector[0] / length, vector[1] / length, vector[2] / length];\n}\n\nfunction cloneViewport(viewport = DEFAULT_VIEWPORT) {\n return {\n x: clamp(finiteNumber(viewport.x, DEFAULT_VIEWPORT.x), 0, 1),\n y: clamp(finiteNumber(viewport.y, DEFAULT_VIEWPORT.y), 0, 1),\n width: clamp(finiteNumber(viewport.width, DEFAULT_VIEWPORT.width), EPSILON, 1),\n height: clamp(finiteNumber(viewport.height, DEFAULT_VIEWPORT.height), EPSILON, 1),\n };\n}\n\nfunction normalizeProjection(projection = {}) {\n const kind = cameraProjectionKinds.includes(projection.kind)\n ? projection.kind\n : \"perspective\";\n\n if (kind === \"orthographic\") {\n const left = finiteNumber(projection.left, -1);\n const right = finiteNumber(projection.right, 1);\n const bottom = finiteNumber(projection.bottom, -1);\n const top = finiteNumber(projection.top, 1);\n const near = Math.max(EPSILON, finiteNumber(projection.near, 0.1));\n const far = Math.max(near + EPSILON, finiteNumber(projection.far, 2000));\n return {\n kind,\n left,\n right,\n bottom,\n top,\n near,\n far,\n aspect: finiteNumber(projection.aspect, 1),\n };\n }\n\n const fovY = clamp(finiteNumber(projection.fovY, 60), 1, 179);\n const near = Math.max(EPSILON, finiteNumber(projection.near, 0.1));\n const far = Math.max(near + EPSILON, finiteNumber(projection.far, 2000));\n const aspect = Math.max(EPSILON, finiteNumber(projection.aspect, 1));\n return {\n kind,\n fovY,\n near,\n far,\n aspect,\n };\n}\n\nfunction normalizeTransform(transform = {}) {\n const position = cloneVec3(transform.position, [0, 0, 5]);\n const target = cloneVec3(transform.target, [0, 0, 0]);\n const up = normalizeVec3(cloneVec3(transform.up, DEFAULT_UP), DEFAULT_UP);\n return {\n position,\n target,\n up,\n };\n}\n\nfunction cloneCamera(camera) {\n return {\n id: camera.id,\n enabled: camera.enabled,\n priority: camera.priority,\n revision: camera.revision,\n touchedAt: camera.touchedAt,\n viewport: cloneViewport(camera.viewport),\n transform: normalizeTransform(camera.transform),\n projection: normalizeProjection(camera.projection),\n metadata: camera.metadata ? { ...camera.metadata } : undefined,\n };\n}\n\nfunction assertCameraId(cameras, cameraId) {\n const camera = cameras.get(cameraId);\n if (!camera) {\n throw new Error(`Unknown camera \"${cameraId}\".`);\n }\n return camera;\n}\n\nfunction sortedCameras(cameras) {\n return [...cameras].sort((a, b) => {\n if (b.priority !== a.priority) {\n return b.priority - a.priority;\n }\n return a.id.localeCompare(b.id);\n });\n}\n\nfunction promoteActive(cameras, activeCameraId) {\n if (!activeCameraId) {\n return cameras;\n }\n const index = cameras.findIndex((camera) => camera.id === activeCameraId);\n if (index <= 0) {\n return cameras;\n }\n const promoted = [...cameras];\n const [active] = promoted.splice(index, 1);\n promoted.unshift(active);\n return promoted;\n}\n\nfunction ensureArray(value) {\n return Array.isArray(value) ? value : [];\n}\n\nfunction buildPerspectiveMatrix(projection, overrideAspect) {\n const aspect = Math.max(EPSILON, finiteNumber(overrideAspect, projection.aspect));\n const fovRad = (projection.fovY * Math.PI) / 180;\n const f = 1 / Math.tan(fovRad / 2);\n const near = projection.near;\n const far = projection.far;\n\n return new Float32Array([\n f / aspect,\n 0,\n 0,\n 0,\n 0,\n f,\n 0,\n 0,\n 0,\n 0,\n (far + near) / (near - far),\n -1,\n 0,\n 0,\n (2 * far * near) / (near - far),\n 0,\n ]);\n}\n\nfunction buildOrthographicMatrix(projection, overrideAspect) {\n const near = projection.near;\n const far = projection.far;\n const aspect = Math.max(EPSILON, finiteNumber(overrideAspect, projection.aspect || 1));\n\n let left = projection.left;\n let right = projection.right;\n let top = projection.top;\n let bottom = projection.bottom;\n\n if (finiteNumber(projection.aspect, 0) > EPSILON) {\n const scale = aspect / projection.aspect;\n left *= scale;\n right *= scale;\n }\n\n const width = Math.max(EPSILON, right - left);\n const height = Math.max(EPSILON, top - bottom);\n const depth = Math.max(EPSILON, far - near);\n\n return new Float32Array([\n 2 / width,\n 0,\n 0,\n 0,\n 0,\n 2 / height,\n 0,\n 0,\n 0,\n 0,\n -2 / depth,\n 0,\n -(right + left) / width,\n -(top + bottom) / height,\n -(far + near) / depth,\n 1,\n ]);\n}\n\nexport function buildProjectionMatrix(camera, overrideAspect) {\n const projection = normalizeProjection(camera?.projection);\n if (projection.kind === \"orthographic\") {\n return buildOrthographicMatrix(projection, overrideAspect);\n }\n return buildPerspectiveMatrix(projection, overrideAspect);\n}\n\nexport function buildViewMatrix(camera) {\n const transform = normalizeTransform(camera?.transform);\n const eye = transform.position;\n const target = transform.target;\n const up = normalizeVec3(transform.up, DEFAULT_UP);\n\n let zAxis = normalizeVec3(subVec3(eye, target), [0, 0, 1]);\n let xAxis = normalizeVec3(crossVec3(up, zAxis), [1, 0, 0]);\n let yAxis = crossVec3(zAxis, xAxis);\n\n if (lengthVec3(xAxis) <= EPSILON) {\n zAxis = [0, 0, 1];\n xAxis = [1, 0, 0];\n yAxis = [0, 1, 0];\n }\n\n return new Float32Array([\n xAxis[0],\n yAxis[0],\n zAxis[0],\n 0,\n xAxis[1],\n yAxis[1],\n zAxis[1],\n 0,\n xAxis[2],\n yAxis[2],\n zAxis[2],\n 0,\n -dotVec3(xAxis, eye),\n -dotVec3(yAxis, eye),\n -dotVec3(zAxis, eye),\n 1,\n ]);\n}\n\nexport function toCameraUniform(camera, overrideAspect) {\n const normalized = {\n transform: normalizeTransform(camera?.transform),\n projection: normalizeProjection(camera?.projection),\n };\n\n return {\n id: String(camera?.id ?? \"\"),\n viewMatrix: buildViewMatrix(normalized),\n projectionMatrix: buildProjectionMatrix(normalized, overrideAspect),\n position: new Float32Array(normalized.transform.position),\n target: new Float32Array(normalized.transform.target),\n near: normalized.projection.near,\n far: normalized.projection.far,\n projectionKind: normalized.projection.kind,\n };\n}\n\nfunction normalizeCameraDefinition(definition, generatedId) {\n const id = String(definition?.id ?? generatedId ?? \"camera\").trim();\n if (!id) {\n throw new Error(\"Camera id cannot be empty.\");\n }\n\n return {\n id,\n enabled: definition?.enabled !== false,\n priority: finiteNumber(definition?.priority, 0),\n revision: Math.max(0, Math.floor(finiteNumber(definition?.revision, 0))),\n touchedAt: finiteNumber(definition?.touchedAt, 0),\n viewport: cloneViewport(definition?.viewport),\n transform: normalizeTransform(definition?.transform),\n projection: normalizeProjection(definition?.projection),\n metadata: definition?.metadata\n ? { ...definition.metadata }\n : undefined,\n };\n}\n\nexport function applyCameraControl(camera, control, options = {}) {\n const base = normalizeCameraDefinition(camera, camera?.id ?? \"camera\");\n if (!control || typeof control !== \"object\") {\n return base;\n }\n\n const kind = String(control.type || \"\").trim();\n if (!cameraControlKinds.includes(kind)) {\n throw new Error(`Unknown camera control \"${kind}\".`);\n }\n\n const minDistance = Math.max(EPSILON, finiteNumber(options.minDistance, 0.05));\n const maxDistance = Math.max(minDistance + EPSILON, finiteNumber(options.maxDistance, 100000));\n const minPolarAngle = clamp(\n finiteNumber(options.minPolarAngle, EPSILON),\n EPSILON,\n Math.PI - EPSILON\n );\n const maxPolarAngle = clamp(\n finiteNumber(options.maxPolarAngle, Math.PI - EPSILON),\n minPolarAngle,\n Math.PI - EPSILON\n );\n\n let next = cloneCamera(base);\n\n if (kind === \"set-look-at\") {\n next.transform.position = cloneVec3(control.position, next.transform.position);\n next.transform.target = cloneVec3(control.target, next.transform.target);\n next.transform.up = normalizeVec3(cloneVec3(control.up, next.transform.up), DEFAULT_UP);\n }\n\n if (kind === \"pan\" || kind === \"truck\") {\n const delta = cloneVec3(control.delta, [0, 0, 0]);\n next.transform.position = addVec3(next.transform.position, delta);\n next.transform.target = addVec3(next.transform.target, delta);\n }\n\n if (kind === \"dolly\") {\n const distance = finiteNumber(control.distance, 0);\n const eye = next.transform.position;\n const target = next.transform.target;\n const direction = normalizeVec3(subVec3(target, eye), [0, 0, -1]);\n\n const offset = subVec3(eye, target);\n const currentRadius = Math.max(EPSILON, lengthVec3(offset));\n const nextRadius = clamp(currentRadius - distance, minDistance, maxDistance);\n const moved = subVec3(target, scaleVec3(direction, nextRadius));\n next.transform.position = moved;\n }\n\n if (kind === \"orbit\") {\n const deltaAzimuth = finiteNumber(control.deltaAzimuth, 0);\n const deltaPolar = finiteNumber(control.deltaPolar, 0);\n const radiusDelta = finiteNumber(control.radiusDelta, 0);\n\n const eye = next.transform.position;\n const target = next.transform.target;\n const offset = subVec3(eye, target);\n\n const radius = Math.max(EPSILON, lengthVec3(offset));\n const nextRadius = clamp(radius + radiusDelta, minDistance, maxDistance);\n\n const azimuth = Math.atan2(offset[0], offset[2]) + deltaAzimuth;\n const polarCurrent = Math.acos(clamp(offset[1] / radius, -1, 1));\n const polar = clamp(\n polarCurrent + deltaPolar,\n minPolarAngle,\n maxPolarAngle\n );\n\n const sinPolar = Math.sin(polar);\n const position = [\n target[0] + nextRadius * sinPolar * Math.sin(azimuth),\n target[1] + nextRadius * Math.cos(polar),\n target[2] + nextRadius * sinPolar * Math.cos(azimuth),\n ];\n\n next.transform.position = position;\n }\n\n next.revision = Math.max(base.revision + 1, next.revision);\n next.touchedAt = finiteNumber(options.touchedAt, base.touchedAt);\n return next;\n}\n\nexport function createRenderPlan(snapshot, options = {}) {\n const mode = options.mode === \"multiview\" ? \"multiview\" : \"single\";\n const enabledOnly = options.enabledOnly !== false;\n const includeMatrices = options.includeMatrices !== false;\n const maxParallelViews = Math.max(\n 1,\n Math.floor(\n finiteNumber(\n options.maxParallelViews,\n finiteNumber(snapshot?.maxParallelViews, 1)\n )\n )\n );\n\n const byId = new Map();\n const inputCameras = ensureArray(snapshot?.cameras).map((camera) =>\n normalizeCameraDefinition(camera, camera?.id)\n );\n\n for (const camera of inputCameras) {\n byId.set(camera.id, camera);\n }\n\n let selected;\n if (Array.isArray(options.cameraIds) && options.cameraIds.length > 0) {\n selected = options.cameraIds\n .map((cameraId) => byId.get(String(cameraId)))\n .filter(Boolean);\n } else {\n selected = sortedCameras(inputCameras);\n }\n\n if (enabledOnly) {\n selected = selected.filter((camera) => camera.enabled);\n }\n\n selected = promoteActive(selected, snapshot?.activeCameraId ?? null);\n\n if (mode === \"single\") {\n selected = selected.slice(0, 1);\n }\n\n const hotSet = new Set(ensureArray(snapshot?.hotCameraIds).map((id) => String(id)));\n\n const batches = [];\n for (let index = 0; index < selected.length; index += maxParallelViews) {\n const chunk = selected.slice(index, index + maxParallelViews);\n batches.push({\n index: batches.length,\n parallel: chunk.length > 1,\n views: chunk.map((camera, order) => {\n const aspect = camera.viewport.width / camera.viewport.height;\n const view = {\n cameraId: camera.id,\n order,\n priority: camera.priority,\n revision: camera.revision,\n hot: hotSet.has(camera.id),\n viewport: cloneViewport(camera.viewport),\n };\n\n if (includeMatrices) {\n view.viewMatrix = buildViewMatrix(camera);\n view.projectionMatrix = buildProjectionMatrix(camera, aspect);\n }\n\n return view;\n }),\n });\n }\n\n return {\n mode,\n generatedAt: finiteNumber(options.generatedAt, Date.now()),\n activeCameraId: snapshot?.activeCameraId ?? null,\n hotCameraIds: [...hotSet],\n maxParallelViews,\n totalViews: selected.length,\n canRenderInParallel: mode === \"multiview\" && batches.some((batch) => batch.parallel),\n batches,\n };\n}\n\nexport function createCameraManager(options = {}) {\n const listeners = new Set();\n const cameras = new Map();\n\n const maxParallelViews = Math.max(1, Math.floor(finiteNumber(options.maxParallelViews, 2)));\n const maxHotCameras = Math.max(1, Math.floor(finiteNumber(options.maxHotCameras, 3)));\n const timeSource = options.timeSource;\n\n let sequence = 0;\n let activeCameraId = null;\n let version = 0;\n let hotCameraIds = [];\n let updatedAt = nowMs(timeSource);\n\n function bumpVersion() {\n version += 1;\n updatedAt = nowMs(timeSource);\n const snapshot = getSnapshot();\n for (const listener of listeners) {\n listener(snapshot);\n }\n }\n\n function markHot(cameraId) {\n hotCameraIds = [cameraId, ...hotCameraIds.filter((id) => id !== cameraId)].slice(\n 0,\n maxHotCameras\n );\n }\n\n function selectFallbackActive() {\n const enabled = sortedCameras([...cameras.values()]).filter((camera) => camera.enabled);\n if (enabled.length > 0) {\n return enabled[0].id;\n }\n const sorted = sortedCameras([...cameras.values()]);\n return sorted.length > 0 ? sorted[0].id : null;\n }\n\n function getSnapshot() {\n const snapshot = {\n activeCameraId,\n version,\n updatedAt,\n maxParallelViews,\n maxHotCameras,\n hotCameraIds: [...hotCameraIds],\n cameras: sortedCameras([...cameras.values()]).map((camera) => cloneCamera(camera)),\n };\n return snapshot;\n }\n\n function registerCamera(definition = {}) {\n sequence += 1;\n const generatedId = `camera-${sequence}`;\n const camera = normalizeCameraDefinition(definition, generatedId);\n\n if (cameras.has(camera.id)) {\n throw new Error(`Camera \"${camera.id}\" is already registered.`);\n }\n\n camera.touchedAt = nowMs(timeSource);\n cameras.set(camera.id, camera);\n\n if (!activeCameraId) {\n activeCameraId = camera.id;\n }\n\n markHot(camera.id);\n bumpVersion();\n return cloneCamera(camera);\n }\n\n function updateCamera(cameraId, patch = {}) {\n const current = assertCameraId(cameras, cameraId);\n const next = normalizeCameraDefinition(\n {\n ...current,\n ...patch,\n id: current.id,\n transform: {\n ...current.transform,\n ...patch.transform,\n },\n projection: {\n ...current.projection,\n ...patch.projection,\n },\n viewport: {\n ...current.viewport,\n ...patch.viewport,\n },\n },\n current.id\n );\n\n next.revision = current.revision + 1;\n next.touchedAt = nowMs(timeSource);\n\n cameras.set(current.id, next);\n markHot(current.id);\n\n if (patch.makeActive === true) {\n activeCameraId = current.id;\n }\n\n bumpVersion();\n return cloneCamera(next);\n }\n\n function upsertCamera(definition = {}) {\n if (definition?.id && cameras.has(definition.id)) {\n return updateCamera(definition.id, definition);\n }\n return registerCamera(definition);\n }\n\n function removeCamera(cameraId) {\n if (!cameras.has(cameraId)) {\n return false;\n }\n\n cameras.delete(cameraId);\n hotCameraIds = hotCameraIds.filter((id) => id !== cameraId);\n\n if (activeCameraId === cameraId) {\n activeCameraId = selectFallbackActive();\n }\n\n bumpVersion();\n return true;\n }\n\n function activateCamera(cameraId) {\n const current = assertCameraId(cameras, cameraId);\n activeCameraId = current.id;\n\n const updated = cloneCamera(current);\n updated.touchedAt = nowMs(timeSource);\n cameras.set(current.id, updated);\n\n markHot(current.id);\n bumpVersion();\n return cloneCamera(updated);\n }\n\n function listCameras(listOptions = {}) {\n let next = sortedCameras([...cameras.values()]);\n if (listOptions.enabledOnly) {\n next = next.filter((camera) => camera.enabled);\n }\n return next.map((camera) => cloneCamera(camera));\n }\n\n function switchCamera(direction = 1, switchOptions = {}) {\n let list = sortedCameras([...cameras.values()]);\n if (switchOptions.enabledOnly !== false) {\n list = list.filter((camera) => camera.enabled);\n }\n\n if (list.length === 0) {\n return null;\n }\n\n const currentIndex = list.findIndex((camera) => camera.id === activeCameraId);\n const step = direction >= 0 ? 1 : -1;\n const nextIndex =\n currentIndex < 0\n ? 0\n : (currentIndex + step + list.length) % list.length;\n\n return activateCamera(list[nextIndex].id);\n }\n\n function applyControl(cameraId, control, controlOptions = {}) {\n const current = assertCameraId(cameras, cameraId);\n const touchedAt = nowMs(timeSource);\n const next = applyCameraControl(current, control, {\n ...controlOptions,\n touchedAt,\n });\n\n cameras.set(cameraId, next);\n markHot(cameraId);\n\n if (controlOptions.makeActive === true) {\n activeCameraId = cameraId;\n }\n\n bumpVersion();\n return cloneCamera(next);\n }\n\n function getCamera(cameraId) {\n const camera = cameras.get(cameraId);\n return camera ? cloneCamera(camera) : null;\n }\n\n function hasCamera(cameraId) {\n return cameras.has(cameraId);\n }\n\n function createPlan(planOptions = {}) {\n return createRenderPlan(getSnapshot(), {\n ...planOptions,\n maxParallelViews:\n planOptions.maxParallelViews ?? maxParallelViews,\n generatedAt: nowMs(timeSource),\n });\n }\n\n function subscribe(listener) {\n if (typeof listener !== \"function\") {\n throw new Error(\"Listener must be a function.\");\n }\n listeners.add(listener);\n return () => {\n listeners.delete(listener);\n };\n }\n\n function clear() {\n cameras.clear();\n activeCameraId = null;\n hotCameraIds = [];\n bumpVersion();\n }\n\n return {\n registerCamera,\n updateCamera,\n upsertCamera,\n removeCamera,\n activateCamera,\n switchCamera,\n applyControl,\n hasCamera,\n getCamera,\n listCameras,\n getSnapshot,\n createRenderPlan: createPlan,\n subscribe,\n clear,\n };\n}\n"],"mappings":"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","names":["near","far"]}
|