shaders 2.5.113 → 2.5.114

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.
@@ -67,7 +67,7 @@ function Shader(allProps) {
67
67
  const checkRendering = () => {
68
68
  const stats = rendererInstance.getPerformanceStats();
69
69
  if (stats.fps > 0) {
70
- const version = "2.5.113";
70
+ const version = "2.5.114";
71
71
  telemetryCollector = startTelemetry(rendererInstance, version, props.disableTelemetry, props.isPreview);
72
72
  if (telemetryCollector) {
73
73
  telemetryCollector.start();
@@ -21540,7 +21540,7 @@ function Shader($$anchor, $$props) {
21540
21540
  const checkRendering = () => {
21541
21541
  if (!rendererInstance) return;
21542
21542
  if (rendererInstance.getPerformanceStats().fps > 0) {
21543
- telemetryCollector = startTelemetry(rendererInstance, "2.5.113", disableTelemetry(), isPreview());
21543
+ telemetryCollector = startTelemetry(rendererInstance, "2.5.114", disableTelemetry(), isPreview());
21544
21544
  if (telemetryCollector) telemetryCollector.start();
21545
21545
  telemetryStartTimeout = null;
21546
21546
  } else telemetryStartTimeout = window.setTimeout(checkRendering, 500);
@@ -60,7 +60,7 @@ var Shader_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ */ defineC
60
60
  const startTelemetryWhenReady = () => {
61
61
  const checkRendering = () => {
62
62
  if (rendererInstance.value.getPerformanceStats().fps > 0) {
63
- telemetryCollector = startTelemetry(rendererInstance.value, "2.5.113", props.disableTelemetry, props.isPreview);
63
+ telemetryCollector = startTelemetry(rendererInstance.value, "2.5.114", props.disableTelemetry, props.isPreview);
64
64
  if (telemetryCollector) telemetryCollector.start();
65
65
  telemetryStartTimeout = null;
66
66
  } else telemetryStartTimeout = setTimeout(checkRendering, 500);
@@ -112,52 +112,80 @@ var Shader_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ */ defineC
112
112
  rendererResetSignal.value++;
113
113
  }
114
114
  });
115
- const captureScreenshot = async (maxWidth = 1200) => {
116
- if (!canvasRef.value) throw new Error("Canvas not available");
115
+ const renderForCapture = async () => {
117
116
  try {
118
117
  await rendererInstance.value.renderAndWait();
119
118
  } catch (error) {
120
- console.warn("Failed to force render before screenshot:", error);
119
+ console.warn("[Shaders] Failed to force render before capture:", error);
120
+ throw error;
121
121
  }
122
- return new Promise((resolve, reject) => {
123
- const sourceCanvas = canvasRef.value;
124
- const sourceWidth = sourceCanvas.width;
125
- const sourceHeight = sourceCanvas.height;
126
- let targetWidth = sourceWidth;
127
- let targetHeight = sourceHeight;
128
- if (sourceWidth > maxWidth) {
129
- targetWidth = maxWidth;
130
- targetHeight = Math.round(sourceHeight / sourceWidth * maxWidth);
131
- }
132
- const dataUrl = sourceCanvas.toDataURL("image/png");
133
- const img = new Image();
134
- img.onload = () => {
135
- const tempCanvas = document.createElement("canvas");
136
- tempCanvas.width = targetWidth;
137
- tempCanvas.height = targetHeight;
138
- const ctx = tempCanvas.getContext("2d");
139
- if (!ctx) {
140
- reject(/* @__PURE__ */ new Error("Failed to get canvas context"));
141
- return;
142
- }
143
- ctx.drawImage(img, 0, 0, targetWidth, targetHeight);
144
- tempCanvas.toBlob((blob) => {
145
- if (blob) resolve(blob);
146
- else reject(/* @__PURE__ */ new Error("Failed to capture screenshot"));
147
- }, "image/jpeg", .85);
148
- };
149
- img.onerror = () => {
150
- reject(/* @__PURE__ */ new Error("Failed to load canvas image"));
151
- };
152
- img.src = dataUrl;
153
- });
122
+ };
123
+ const canvasToBlob = (source, targetWidth, targetHeight, mimeType, quality) => new Promise((resolve, reject) => {
124
+ const tempCanvas = document.createElement("canvas");
125
+ tempCanvas.width = targetWidth;
126
+ tempCanvas.height = targetHeight;
127
+ const ctx = tempCanvas.getContext("2d");
128
+ if (!ctx) {
129
+ reject(/* @__PURE__ */ new Error("Failed to get canvas context"));
130
+ return;
131
+ }
132
+ ctx.imageSmoothingEnabled = true;
133
+ ctx.imageSmoothingQuality = "high";
134
+ ctx.drawImage(source, 0, 0, targetWidth, targetHeight);
135
+ tempCanvas.toBlob((blob) => {
136
+ if (blob) resolve(blob);
137
+ else reject(/* @__PURE__ */ new Error("Failed to encode image"));
138
+ }, mimeType, quality);
139
+ });
140
+ const captureImage = async (options = {}) => {
141
+ if (!canvasRef.value) throw new Error("Canvas not available");
142
+ await renderForCapture();
143
+ const source = canvasRef.value;
144
+ const format = options.format ?? "png";
145
+ const scale = Math.max(.1, options.scale ?? 1);
146
+ return canvasToBlob(source, Math.round(source.width * scale), Math.round(source.height * scale), format === "png" ? "image/png" : format === "webp" ? "image/webp" : "image/jpeg", format === "png" ? void 0 : options.quality ?? .95);
147
+ };
148
+ const captureScreenshot = async (maxWidth = 1200) => {
149
+ if (!canvasRef.value) throw new Error("Canvas not available");
150
+ await renderForCapture();
151
+ const source = canvasRef.value;
152
+ const sourceWidth = source.width;
153
+ const sourceHeight = source.height;
154
+ let targetWidth = sourceWidth;
155
+ let targetHeight = sourceHeight;
156
+ if (sourceWidth > maxWidth) {
157
+ targetWidth = maxWidth;
158
+ targetHeight = Math.round(sourceHeight / sourceWidth * maxWidth);
159
+ }
160
+ return canvasToBlob(source, targetWidth, targetHeight, "image/jpeg", .85);
154
161
  };
155
162
  const getPerformanceStats = () => {
156
163
  return rendererInstance.value.getPerformanceStats();
157
164
  };
165
+ const beginRecordingResolution = async (pixelRatio) => {
166
+ const internal = rendererInstance.value.getInternalRenderer();
167
+ if (!internal || !canvasRef.value) return async () => {};
168
+ const previousRatio = typeof internal.getPixelRatio === "function" ? internal.getPixelRatio() : Math.min(window.devicePixelRatio, 2);
169
+ const cssWidth = canvasRef.value.clientWidth;
170
+ const cssHeight = canvasRef.value.clientHeight;
171
+ const applyRatio = async (ratio) => {
172
+ internal.setPixelRatio(ratio);
173
+ if (typeof internal.setSize === "function") internal.setSize(cssWidth, cssHeight, false);
174
+ await renderForCapture();
175
+ };
176
+ const previousForce = rendererInstance.value.setForceFullFrameRate?.(true) ?? false;
177
+ await applyRatio(pixelRatio);
178
+ return async () => {
179
+ await applyRatio(previousRatio);
180
+ rendererInstance.value.setForceFullFrameRate?.(previousForce);
181
+ };
182
+ };
158
183
  __expose({
184
+ captureImage,
159
185
  captureScreenshot,
160
- getPerformanceStats
186
+ getPerformanceStats,
187
+ beginRecordingResolution,
188
+ getCanvas: () => canvasRef.value
161
189
  });
162
190
  onBeforeUnmount(() => {
163
191
  if (telemetryCollector) {
@@ -4,6 +4,13 @@ interface Props {
4
4
  colorSpace?: 'p3-linear' | 'srgb';
5
5
  isPreview?: boolean;
6
6
  }
7
+ type CaptureFormat = 'png' | 'jpeg' | 'webp';
8
+ interface CaptureImageOptions {
9
+ format?: CaptureFormat;
10
+ scale?: number;
11
+ quality?: number;
12
+ maxWidth?: number;
13
+ }
7
14
  declare function __VLS_template(): {
8
15
  default?(_: {}): any;
9
16
  };
@@ -13,8 +20,11 @@ declare const __VLS_component: import('vue').DefineComponent<import('vue').Extra
13
20
  colorSpace: string;
14
21
  isPreview: boolean;
15
22
  }>>, {
23
+ captureImage: (options?: CaptureImageOptions) => Promise<Blob>;
16
24
  captureScreenshot: (maxWidth?: number) => Promise<Blob>;
17
25
  getPerformanceStats: () => import('../../core').PerformanceStats;
26
+ beginRecordingResolution: (pixelRatio: number) => Promise<() => Promise<void>>;
27
+ getCanvas: () => HTMLCanvasElement | null;
18
28
  }, {}, {}, {}, import('vue').ComponentOptionsMixin, import('vue').ComponentOptionsMixin, {
19
29
  ready: () => void;
20
30
  }, string, import('vue').PublicProps, Readonly<import('vue').ExtractPropTypes<__VLS_WithDefaults<__VLS_TypePropsToRuntimeProps<Props>, {
@@ -1 +1 @@
1
- {"version":3,"file":"Shader.vue.d.ts","sourceRoot":"","sources":["../../src/engine/Shader.vue"],"names":[],"mappings":"AAYA,UAAU,KAAK;IACb,gBAAgB,CAAC,EAAE,OAAO,CAAA;IAC1B,yBAAyB,CAAC,EAAE,OAAO,CAAA;IACnC,UAAU,CAAC,EAAE,WAAW,GAAG,MAAM,CAAA;IACjC,SAAS,CAAC,EAAE,OAAO,CAAA;CACpB;AAgUD,iBAAS,cAAc;qBAkDO,GAAG;EAKhC;AAWD,QAAA,MAAM,eAAe;;;;;;8CAlL8B,OAAO,CAAC,IAAI,CAAC;;;;;;;;;;;;gBAlNjD,WAAW,GAAG,MAAM;sBAFd,OAAO;+BACE,OAAO;eAEvB,OAAO;4EA2YnB,CAAC;wBACkB,uBAAuB,CAAC,OAAO,eAAe,EAAE,UAAU,CAAC,OAAO,cAAc,CAAC,CAAC;AAAvG,wBAAwG;AACxG,KAAK,sBAAsB,CAAC,CAAC,IAAI,CAAC,SAAS,SAAS,GAAG,KAAK,GAAG,CAAC,CAAC;AACjE,KAAK,6BAA6B,CAAC,CAAC,IAAI;KAAG,CAAC,IAAI,MAAM,CAAC,CAAC,CAAC,GAAG,EAAE,SAAS,IAAI,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG;QAAE,IAAI,EAAE,OAAO,KAAK,EAAE,QAAQ,CAAC,sBAAsB,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA;KAAE,GAAG;QAAE,IAAI,EAAE,OAAO,KAAK,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAAC,QAAQ,EAAE,IAAI,CAAA;KAAE;CAAE,CAAC;AAC9M,KAAK,kBAAkB,CAAC,CAAC,EAAE,CAAC,IAAI;KAE1B,CAAC,IAAI,MAAM,IAAI,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,GAAG,CAAC,SAAS,MAAM,CAAC,GAAG,cAAc,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG;QACxE,OAAO,EAAE,CAAC,CAAC,CAAC,CAAC,CAAA;KACb,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;CACT,CAAC;AACN,KAAK,cAAc,CAAC,CAAC,IAAI;KAAG,CAAC,IAAI,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;CAAG,GAAG,EAAE,CAAC;AACxD,KAAK,uBAAuB,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,GAAG;IAAE,QAAO;QAClD,MAAM,EAAE,CAAC,CAAC;KACT,CAAA;CAAE,CAAC"}
1
+ {"version":3,"file":"Shader.vue.d.ts","sourceRoot":"","sources":["../../src/engine/Shader.vue"],"names":[],"mappings":"AAYA,UAAU,KAAK;IACb,gBAAgB,CAAC,EAAE,OAAO,CAAA;IAC1B,yBAAyB,CAAC,EAAE,OAAO,CAAA;IACnC,UAAU,CAAC,EAAE,WAAW,GAAG,MAAM,CAAA;IACjC,SAAS,CAAC,EAAE,OAAO,CAAA;CACpB;AAgND,KAAK,aAAa,GAAG,KAAK,GAAG,MAAM,GAAG,MAAM,CAAA;AAE5C,UAAU,mBAAmB;IAC3B,MAAM,CAAC,EAAE,aAAa,CAAA;IACtB,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAA;CAClB;AAsLD,iBAAS,cAAc;qBAkDO,GAAG;EAKhC;AAWD,QAAA,MAAM,eAAe;;;;;;6BAzMgB,mBAAmB,KAAQ,OAAO,CAAC,IAAI,CAAC;8CAsB1B,OAAO,CAAC,IAAI,CAAC;;2CAkCZ,MAAM,KAAG,OAAO,CAAC,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;;;;;;;;;;;;gBAhU1E,WAAW,GAAG,MAAM;sBAFd,OAAO;+BACE,OAAO;eAEvB,OAAO;4EAwdnB,CAAC;wBACkB,uBAAuB,CAAC,OAAO,eAAe,EAAE,UAAU,CAAC,OAAO,cAAc,CAAC,CAAC;AAAvG,wBAAwG;AACxG,KAAK,sBAAsB,CAAC,CAAC,IAAI,CAAC,SAAS,SAAS,GAAG,KAAK,GAAG,CAAC,CAAC;AACjE,KAAK,6BAA6B,CAAC,CAAC,IAAI;KAAG,CAAC,IAAI,MAAM,CAAC,CAAC,CAAC,GAAG,EAAE,SAAS,IAAI,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG;QAAE,IAAI,EAAE,OAAO,KAAK,EAAE,QAAQ,CAAC,sBAAsB,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA;KAAE,GAAG;QAAE,IAAI,EAAE,OAAO,KAAK,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAAC,QAAQ,EAAE,IAAI,CAAA;KAAE;CAAE,CAAC;AAC9M,KAAK,kBAAkB,CAAC,CAAC,EAAE,CAAC,IAAI;KAE1B,CAAC,IAAI,MAAM,IAAI,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,GAAG,CAAC,SAAS,MAAM,CAAC,GAAG,cAAc,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG;QACxE,OAAO,EAAE,CAAC,CAAC,CAAC,CAAC,CAAA;KACb,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;CACT,CAAC;AACN,KAAK,cAAc,CAAC,CAAC,IAAI;KAAG,CAAC,IAAI,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;CAAG,GAAG,EAAE,CAAC;AACxD,KAAK,uBAAuB,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,GAAG;IAAE,QAAO;QAClD,MAAM,EAAE,CAAC,CAAC;KACT,CAAA;CAAE,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "shaders",
3
- "version": "2.5.113",
3
+ "version": "2.5.114",
4
4
  "description": "Shader magic for modern frontends",
5
5
  "author": "Shader Effects Inc.",
6
6
  "homepage": "https://shaders.com/",