@footgun/cobalt 0.6.0 → 0.6.2

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 CHANGED
@@ -1,3 +1,9 @@
1
+ # 0.6.2
2
+ * use preferred canvas format in more places
3
+
4
+ # 0.6.1
5
+ * use preferred canvas format in more places
6
+
1
7
  # 0.6.0
2
8
  * use preferred canvas format in various places instead of hardcoding to bgra8unorm, which doesn't seem to work on linux
3
9
  because that defaults to bgra8unorm-srgb
package/bundle.js CHANGED
@@ -7269,10 +7269,19 @@ function createTexture(device, label, width, height, mip_count, format, usage) {
7269
7269
  };
7270
7270
  }
7271
7271
 
7272
+ // src/get-preferred-format.js
7273
+ function getPreferredFormat(cobalt) {
7274
+ if (cobalt.canvas)
7275
+ return navigator.gpu?.getPreferredCanvasFormat();
7276
+ else
7277
+ return cobalt.context.getPreferredFormat();
7278
+ }
7279
+
7272
7280
  // src/create-texture-from-url.js
7273
- async function createTextureFromUrl(c, label, url, format = "rgba8unorm") {
7281
+ async function createTextureFromUrl(c, label, url, format) {
7274
7282
  const response = await fetch(url);
7275
7283
  const blob = await response.blob();
7284
+ format = format || getPreferredFormat(c);
7276
7285
  const imageData = await createImageBitmap(
7277
7286
  blob
7278
7287
  /*, { premultiplyAlpha: 'none', resizeQuality: 'pixelated' }*/
@@ -7303,7 +7312,8 @@ async function createTextureFromUrl(c, label, url, format = "rgba8unorm") {
7303
7312
  }
7304
7313
 
7305
7314
  // src/create-texture-from-buffer.js
7306
- function createTextureFromBuffer(c, label, image, format = "rgba8unorm") {
7315
+ function createTextureFromBuffer(c, label, image, format) {
7316
+ format = format || getPreferredFormat(c);
7307
7317
  const usage = GPUTextureUsage.TEXTURE_BINDING | GPUTextureUsage.COPY_DST | GPUTextureUsage.RENDER_ATTACHMENT;
7308
7318
  const mip_count = 1;
7309
7319
  const t = createTexture(c.device, label, image.width, image.height, mip_count, format, usage);
@@ -7687,14 +7697,6 @@ function destroy(bloom_mat) {
7687
7697
  bloom_mat.bind_groups_textures.length = 0;
7688
7698
  }
7689
7699
 
7690
- // src/get-preferred-format.js
7691
- function getPreferredFormat(cobalt) {
7692
- if (cobalt.canvas)
7693
- return navigator.gpu?.getPreferredCanvasFormat();
7694
- else
7695
- return cobalt.context.getPreferredFormat();
7696
- }
7697
-
7698
7700
  // src/scene-composite/scene-composite.wgsl
7699
7701
  var scene_composite_default = `struct BloomComposite{bloom_intensity:f32,bloom_combine_constant:f32,}@group(0)@binding(0)var mySampler:sampler;@group(0)@binding(1)var colorTexture:texture_2d<f32>;@group(0)@binding(2)var emissiveTexture:texture_2d<f32>;@group(0)@binding(3)var<uniform> composite_parameter:BloomComposite;struct VertexOutput{@builtin(position)Position:vec4<f32>,@location(0)fragUV:vec2<f32>,}const positions=array<vec2<f32>,3>(vec2<f32>(-1.0,-3.0),vec2<f32>(3.0,1.0),vec2<f32>(-1.0,1.0));const uvs=array<vec2<f32>,3>(vec2<f32>(0.0,2.0),vec2<f32>(2.0,0.0),vec2<f32>(0.0,0.0));@vertex fn vert_main(@builtin(vertex_index)VertexIndex:u32)->VertexOutput{var output:VertexOutput;output.Position=vec4<f32>(positions[VertexIndex],0.0,1.0);output.fragUV=vec2<f32>(uvs[VertexIndex]);return output;}fn GTTonemap_point(x:f32)->f32{let m:f32=0.22;let a:f32=1.0;let c:f32=1.33;let P:f32=1.0;let l:f32=0.4;let l0:f32=((P-m)*l)/a;let S0:f32=m+l0;let S1:f32=m+a*l0;let C2:f32=(a*P)/(P-S1);let L:f32=m+a*(x-m);let T:f32=m*pow(x/m,c);let S:f32=P-(P-S1)*exp(-C2*(x-S0)/P);let w0:f32=1.0-smoothstep(0.0,m,x);var w2:f32=1.0;if(x<m+l){w2=0.0;}let w1:f32=1.0-w0-w2;return f32(T*w0+L*w1+S*w2);}fn GTTonemap(x:vec3<f32>)->vec3<f32>{return vec3<f32>(GTTonemap_point(x.r),GTTonemap_point(x.g),GTTonemap_point(x.b));}fn aces(x:vec3<f32>)->vec3<f32>{let a:f32=2.51;let b:f32=0.03;let c:f32=2.43;let d:f32=0.59;let e:f32=0.14;return clamp((x*(a*x+b))/(x*(c*x+d)+e),vec3<f32>(0.0),vec3<f32>(1.0));}@fragment fn frag_main(@location(0)fragUV:vec2<f32>)->@location(0)vec4<f32>{let hdr_color=textureSample(colorTexture,mySampler,fragUV);let bloom_color=textureSample(emissiveTexture,mySampler,fragUV);let combined_color=((bloom_color*composite_parameter.bloom_intensity)*composite_parameter.bloom_combine_constant);let mapped_color=GTTonemap(combined_color.rgb);let gamma_corrected_color=pow(mapped_color,vec3<f32>(1.0/2.2));return vec4<f32>(gamma_corrected_color+hdr_color.rgb,1.0);}`;
7700
7702
 
@@ -13802,7 +13804,7 @@ var LightsTexture = class {
13802
13804
  width: gridSize.x * lightsTextureProperties.resolutionPerLight,
13803
13805
  height: gridSize.y * lightsTextureProperties.resolutionPerLight
13804
13806
  };
13805
- const format = "rgba8unorm";
13807
+ const format = lightsTextureProperties.textureFormat;
13806
13808
  this.texture = device.createTexture({
13807
13809
  label: "LightsTextureMask texture",
13808
13810
  size: [lightTextureSize.width, lightTextureSize.height],
@@ -14147,7 +14149,8 @@ async function init9(cobalt, node) {
14147
14149
  resolutionPerLight: MAX_LIGHT_SIZE,
14148
14150
  maxLightSize: MAX_LIGHT_SIZE,
14149
14151
  antialiased: false,
14150
- filtering: "nearest"
14152
+ filtering: "nearest",
14153
+ textureFormat: getPreferredFormat(cobalt)
14151
14154
  }
14152
14155
  });
14153
14156
  return {
@@ -14435,16 +14438,17 @@ var spritesheet_default = {
14435
14438
  async function init11(cobalt, node) {
14436
14439
  const { canvas, device } = cobalt;
14437
14440
  let spritesheet, colorTexture, emissiveTexture;
14441
+ const format = getPreferredFormat(cobalt);
14438
14442
  if (canvas) {
14439
14443
  spritesheet = await fetchJson(node.options.spriteSheetJsonUrl);
14440
14444
  spritesheet = readSpriteSheet(spritesheet);
14441
- colorTexture = await createTextureFromUrl(cobalt, "sprite", node.options.colorTextureUrl, "rgba8unorm");
14442
- emissiveTexture = await createTextureFromUrl(cobalt, "emissive sprite", node.options.emissiveTextureUrl, "rgba8unorm");
14445
+ colorTexture = await createTextureFromUrl(cobalt, "sprite", node.options.colorTextureUrl, format);
14446
+ emissiveTexture = await createTextureFromUrl(cobalt, "emissive sprite", node.options.emissiveTextureUrl, format);
14443
14447
  canvas.style.imageRendering = "pixelated";
14444
14448
  } else {
14445
14449
  spritesheet = readSpriteSheet(node.options.spriteSheetJson);
14446
- colorTexture = await createTextureFromBuffer(cobalt, "sprite", node.options.colorTexture, "rgba8unorm");
14447
- emissiveTexture = await createTextureFromBuffer(cobalt, "emissive sprite", node.options.emissiveTexture, "rgba8unorm");
14450
+ colorTexture = await createTextureFromBuffer(cobalt, "sprite", node.options.colorTexture, format);
14451
+ emissiveTexture = await createTextureFromBuffer(cobalt, "emissive sprite", node.options.emissiveTexture, format);
14448
14452
  }
14449
14453
  const quads = createSpriteQuads(device, spritesheet);
14450
14454
  const uniformBuffer = device.createBuffer({
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@footgun/cobalt",
3
- "version": "0.6.0",
3
+ "version": "0.6.2",
4
4
  "type": "module",
5
5
  "main": "bundle.js",
6
6
  "description": "A 2D WebGpu renderer",
@@ -1,7 +1,10 @@
1
- import createTexture from './create-texture.js'
1
+ import createTexture from './create-texture.js'
2
+ import getPreferredFormat from './get-preferred-format.js'
2
3
 
3
4
 
4
- export default function createTextureFromBuffer (c, label, image, format='rgba8unorm') {
5
+ export default function createTextureFromBuffer (c, label, image, format) {
6
+
7
+ format = format || getPreferredFormat(c)
5
8
 
6
9
  const usage = GPUTextureUsage.TEXTURE_BINDING | GPUTextureUsage.COPY_DST | GPUTextureUsage.RENDER_ATTACHMENT
7
10
  const mip_count = 1
@@ -1,10 +1,13 @@
1
- import createTexture from './create-texture.js'
1
+ import createTexture from './create-texture.js'
2
+ import getPreferredFormat from './get-preferred-format.js'
2
3
 
3
4
 
4
- export default async function createTextureFromUrl (c, label, url, format='rgba8unorm') {
5
+ export default async function createTextureFromUrl (c, label, url, format) {
5
6
  const response = await fetch(url)
6
7
  const blob = await response.blob()
7
8
 
9
+ format = format || getPreferredFormat(c)
10
+
8
11
  const imageData = await createImageBitmap(blob/*, { premultiplyAlpha: 'none', resizeQuality: 'pixelated' }*/)
9
12
 
10
13
  const usage = GPUTextureUsage.TEXTURE_BINDING | GPUTextureUsage.COPY_DST | GPUTextureUsage.RENDER_ATTACHMENT
@@ -1,3 +1,4 @@
1
+ import getPreferredFormat from "../get-preferred-format.js";
1
2
  import * as publicAPI from './public-api.js'
2
3
  import { Viewport } from "./viewport";
3
4
  import { LightsRenderer } from './lights-renderer.js';
@@ -83,6 +84,7 @@ async function init(cobalt, node) {
83
84
  maxLightSize: MAX_LIGHT_SIZE,
84
85
  antialiased: false,
85
86
  filtering: "nearest",
87
+ textureFormat: getPreferredFormat(cobalt),
86
88
  },
87
89
  });
88
90
 
@@ -45,7 +45,7 @@ class LightsTexture {
45
45
  height: gridSize.y * lightsTextureProperties.resolutionPerLight,
46
46
  };
47
47
 
48
- const format = "rgba8unorm";
48
+ const format = lightsTextureProperties.textureFormat;
49
49
  this.texture = device.createTexture({
50
50
  label: "LightsTextureMask texture",
51
51
  size: [lightTextureSize.width, lightTextureSize.height],
@@ -1,6 +1,7 @@
1
1
  import createSpriteQuads from './create-sprite-quads.js'
2
2
  import createTextureFromBuffer from '../create-texture-from-buffer.js'
3
3
  import createTextureFromUrl from '../create-texture-from-url.js'
4
+ import getPreferredFormat from '../get-preferred-format.js'
4
5
  import readSpriteSheet from './read-spritesheet.js'
5
6
  import spriteWGSL from './sprite.wgsl'
6
7
  import round from 'round-half-up-symmetric'
@@ -50,13 +51,15 @@ async function init (cobalt, node) {
50
51
 
51
52
  let spritesheet, colorTexture, emissiveTexture
52
53
 
54
+ const format = getPreferredFormat(cobalt)
55
+
53
56
  if (canvas) {
54
57
  // browser (canvas) path
55
58
  spritesheet = await fetchJson(node.options.spriteSheetJsonUrl)
56
59
  spritesheet = readSpriteSheet(spritesheet)
57
60
 
58
- colorTexture = await createTextureFromUrl(cobalt, 'sprite', node.options.colorTextureUrl, 'rgba8unorm')
59
- emissiveTexture = await createTextureFromUrl(cobalt, 'emissive sprite', node.options.emissiveTextureUrl, 'rgba8unorm')
61
+ colorTexture = await createTextureFromUrl(cobalt, 'sprite', node.options.colorTextureUrl, format)
62
+ emissiveTexture = await createTextureFromUrl(cobalt, 'emissive sprite', node.options.emissiveTextureUrl, format)
60
63
 
61
64
  // for some reason this needs to be done _after_ creating the material, or the rendering will be blurry
62
65
  canvas.style.imageRendering = 'pixelated'
@@ -65,8 +68,8 @@ async function init (cobalt, node) {
65
68
  // sdl + gpu path
66
69
  spritesheet = readSpriteSheet(node.options.spriteSheetJson)
67
70
 
68
- colorTexture = await createTextureFromBuffer(cobalt, 'sprite', node.options.colorTexture, 'rgba8unorm')
69
- emissiveTexture = await createTextureFromBuffer(cobalt, 'emissive sprite', node.options.emissiveTexture, 'rgba8unorm')
71
+ colorTexture = await createTextureFromBuffer(cobalt, 'sprite', node.options.colorTexture, format)
72
+ emissiveTexture = await createTextureFromBuffer(cobalt, 'emissive sprite', node.options.emissiveTexture, format)
70
73
  }
71
74
 
72
75
  const quads = createSpriteQuads(device, spritesheet)