Brick Test
I just finished a major refactoring pass on smudge. There are still some things that I really want to do, but I’m going to do some user testing before the next round of refactoring and feature additions.
I wanted to build out a more complicated example after the refactoring to make sure things work together and to identify any major pain points in the API, so I built this brick wall.
This texture set touches most of the API. It uses all of the material channels except emission. It uses a number of input textures, including the features for color and UV mapping. It also shows that the API needs some work. For example, Material2 should just be renamed to Material.
const { Material2, Smudge, SmudgeUI, BlendMode, UVMatrix, Matrix } = smudge;
const uiTarget = document.getElementById(document.currentScript.dataset.uiTarget);
async function draw() {
// create a smudge instance
Smudge.setLoggingLevel("warn");
const smudge = new Smudge("brick", 512, 512);
// load a texture
const brickHeight = await smudge.loadTexture("/smudge/media/smudge/images/blur_box.png");
const noise = await smudge.loadTexture("/smudge/media/smudge/images/gaussian_noise.png");
const clouds = await smudge.loadTexture("/smudge/media/smudge/images/clouds.png");
const circleRough = await smudge.loadTexture("/smudge/media/smudge/images/circle_rough.png");
const letterA = await smudge.loadTexture("/smudge/media/smudge/images/letter_a.png");
// show the ui
const ui = new SmudgeUI(smudge, {
targetElement: uiTarget,
environmentMapPath: "/smudge/media/smudge/images/environment_studio.jpg"
});
// clear the drawing
smudge.clear();
// draw morter
const mortar = new Material2();
mortar.albedo.color = [.8, .8, .8];
mortar.metallic.color = .2;
mortar.smoothness.color = .2;
mortar.height.color = .001;
mortar.height.textureInfo.texture = noise;
mortar.height.textureInfo.uvMatrix = new UVMatrix().scale(3, 3).get();
smudge.rect(0, 0, 512, 512, mortar);
// draw bricks
const hspace = 128;
const vspace = 64;
const margin = 3;
const brickBase = new Material2();
brickBase.albedo.color = [.9, 0, 0];
brickBase.metallic.color = .1;
brickBase.smoothness.color = .2;
brickBase.height.color = .01;
brickBase.height.textureInfo.texture = brickHeight;
const brickOverlay = new Material2();
brickOverlay.albedo.color = [-.3, .04, .04];
brickOverlay.albedo.textureInfo.texture = clouds;
brickOverlay.albedo.textureInfo.uvMatrix = new UVMatrix().scale(.4, .2).get();
brickOverlay.albedo.blendMode = BlendMode.Additive;
brickOverlay.height.color = .02;
brickOverlay.height.textureInfo.colorBias = [-.5, -.5, -.5, 1];
brickOverlay.height.textureInfo.texture = clouds;
brickOverlay.height.textureInfo.uvMatrix = new UVMatrix().scale(.4, .2).get();
brickOverlay.height.blendMode = BlendMode.Additive;
brickOverlay.smoothness.color = .3;
brickOverlay.smoothness.textureInfo.texture = noise;
brickOverlay.smoothness.textureInfo.uvMatrix = new UVMatrix().scale(.6, .3).get();
brickOverlay.smoothness.blendMode = BlendMode.Additive;
for (let row = 1; row < 8; row++) {
for (let col = 0; col < 5; col++) {
brickBase.albedo.color = [Math.random() * .1 + .6, Math.random() * .1, Math.random() * .1];
brickOverlay.albedo.textureInfo.uvMatrix = new UVMatrix().rotate(Math.random() * Math.PI).scale(.4, .2).get();
brickOverlay.height.textureInfo.uvMatrix = new UVMatrix().rotate(Math.random() * Math.PI).scale(.4, .2).get();
const m = new Matrix().translate(Math.random() * 2, Math.random() * 2);
// base is a line because it won't stretch the emboss texture
const line = [];
const offset = row % 2 === 0 ? 0 : hspace * -.5;
line.push([col * hspace + margin + offset, vspace * row + 32]);
line.push([col * hspace + hspace - margin + offset, vspace * row + 32]);
smudge.line(line, vspace - 2 * margin, brickBase, m);
// overlay is a rect because i want to tile textures
smudge.rect(
col * hspace + offset + margin,
vspace * row + margin,
hspace - 2 * margin,
vspace - 2 * margin,
brickOverlay,
m,
);
}
}
// draw paint circle
const paint = new Material2();
paint.albedo.color = [0, .8, 0, 1];
paint.metallic.color = 0;
paint.smoothness.color = [.2, .9];
paint.height.color = .001;
paint.height.blendMode = BlendMode.Additive;
paint.default.textureInfo.texture = circleRough;
paint.default.textureInfo.colorBias = [1, 1, 1, 0];
paint.default.textureInfo.colorMatrix = [
0, 0, 0, 1,
0, 0, 0, 0,
0, 0, 0, 0,
0, 0, 0, 0,
];
smudge.ellipse(32, 32, 256, 256, paint);
// show albedo in ui
ui.update2D();
ui.update3D();
}
draw();