Compare commits
3 Commits
3acfaa3795
...
25df114b93
| Author | SHA1 | Date | |
|---|---|---|---|
| 25df114b93 | |||
| 96e95ae155 | |||
| b4595d3125 |
@@ -5869,7 +5869,7 @@ iframe.preview-frame {
|
||||
height: var(--resource-card-height);
|
||||
min-height: var(--resource-card-height);
|
||||
padding: 0;
|
||||
overflow: hidden;
|
||||
overflow: visible;
|
||||
border: 1px solid #eadbd4;
|
||||
border-radius: 12px;
|
||||
background: #fff;
|
||||
@@ -5912,6 +5912,7 @@ iframe.preview-frame {
|
||||
inset: 0;
|
||||
display: grid;
|
||||
overflow: hidden;
|
||||
border-radius: inherit;
|
||||
background: linear-gradient(145deg, #fffaf6, #f6ece6);
|
||||
color: #c46a40;
|
||||
place-items: center;
|
||||
@@ -5982,12 +5983,6 @@ iframe.preview-frame {
|
||||
transform-origin: bottom right;
|
||||
}
|
||||
|
||||
.game-resource-card-placeholder > svg *,
|
||||
.game-resource-card-version-visual > svg *,
|
||||
.game-resource-card-audio-visual > svg * {
|
||||
stroke-width: calc(2px * var(--genarrative-image-canvas-inverse-scale, 1));
|
||||
}
|
||||
|
||||
.game-resource-card-open {
|
||||
position: absolute;
|
||||
z-index: 1;
|
||||
|
||||
@@ -7,6 +7,7 @@ import type { CSSProperties, HTMLAttributes, ReactNode } from 'react';
|
||||
import {
|
||||
CANVAS_RENDER_SUPERSAMPLE,
|
||||
canvasViewportToWorldTransform,
|
||||
getSafeViewportScale,
|
||||
} from './canvasWorldRendering';
|
||||
|
||||
export function CanvasWorld({
|
||||
@@ -21,8 +22,7 @@ export function CanvasWorld({
|
||||
viewport: CanvasViewport;
|
||||
worldSize?: number;
|
||||
}) {
|
||||
const viewportScale =
|
||||
Number.isFinite(viewport.scale) && viewport.scale > 0 ? viewport.scale : 1;
|
||||
const viewportScale = getSafeViewportScale(viewport);
|
||||
|
||||
return (
|
||||
<div
|
||||
|
||||
@@ -2,9 +2,15 @@ import type { CanvasViewport } from '@genarrative/image-canvas-core';
|
||||
|
||||
export const CANVAS_RENDER_SUPERSAMPLE = 2;
|
||||
|
||||
/** 将 viewport scale 规范化为可用于渲染和反向缩放的正有限值。 */
|
||||
export function getSafeViewportScale(viewport: CanvasViewport) {
|
||||
return Number.isFinite(viewport.scale) && viewport.scale > 0
|
||||
? viewport.scale
|
||||
: 1;
|
||||
}
|
||||
|
||||
/** 将逻辑 viewport 转换为 world 的渲染 transform。 */
|
||||
export function canvasViewportToWorldTransform(viewport: CanvasViewport) {
|
||||
const scale =
|
||||
Number.isFinite(viewport.scale) && viewport.scale > 0 ? viewport.scale : 1;
|
||||
const scale = getSafeViewportScale(viewport);
|
||||
return `translate(${viewport.x}px, ${viewport.y}px) scale(${scale / CANVAS_RENDER_SUPERSAMPLE})`;
|
||||
}
|
||||
|
||||
@@ -2,7 +2,10 @@ export * from './CanvasChrome';
|
||||
export * from './CanvasPortal';
|
||||
export * from './CanvasViewport';
|
||||
export * from './CanvasWorld';
|
||||
export { canvasViewportToWorldTransform } from './canvasWorldRendering';
|
||||
export {
|
||||
canvasViewportToWorldTransform,
|
||||
getSafeViewportScale,
|
||||
} from './canvasWorldRendering';
|
||||
export * from './LayerRenderer';
|
||||
export * from './Minimap';
|
||||
export * from './SelectionOverlay';
|
||||
|
||||
Reference in New Issue
Block a user