@absulit/points
Version:
A Generative Art library made in WebGPU
182 lines (144 loc) • 6.76 kB
JavaScript
/* @ts-self-types="./image.d.ts" */
const texture=`
fn texture(texture:texture_2d<f32>, aSampler:sampler, uv:vec2f, crop:bool) -> vec4f {
let flipTexture = vec2(1.,-1.);
let flipTextureCoordinates = vec2(-1.,1.);
let dims:vec2u = textureDimensions(texture, 0);
let dimsF32 = vec2f(dims);
let minScreenSize = params.screen.y;
let imageRatio = dimsF32 / minScreenSize;
let displaceImagePosition = vec2(0., 1.);
let imageUV = uv / imageRatio * flipTexture + displaceImagePosition;
var rgbaImage = textureSample(texture, aSampler, imageUV);
// e.g. if uv.x < 0. OR uv.y < 0. || uv.x > imageRatio.x OR uv.y > imageRatio.y
if (crop && (any(uv < vec2(0.0)) || any(uv > imageRatio))) {
rgbaImage = vec4(0.);
}
return rgbaImage;
}
`;const texturePosition=`
fn texturePosition(texture:texture_2d<f32>, aSampler:sampler, position:vec2f, uv:vec2f, crop:bool) -> vec4f {
let flipTexture = vec2(1.,-1.);
let flipTextureCoordinates = vec2(-1.,1.);
let dims: vec2<u32> = textureDimensions(texture, 0);
let dimsF32 = vec2f(dims);
let minScreenSize = params.screen.y;
let imageRatio = dimsF32 / minScreenSize;
let displaceImagePosition = position * flipTextureCoordinates / imageRatio + vec2(0., 1.);
let top = position + vec2(0, imageRatio.y);
let imageUV = uv / imageRatio * flipTexture + displaceImagePosition;
var rgbaImage = textureSample(texture, aSampler, imageUV);
// e.g. if uv.x < 0. OR uv.y < 0. || uv.x > imageRatio.x OR uv.y > imageRatio.y
if (crop && (any(uv < position) || any(uv > position + imageRatio))) {
rgbaImage = vec4(0.);
}
return rgbaImage;
}
`;const textureExternal=`
fn textureExternal(texture:texture_external, aSampler:sampler, uv:vec2f, crop:bool) -> vec4f {
let flipTexture = vec2(1.,-1.);
let flipTextureCoordinates = vec2(-1.,1.);
let dims: vec2<u32> = textureDimensions(texture);
let dimsF32 = vec2f(f32(dims.x), f32(dims.y));
let minScreenSize = params.screen.y;
let imageRatio = dimsF32 / minScreenSize;
let displaceImagePosition = vec2(0., 1.);
let imageUV = uv / imageRatio * flipTexture + displaceImagePosition;
var rgbaImage = textureSampleBaseClampToEdge(texture, aSampler, imageUV);
// e.g. if uv.x < 0. OR uv.y < 0. || uv.x > imageRatio.x OR uv.y > imageRatio.y
if (crop && (any(uv < vec2(0.0)) || any(uv > imageRatio))) {
rgbaImage = vec4(0.);
}
return rgbaImage;
}
`;const textureExternalPosition=`
fn textureExternalPosition(texture:texture_external, aSampler:sampler, position:vec2f, uv:vec2f, crop:bool) -> vec4f {
let flipTexture = vec2(1.,-1.);
let flipTextureCoordinates = vec2(-1.,1.);
let dims: vec2<u32> = textureDimensions(texture);
let dimsF32 = vec2f(f32(dims.x), f32(dims.y));
let minScreenSize = params.screen.y;
let imageRatio = dimsF32 / minScreenSize;
let displaceImagePosition = position * flipTextureCoordinates / imageRatio + vec2(0, 1);
let top = position + vec2(0, imageRatio.y);
let imageUV = uv / imageRatio * flipTexture + displaceImagePosition;
var rgbaImage = textureSampleBaseClampToEdge(texture, aSampler, imageUV);
// e.g. if uv.x < 0. OR uv.y < 0. || uv.x > imageRatio.x OR uv.y > imageRatio.y
if (crop && (any(uv < vec2(0.0)) || any(uv > imageRatio))) {
rgbaImage = vec4(0.);
}
return rgbaImage;
}
`;const flipTextureUV=`
fn flipTextureUV(uv:vec2f) -> vec2f{
return uv * vec2(1,-1) + vec2(0,1);
}
`;const sprite=`
fn sprite(texture:texture_2d<f32>, aSampler:sampler, position:vec2f, uv:vec2f, index:u32, size:vec2<u32>) -> vec4f {
let flipTexture = vec2(1.,-1.);
let flipTextureCoordinates = vec2(-1.,1.);
let dims:vec2<u32> = textureDimensions(texture, 0);
let dimsF32 = vec2f(dims);
let sizeF32 = vec2f(size);
let minScreenSize = params.screen.y;
let imageRatio = dimsF32 / minScreenSize;
let numColumns = (dims.x) / (size.x);
let x = f32(index % numColumns);
let y = f32(index / numColumns);
let cell = vec2(x, y);
let cellIndex = cell + vec2(0,1.);
let cellSize = sizeF32 / minScreenSize;
let cellSizeInImage = cellSize / imageRatio;
let displaceImagePosition = position * flipTextureCoordinates / imageRatio + cellIndex * cellSizeInImage;
let top = position + vec2(0, imageRatio.y);
let imageUV = uv / imageRatio * flipTexture + displaceImagePosition;
var rgbaImage = textureSample(texture, aSampler, imageUV);
let isBeyondImageRight = uv.x > position.x + cellSize.x;
let isBeyondImageLeft = uv.x < position.x;
let isBeyondTop = uv.y > position.y + cellSize.y;
let isBeyondBottom = uv.y < position.y;
if(isBeyondTop || isBeyondBottom || isBeyondImageLeft || isBeyondImageRight){
rgbaImage = vec4(0.);
}
return rgbaImage;
}
`;const decodeNumberSprite=`
fn decodeNumberSprite(
value:f32,
index0Char:u32,
image:texture_2d<f32>,
imageSampler:sampler,
position:vec2f,
uv:vec2f,
ratio:vec2f,
size:vec2<u32>
) -> vec4f {
let sizeF32 = vec2(f32(size.x),f32(size.y));
let cellRatio = vec2(sizeF32.x/params.screen.x,sizeF32.y/params.screen.y)*ratio;
let displaceInX = vec2(cellRatio.x, 0);
var digits = vec4(0.);
var numberToDecode = value;
for (var index = 0; numberToDecode >= 1.; index++) {
let number = u32(numberToDecode % 10.);
numberToDecode = numberToDecode / 10.;
let finalNumber = index0Char + number;
digits += sprite(image, imageSampler, position + displaceInX * f32(-index), uv, finalNumber, size);
}
return digits;
}
`;const pixelateTexture=`
fn pixelateTexture(texture:texture_2d<f32>, textureSampler:sampler, pixelsWidth:f32, pixelsHeight:f32, uv:vec2f) -> vec4f {
let dx = pixelsWidth * (1. / params.screen.x);
let dy = pixelsHeight * (1. / params.screen.y);
let coord = vec2(dx*floor( uv.x / dx), dy * floor( uv.y / dy));
return textureSample(texture, textureSampler, coord);
}
`;const pixelateTexturePosition=`
fn pixelateTexturePosition(texture:texture_2d<f32>, textureSampler:sampler, position:vec2f, pixelsWidth:f32, pixelsHeight:f32, uv:vec2f) -> vec4f {
let dx = pixelsWidth * (1. / params.screen.x);
let dy = pixelsHeight * (1. / params.screen.y);
let coord = vec2(dx*floor( uv.x / dx), dy * floor( uv.y / dy));
//texturePosition(texture:texture_2d<f32>, aSampler:sampler, position:vec2f, uv:vec2f, crop:bool) -> vec4f {
return texturePosition(texture, textureSampler, position, coord, true);
}
`;export{decodeNumberSprite,flipTextureUV,pixelateTexture,pixelateTexturePosition,sprite,texture,textureExternal,textureExternalPosition,texturePosition};