Fix selecting shapes rendering incorrectly
This commit is contained in:
parent
49dd8f83d1
commit
184578c361
34
src/main.js
34
src/main.js
|
|
@ -11,7 +11,6 @@ import {
|
||||||
titleCase,
|
titleCase,
|
||||||
getMousePositionFraction,
|
getMousePositionFraction,
|
||||||
getKeyframesSurrounding,
|
getKeyframesSurrounding,
|
||||||
invertPixels,
|
|
||||||
lerpColor,
|
lerpColor,
|
||||||
lerp,
|
lerp,
|
||||||
camelToWords,
|
camelToWords,
|
||||||
|
|
@ -2501,6 +2500,23 @@ class BaseShape {
|
||||||
let ctx = context.ctx;
|
let ctx = context.ctx;
|
||||||
ctx.lineWidth = this.lineWidth;
|
ctx.lineWidth = this.lineWidth;
|
||||||
ctx.lineCap = "round";
|
ctx.lineCap = "round";
|
||||||
|
|
||||||
|
// Create a repeating pattern for indicating selected shapes
|
||||||
|
let patternCanvas = document.createElement('canvas');
|
||||||
|
patternCanvas.width = 2;
|
||||||
|
patternCanvas.height = 2;
|
||||||
|
let patternCtx = patternCanvas.getContext('2d');
|
||||||
|
// Draw the pattern:
|
||||||
|
// black, transparent,
|
||||||
|
// transparent, white
|
||||||
|
patternCtx.fillStyle = 'black';
|
||||||
|
patternCtx.fillRect(0, 0, 1, 1);
|
||||||
|
patternCtx.clearRect(1, 0, 1, 1);
|
||||||
|
patternCtx.clearRect(0, 1, 1, 1);
|
||||||
|
patternCtx.fillStyle = 'white';
|
||||||
|
patternCtx.fillRect(1, 1, 1, 1);
|
||||||
|
let pattern = ctx.createPattern(patternCanvas, 'repeat'); // repeat the pattern across the canvas
|
||||||
|
|
||||||
// for (let region of this.regions) {
|
// for (let region of this.regions) {
|
||||||
// // if (region.filled) continue;
|
// // if (region.filled) continue;
|
||||||
// if ((region.fillStyle || region.fillImage) && region.filled) {
|
// if ((region.fillStyle || region.fillImage) && region.filled) {
|
||||||
|
|
@ -2546,6 +2562,10 @@ class BaseShape {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
ctx.fill();
|
ctx.fill();
|
||||||
|
if (context.selected) {
|
||||||
|
ctx.fillStyle = pattern
|
||||||
|
ctx.fill()
|
||||||
|
}
|
||||||
}
|
}
|
||||||
if (this.stroked && !context.debugColor) {
|
if (this.stroked && !context.debugColor) {
|
||||||
for (let curve of this.curves) {
|
for (let curve of this.curves) {
|
||||||
|
|
@ -2561,6 +2581,10 @@ class BaseShape {
|
||||||
curve.points[3].y,
|
curve.points[3].y,
|
||||||
);
|
);
|
||||||
ctx.stroke();
|
ctx.stroke();
|
||||||
|
if (context.selected) {
|
||||||
|
ctx.strokeStyle = pattern
|
||||||
|
ctx.stroke()
|
||||||
|
}
|
||||||
|
|
||||||
// // Debug, show curve control points
|
// // Debug, show curve control points
|
||||||
// ctx.beginPath()
|
// ctx.beginPath()
|
||||||
|
|
@ -3230,13 +3254,11 @@ class GraphicsObject {
|
||||||
if (context.activeObject == this && !layer.visible) continue;
|
if (context.activeObject == this && !layer.visible) continue;
|
||||||
let frame = layer.getFrame(this.currentFrameNum);
|
let frame = layer.getFrame(this.currentFrameNum);
|
||||||
for (let shape of frame.shapes) {
|
for (let shape of frame.shapes) {
|
||||||
|
let cxt = {...context}
|
||||||
if (context.shapeselection.indexOf(shape) >= 0) {
|
if (context.shapeselection.indexOf(shape) >= 0) {
|
||||||
invertPixels(ctx, config.fileWidth, config.fileHeight);
|
cxt.selected = true
|
||||||
}
|
|
||||||
shape.draw(context);
|
|
||||||
if (context.shapeselection.indexOf(shape) >= 0) {
|
|
||||||
invertPixels(ctx, config.fileWidth, config.fileHeight);
|
|
||||||
}
|
}
|
||||||
|
shape.draw(cxt);
|
||||||
}
|
}
|
||||||
for (let child of layer.children) {
|
for (let child of layer.children) {
|
||||||
if (child == context.activeObject) continue;
|
if (child == context.activeObject) continue;
|
||||||
|
|
|
||||||
51
src/utils.js
51
src/utils.js
|
|
@ -41,56 +41,6 @@ function getKeyframesSurrounding(frames, index) {
|
||||||
return { lastKeyframeBefore, firstKeyframeAfter };
|
return { lastKeyframeBefore, firstKeyframeAfter };
|
||||||
}
|
}
|
||||||
|
|
||||||
function invertPixels(ctx, width, height) {
|
|
||||||
// Create an off-screen canvas for the pattern
|
|
||||||
const patternCanvas = document.createElement('canvas');
|
|
||||||
const patternContext = patternCanvas.getContext('2d');
|
|
||||||
|
|
||||||
// Define the size of the repeating pattern (2x2 pixels)
|
|
||||||
const patternSize = 2;
|
|
||||||
patternCanvas.width = patternSize;
|
|
||||||
patternCanvas.height = patternSize;
|
|
||||||
|
|
||||||
// Create the alternating pattern (regular and inverted pixels)
|
|
||||||
function createInvertedPattern() {
|
|
||||||
const patternData = patternContext.createImageData(patternSize, patternSize);
|
|
||||||
const data = patternData.data;
|
|
||||||
|
|
||||||
// Fill the pattern with alternating colors (inverted every other pixel)
|
|
||||||
for (let i = 0; i < patternSize; i++) {
|
|
||||||
for (let j = 0; j < patternSize; j++) {
|
|
||||||
const index = (i * patternSize + j) * 4;
|
|
||||||
// Determine if we should invert the color
|
|
||||||
if ((i + j) % 2 === 0 || j%2===0) {
|
|
||||||
data[index] = 0; // Red
|
|
||||||
data[index + 1] = 0; // Green
|
|
||||||
data[index + 2] = 0; // Blue
|
|
||||||
data[index + 3] = 255; // Alpha
|
|
||||||
} else {
|
|
||||||
data[index] = 255; // Red (inverted)
|
|
||||||
data[index + 1] = 255; // Green (inverted)
|
|
||||||
data[index + 2] = 255; // Blue (inverted)
|
|
||||||
data[index + 3] = 255; // Alpha
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Set the pattern on the off-screen canvas
|
|
||||||
patternContext.putImageData(patternData, 0, 0);
|
|
||||||
return patternCanvas;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Create the pattern using the function
|
|
||||||
const pattern = ctx.createPattern(createInvertedPattern(), 'repeat');
|
|
||||||
|
|
||||||
// Draw a rectangle with the pattern
|
|
||||||
ctx.globalCompositeOperation = "difference"
|
|
||||||
ctx.fillStyle = pattern;
|
|
||||||
ctx.fillRect(0, 0, width, height);
|
|
||||||
|
|
||||||
ctx.globalCompositeOperation = "source-over"
|
|
||||||
}
|
|
||||||
|
|
||||||
function lerp(a, b, t) {
|
function lerp(a, b, t) {
|
||||||
return a + (b - a) * t;
|
return a + (b - a) * t;
|
||||||
}
|
}
|
||||||
|
|
@ -918,7 +868,6 @@ export {
|
||||||
titleCase,
|
titleCase,
|
||||||
getMousePositionFraction,
|
getMousePositionFraction,
|
||||||
getKeyframesSurrounding,
|
getKeyframesSurrounding,
|
||||||
invertPixels,
|
|
||||||
lerp,
|
lerp,
|
||||||
lerpColor,
|
lerpColor,
|
||||||
camelToWords,
|
camelToWords,
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue