UNPKG

@absulit/points

Version:

A Generative Art library made in WebGPU

182 lines (144 loc) 6.75 kB
/* @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 < vec2(0.0)) || any(uv > 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};