Skip to content

Commit 724c39f

Browse files
2.30.1
1 parent 04a0d5f commit 724c39f

File tree

6 files changed

+120
-116
lines changed

6 files changed

+120
-116
lines changed

deno.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "@q5/q5",
3-
"version": "2.30.0",
3+
"version": "2.30.1",
44
"license": "LGPL-3.0",
55
"description": "Beginner friendly graphics powered by WebGPU and optimized for interactive art!",
66
"author": "quinton-ashley",

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "q5",
3-
"version": "2.30.0",
3+
"version": "2.30.1",
44
"description": "Beginner friendly graphics powered by WebGPU and optimized for interactive art!",
55
"author": "quinton-ashley",
66
"contributors": [

q5.js

Lines changed: 58 additions & 56 deletions
Original file line numberDiff line numberDiff line change
@@ -5272,11 +5272,11 @@ fn fragMain(f: FragParams ) -> @location(0) vec4f {
52725272
matrixIdx = 0,
52735273
matrixDirty = false; // tracks if the matrix has been modified
52745274

5275-
// initialize with a 4x4 identity matrix
5275+
// 4x4 identity matrix with y axis flipped
52765276
// prettier-ignore
52775277
matrices.push([
52785278
1, 0, 0, 0,
5279-
0, 1, 0, 0,
5279+
0, -1, 0, 0, // -1 here flips the y axis
52805280
0, 0, 1, 0,
52815281
0, 0, 0, 1
52825282
]);
@@ -5289,13 +5289,14 @@ fn fragMain(f: FragParams ) -> @location(0) vec4f {
52895289
};
52905290
$.resetMatrix();
52915291

5292-
$.translate = (x, y, z = 0) => {
5293-
if (!x && !y && !z) return;
5294-
// update the translation values
5292+
$.translate = (x, y) => {
5293+
if (!x && !y) return;
52955294
let m = matrix;
5296-
m[12] += x * m[0];
5297-
m[13] -= y * m[5];
5298-
m[14] += z * m[10];
5295+
5296+
// Apply translation in sheared/skewed space (2D only)
5297+
m[12] += x * m[0] + y * m[4];
5298+
m[13] += x * m[1] + y * m[5];
5299+
52995300
matrixDirty = true;
53005301
};
53015302

@@ -5365,8 +5366,8 @@ fn fragMain(f: FragParams ) -> @location(0) vec4f {
53655366
m4 = m[4],
53665367
m5 = m[5];
53675368

5368-
m[0] = m0 + m4 * tanAng;
5369-
m[1] = m1 + m5 * tanAng;
5369+
m[4] = m4 + m0 * tanAng;
5370+
m[5] = m5 + m1 * tanAng;
53705371

53715372
matrixDirty = true;
53725373
};
@@ -5382,8 +5383,8 @@ fn fragMain(f: FragParams ) -> @location(0) vec4f {
53825383
m4 = m[4],
53835384
m5 = m[5];
53845385

5385-
m[4] = m4 + m0 * tanAng;
5386-
m[5] = m5 + m1 * tanAng;
5386+
m[0] = m0 + m4 * tanAng;
5387+
m[1] = m1 + m5 * tanAng;
53875388

53885389
matrixDirty = true;
53895390
};
@@ -5507,21 +5508,21 @@ fn fragMain(f: FragParams ) -> @location(0) vec4f {
55075508
if (!mode || mode == 'corner') {
55085509
l = x;
55095510
r = x + w;
5510-
t = -y;
5511-
b = -(y + h);
5511+
t = y;
5512+
b = y + h;
55125513
} else if (mode == 'center') {
55135514
let hw = w / 2,
55145515
hh = h / 2;
55155516
l = x - hw;
55165517
r = x + hw;
5517-
t = -(y - hh);
5518-
b = -(y + hh);
5518+
t = y - hh;
5519+
b = y + hh;
55195520
} else {
55205521
// CORNERS
55215522
l = x;
55225523
r = w;
5523-
t = -y;
5524-
b = -h;
5524+
t = y;
5525+
b = h;
55255526
}
55265527

55275528
return [l, r, t, b];
@@ -6042,7 +6043,7 @@ fn fragMain(f: FragParams) -> @location(0) vec4f {
60426043

60436044
// calculate perimeter vertex
60446045
let vx = x + a * Math.cos(t);
6045-
let vy = y - b * Math.sin(t);
6046+
let vy = y + b * Math.sin(t);
60466047

60476048
// add perimeter vertex
60486049
v[i++] = vx;
@@ -6068,11 +6069,11 @@ fn fragMain(f: FragParams) -> @location(0) vec4f {
60686069
for (let j = 0; j <= n; j++) {
60696070
// Outer vertex
60706071
let vxOuter = x + outerA * Math.cos(t);
6071-
let vyOuter = y - outerB * Math.sin(t);
6072+
let vyOuter = y + outerB * Math.sin(t);
60726073

60736074
// Inner vertex
60746075
let vxInner = x + innerA * Math.cos(t);
6075-
let vyInner = y - innerB * Math.sin(t);
6076+
let vyInner = y + innerB * Math.sin(t);
60766077

60776078
// Add vertices for triangle strip
60786079
v[i++] = vxOuter;
@@ -6137,26 +6138,26 @@ fn fragMain(f: FragParams) -> @location(0) vec4f {
61376138

61386139
l += rr;
61396140
r -= rr;
6140-
t -= rr;
6141-
b += rr;
6141+
t += rr;
6142+
b -= rr;
61426143

61436144
// Clamp radius
61446145
rr = Math.min(rr, Math.min(w, h) / 2);
61456146

61466147
let n = getArcSegments(rr * _scale);
61476148

6148-
let trr = t + rr,
6149-
brr = b - rr,
6149+
let trr = t - rr,
6150+
brr = b + rr,
61506151
lrr = l - rr,
61516152
rrr = r + rr;
61526153

61536154
if (doFill) {
61546155
ci = fillIdx;
61556156
// Corner arcs
6156-
addArc(r, b, rr, rr, 0, HALF_PI, n, ci, ti);
6157-
addArc(l, b, rr, rr, Math.PI, HALF_PI, n, ci, ti);
6158-
addArc(l, t, rr, rr, -Math.PI, -HALF_PI, n, ci, ti);
6159-
addArc(r, t, rr, rr, -HALF_PI, 0, n, ci, ti);
6157+
addArc(l, t, rr, -rr, -HALF_PI, Math.PI, n, ci, ti); // top-left
6158+
addArc(r, t, rr, -rr, HALF_PI, 0, n, ci, ti); // top-right
6159+
addArc(r, b, rr, -rr, 0, -HALF_PI, n, ci, ti); // bottom-right
6160+
addArc(l, b, rr, -rr, -HALF_PI, -Math.PI, n, ci, ti); // bottom-left
61606161

61616162
addRect(l, trr, r, trr, r, brr, l, brr, ci, ti); // center
61626163
addRect(l, t, lrr, t, lrr, b, l, b, ci, ti); // Left
@@ -6170,11 +6171,12 @@ fn fragMain(f: FragParams) -> @location(0) vec4f {
61706171
outerB = rr + hsw,
61716172
innerA = rr - hsw,
61726173
innerB = rr - hsw;
6174+
61736175
// Corner arc strokes
6174-
addArcStroke(r, b, outerA, outerB, innerA, innerB, 0, HALF_PI, n, ci, ti);
6175-
addArcStroke(l, b, outerA, outerB, innerA, innerB, Math.PI, HALF_PI, n, ci, ti);
6176-
addArcStroke(l, t, outerA, outerB, innerA, innerB, -Math.PI, -HALF_PI, n, ci, ti);
6177-
addArcStroke(r, t, outerA, outerB, innerA, innerB, -HALF_PI, 0, n, ci, ti);
6176+
addArcStroke(l, t, outerA, -outerB, innerA, -innerB, Math.PI, HALF_PI, n, ci, ti); // top-left
6177+
addArcStroke(r, t, outerA, -outerB, innerA, -innerB, HALF_PI, 0, n, ci, ti); // top-right
6178+
addArcStroke(r, b, outerA, -outerB, innerA, -innerB, 0, -HALF_PI, n, ci, ti); // bottom-right
6179+
addArcStroke(l, b, outerA, -outerB, innerA, -innerB, -HALF_PI, -Math.PI, n, ci, ti); // bottom-left
61786180

61796181
let lrrMin = lrr - hsw,
61806182
lrrMax = lrr + hsw,
@@ -6246,11 +6248,11 @@ fn fragMain(f: FragParams) -> @location(0) vec4f {
62466248
let ti = matrixIdx;
62476249

62486250
if (doFill) {
6249-
addArc(x, -y, a, b, 0, TAU, n, fillIdx, ti);
6251+
addArc(x, y, a, b, 0, TAU, n, fillIdx, ti);
62506252
}
62516253
if (doStroke) {
62526254
// Draw the stroke as a ring using triangle strips
6253-
addArcStroke(x, -y, a + hsw, b + hsw, a - hsw, b - hsw, 0, TAU, n, strokeIdx, ti);
6255+
addArcStroke(x, y, a + hsw, b + hsw, a - hsw, b - hsw, 0, TAU, n, strokeIdx, ti);
62546256
}
62556257
};
62566258

@@ -6299,15 +6301,15 @@ fn fragMain(f: FragParams) -> @location(0) vec4f {
62996301

63006302
// Draw fill
63016303
if (doFill) {
6302-
addArc(x, -y, a, b, start, stop, n, fillIdx, ti);
6304+
addArc(x, y, a, b, start, stop, n, fillIdx, ti);
63036305
}
63046306

63056307
// Draw stroke
63066308
if (doStroke) {
6307-
addArcStroke(x, -y, a + hsw, b + hsw, a - hsw, b - hsw, start, stop, n, strokeIdx, ti);
6309+
addArcStroke(x, y, a + hsw, b + hsw, a - hsw, b - hsw, start, stop, n, strokeIdx, ti);
63086310
if (_strokeCap == 'round') {
6309-
addArc(x + a * Math.cos(start), -y - b * Math.sin(start), hsw, hsw, 0, TAU, n, strokeIdx, ti);
6310-
addArc(x + a * Math.cos(stop), -y - b * Math.sin(stop), hsw, hsw, 0, TAU, n, strokeIdx, ti);
6311+
addArc(x + a * Math.cos(start), y + b * Math.sin(start), hsw, hsw, 0, TAU, n, strokeIdx, ti);
6312+
addArc(x + a * Math.cos(stop), y + b * Math.sin(stop), hsw, hsw, 0, TAU, n, strokeIdx, ti);
63116313
}
63126314
}
63136315
};
@@ -6323,7 +6325,7 @@ fn fragMain(f: FragParams) -> @location(0) vec4f {
63236325
} else {
63246326
let n = getArcSegments(scaledSW);
63256327
sw /= 2;
6326-
addArc(x, -y, sw, sw, 0, TAU, n, ci, ti);
6328+
addArc(x, y, sw, sw, 0, TAU, n, ci, ti);
63276329
}
63286330
};
63296331

@@ -6351,12 +6353,12 @@ fn fragMain(f: FragParams) -> @location(0) vec4f {
63516353
let px = -(dy / length) * hsw,
63526354
py = (dx / length) * hsw;
63536355

6354-
addRect(x1 + px, -y1 - py, x1 - px, -y1 + py, x2 - px, -y2 + py, x2 + px, -y2 - py, ci, ti);
6356+
addRect(x1 + px, y1 + py, x1 - px, y1 - py, x2 - px, y2 - py, x2 + px, y2 + py, ci, ti);
63556357

63566358
if (scaledSW > 2 && _strokeCap != 'square') {
63576359
let n = getArcSegments(scaledSW);
6358-
addArc(x1, -y1, hsw, hsw, 0, TAU, n, ci, ti);
6359-
addArc(x2, -y2, hsw, hsw, 0, TAU, n, ci, ti);
6360+
addArc(x1, y1, hsw, hsw, 0, TAU, n, ci, ti);
6361+
addArc(x2, y2, hsw, hsw, 0, TAU, n, ci, ti);
63606362
}
63616363
};
63626364

@@ -6378,13 +6380,13 @@ fn fragMain(f: FragParams) -> @location(0) vec4f {
63786380

63796381
$.vertex = (x, y) => {
63806382
if (matrixDirty) saveMatrix();
6381-
sv.push(x, -y, fillIdx, matrixIdx);
6383+
sv.push(x, y, fillIdx, matrixIdx);
63826384
shapeVertCount++;
63836385
};
63846386

63856387
$.curveVertex = (x, y) => {
63866388
if (matrixDirty) saveMatrix();
6387-
curveVertices.push({ x: x, y: -y });
6389+
curveVertices.push({ x, y });
63886390
};
63896391

63906392
$.bezierVertex = function (cx1, cy1, cx2, cy2, x, y) {
@@ -6415,14 +6417,14 @@ fn fragMain(f: FragParams) -> @location(0) vec4f {
64156417

64166418
if (quadratic) {
64176419
vx = mt2 * startX + 2 * mt * t * cx1 + t2 * x;
6418-
vy = mt2 * startY + 2 * mt * t * -cy1 + t2 * -y;
6420+
vy = mt2 * startY + 2 * mt * t * cy1 + t2 * y;
64196421
} else {
64206422
let t3 = t2 * t;
64216423
let mt3 = mt2 * mt;
64226424

64236425
// Cubic Bezier formula
64246426
vx = mt3 * startX + 3 * mt2 * t * cx1 + 3 * mt * t2 * cx2 + t3 * x;
6425-
vy = mt3 * startY + 3 * mt2 * t * -cy1 + 3 * mt * t2 * -cy2 + t3 * -y;
6427+
vy = mt3 * startY + 3 * mt2 * t * cy1 + 3 * mt * t2 * cy2 + t3 * y;
64266428
}
64276429

64286430
sv.push(vx, vy, fillIdx, matrixIdx);
@@ -6479,8 +6481,8 @@ fn fragMain(f: FragParams) -> @location(0) vec4f {
64796481
}
64806482

64816483
if (!shapeVertCount) return;
6482-
if (shapeVertCount == 1) return $.point(sv[0], -sv[1]);
6483-
if (shapeVertCount == 2) return $.line(sv[0], -sv[1], sv[4], -sv[5]);
6484+
if (shapeVertCount == 1) return $.point(sv[0], sv[1]);
6485+
if (shapeVertCount == 2) return $.line(sv[0], sv[1], sv[4], sv[5]);
64846486

64856487
// close the shape if requested
64866488
if (close) {
@@ -6530,13 +6532,13 @@ fn fragMain(f: FragParams) -> @location(0) vec4f {
65306532
for (let i = 0; i < shapeVertCount - 1; i++) {
65316533
let v1 = i * 4;
65326534
let v2 = (i + 1) * 4;
6533-
$.line(sv[v1], -sv[v1 + 1], sv[v2], -sv[v2 + 1]);
6535+
$.line(sv[v1], sv[v1 + 1], sv[v2], sv[v2 + 1]);
65346536

65356537
addArc(sv[v1], sv[v1 + 1], hsw, hsw, 0, TAU, n, strokeIdx, ti);
65366538
}
65376539
let v1 = (shapeVertCount - 1) * 4;
65386540
let v2 = 0;
6539-
if (close) $.line(sv[v1], -sv[v1 + 1], sv[v2], -sv[v2 + 1]);
6541+
if (close) $.line(sv[v1], sv[v1 + 1], sv[v2], sv[v2 + 1]);
65406542
addArc(sv[v1], sv[v1 + 1], hsw, hsw, 0, TAU, n, strokeIdx, ti);
65416543
_strokeCap = ogStrokeCap;
65426544
}
@@ -7065,7 +7067,7 @@ struct Text {
70657067
@group(2) @binding(0) var<storage> textChars: array<vec4f>;
70667068
@group(2) @binding(1) var<storage> textMetadata: array<Text>;
70677069
7068-
const quad = array(vec2f(0, -1), vec2f(1, -1), vec2f(0, 0), vec2f(1, 0));
7070+
const quad = array(vec2f(0, 1), vec2f(1, 1), vec2f(0, 0), vec2f(1, 0));
70697071
const uvs = array(vec2f(0, 1), vec2f(1, 1), vec2f(0, 0), vec2f(1, 0));
70707072
70717073
fn calcPos(i: u32, char: vec4f, fontChar: Char, text: Text) -> vec2f {
@@ -7292,7 +7294,7 @@ fn fragMain(f : FragParams) -> @location(0) vec4f {
72927294
fontChars[o + 4] = char.width; // size.x
72937295
fontChars[o + 5] = char.height; // size.y
72947296
fontChars[o + 6] = char.xoffset; // offset.x
7295-
fontChars[o + 7] = -char.yoffset; // offset.y
7297+
fontChars[o + 7] = char.yoffset; // offset.y
72967298
o += 8;
72977299
}
72987300
charsBuffer.unmap();
@@ -7526,7 +7528,7 @@ fn fragMain(f : FragParams) -> @location(0) vec4f {
75267528
if (ta == 'left' && !hasNewline) {
75277529
measurements = measureText($._font, str, (textX, textY, line, char) => {
75287530
charsData[o] = textX;
7529-
charsData[o + 1] = textY;
7531+
charsData[o + 1] = -textY;
75307532
charsData[o + 2] = char.charIndex;
75317533
charsData[o + 3] = textIndex;
75327534
o += 4;
@@ -7553,7 +7555,7 @@ fn fragMain(f : FragParams) -> @location(0) vec4f {
75537555
offsetX = -measurements.lineWidths[line];
75547556
}
75557557
charsData[o] = textX + offsetX;
7556-
charsData[o + 1] = textY + offsetY;
7558+
charsData[o + 1] = -(textY + offsetY);
75577559
charsData[o + 2] = char.charIndex;
75587560
charsData[o + 3] = textIndex;
75597561
o += 4;
@@ -7566,7 +7568,7 @@ fn fragMain(f : FragParams) -> @location(0) vec4f {
75667568
if (matrixDirty) saveMatrix();
75677569

75687570
txt[0] = x;
7569-
txt[1] = -y;
7571+
txt[1] = y;
75707572
txt[2] = _textSize / 42;
75717573
txt[3] = matrixIdx;
75727574
txt[4] = doFill && fillSet ? fillIdx : 0;

q5.min.js

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)