save regions
This commit is contained in:
parent
7f3fc1a4f3
commit
e0ba8ed8c3
108
src/main.js
108
src/main.js
|
|
@ -645,6 +645,7 @@ class Shape {
|
||||||
this.idx = uuid
|
this.idx = uuid
|
||||||
}
|
}
|
||||||
pointerList[this.idx] = this
|
pointerList[this.idx] = this
|
||||||
|
this.regionIdx = 0;
|
||||||
}
|
}
|
||||||
addCurve(curve) {
|
addCurve(curve) {
|
||||||
this.curves.push(curve)
|
this.curves.push(curve)
|
||||||
|
|
@ -669,6 +670,34 @@ class Shape {
|
||||||
clear() {
|
clear() {
|
||||||
this.curves = []
|
this.curves = []
|
||||||
}
|
}
|
||||||
|
copy() {
|
||||||
|
let newShape = new Shape(this.startx, this.starty, {})
|
||||||
|
newShape.startx = this.startx;
|
||||||
|
newShape.starty = this.starty;
|
||||||
|
for (let curve of this.curves) {
|
||||||
|
let newCurve = new Bezier(
|
||||||
|
curve.points[0].x, curve.points[0].y,
|
||||||
|
curve.points[1].x, curve.points[1].y,
|
||||||
|
curve.points[2].x, curve.points[2].y,
|
||||||
|
curve.points[3].x, curve.points[3].y,
|
||||||
|
)
|
||||||
|
newCurve.color = curve.color
|
||||||
|
newShape.addCurve(newCurve)
|
||||||
|
}
|
||||||
|
// TODO
|
||||||
|
// for (let vertex of this.vertices) {
|
||||||
|
|
||||||
|
// }
|
||||||
|
newShape.updateVertices()
|
||||||
|
newShape.fillStyle = this.fillStyle;
|
||||||
|
newShape.fillImage = this.fillImage;
|
||||||
|
newShape.strokeStyle = this.strokeStyle;
|
||||||
|
newShape.lineWidth = this.lineWidth
|
||||||
|
newShape.filled = this.filled;
|
||||||
|
newShape.stroked = this.stroked;
|
||||||
|
|
||||||
|
return newShape
|
||||||
|
}
|
||||||
recalculateBoundingBox() {
|
recalculateBoundingBox() {
|
||||||
for (let curve of this.curves) {
|
for (let curve of this.curves) {
|
||||||
growBoundingBox(this.boundingBox, curve.bbox())
|
growBoundingBox(this.boundingBox, curve.bbox())
|
||||||
|
|
@ -797,7 +826,7 @@ class Shape {
|
||||||
let i = 0;
|
let i = 0;
|
||||||
|
|
||||||
|
|
||||||
let region = {idx: uuidv4(), curves: [], fillStyle: undefined, filled: false}
|
let region = {idx: `${this.idx}-r${this.regionIdx++}`, curves: [], fillStyle: undefined, filled: false}
|
||||||
pointerList[region.idx] = region
|
pointerList[region.idx] = region
|
||||||
this.regions = [region]
|
this.regions = [region]
|
||||||
for (let curve of this.curves) {
|
for (let curve of this.curves) {
|
||||||
|
|
@ -870,7 +899,7 @@ class Shape {
|
||||||
let end = region.curves.indexOf(regionVertexCurves[3])
|
let end = region.curves.indexOf(regionVertexCurves[3])
|
||||||
if (end > start) {
|
if (end > start) {
|
||||||
let newRegion = {
|
let newRegion = {
|
||||||
idx: uuidv4(), // TODO: generate this deterministically so that undo/redo works
|
idx: `${this.idx}-r${this.regionIdx++}`, // TODO: generate this deterministically so that undo/redo works
|
||||||
curves: region.curves.splice(start, end - start),
|
curves: region.curves.splice(start, end - start),
|
||||||
fillStyle: region.fillStyle,
|
fillStyle: region.fillStyle,
|
||||||
filled: true
|
filled: true
|
||||||
|
|
@ -956,15 +985,18 @@ class GraphicsObject {
|
||||||
return this.layers[this.currentLayer].children
|
return this.layers[this.currentLayer].children
|
||||||
}
|
}
|
||||||
get currentFrame() {
|
get currentFrame() {
|
||||||
if (this.layers[this.currentLayer].frames[this.currentFrameNum]) {
|
return this.getFrame(this.currentFrameNum)
|
||||||
if (this.layers[this.currentLayer].frames[this.currentFrameNum].frameType == "keyframe") {
|
}
|
||||||
return this.layers[this.currentLayer].frames[this.currentFrameNum]
|
getFrame(num) {
|
||||||
} else if (this.layers[this.currentLayer].frames[this.currentFrameNum].frameType == "motion") {
|
if (this.layers[this.currentLayer].frames[num]) {
|
||||||
|
if (this.layers[this.currentLayer].frames[num].frameType == "keyframe") {
|
||||||
|
return this.layers[this.currentLayer].frames[num]
|
||||||
|
} else if (this.layers[this.currentLayer].frames[num].frameType == "motion") {
|
||||||
|
|
||||||
} else if (this.layers[this.currentLayer].frames[this.currentFrameNum].frameType == "shape") {
|
} else if (this.layers[this.currentLayer].frames[num].frameType == "shape") {
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
for (let i=this.currentFrameNum; i>=0; i--) {
|
for (let i=num; i>=0; i--) {
|
||||||
if (this.layers[this.currentLayer].frames[i].frameType == "keyframe") {
|
if (this.layers[this.currentLayer].frames[i].frameType == "keyframe") {
|
||||||
return this.layers[this.currentLayer].frames[i]
|
return this.layers[this.currentLayer].frames[i]
|
||||||
}
|
}
|
||||||
|
|
@ -1185,6 +1217,7 @@ function advanceFrame() {
|
||||||
context.activeObject.currentFrameNum += 1
|
context.activeObject.currentFrameNum += 1
|
||||||
updateLayers()
|
updateLayers()
|
||||||
updateMenu()
|
updateMenu()
|
||||||
|
updateUI()
|
||||||
}
|
}
|
||||||
|
|
||||||
function decrementFrame() {
|
function decrementFrame() {
|
||||||
|
|
@ -1192,6 +1225,7 @@ function decrementFrame() {
|
||||||
context.activeObject.currentFrameNum -= 1
|
context.activeObject.currentFrameNum -= 1
|
||||||
updateLayers()
|
updateLayers()
|
||||||
updateMenu()
|
updateMenu()
|
||||||
|
updateUI()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -1318,6 +1352,39 @@ async function quit() {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function addFrame() {
|
||||||
|
console.log(context.activeObject.currentFrameNum)
|
||||||
|
if (context.activeObject.currentFrameNum >= context.activeObject.activeLayer.frames.length) {
|
||||||
|
for (let i=context.activeObject.activeLayer.frames.length; i<=context.activeObject.currentFrameNum; i++) {
|
||||||
|
context.activeObject.activeLayer.frames.push(new Frame())
|
||||||
|
}
|
||||||
|
console.log(context.activeObject.activeLayer)
|
||||||
|
updateLayers()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function addKeyframe() {
|
||||||
|
console.log(context.activeObject.currentFrameNum)
|
||||||
|
let newKeyframe = new Frame("keyframe")
|
||||||
|
let latestFrame = context.activeObject.getFrame(Math.max(context.activeObject.currentFrameNum-1, 0))
|
||||||
|
for (let key in latestFrame.keys) {
|
||||||
|
newKeyframe.keys[key] = latestFrame.keys[key]
|
||||||
|
}
|
||||||
|
for (let shape of latestFrame.shapes) {
|
||||||
|
newKeyframe.shapes.push(shape.copy())
|
||||||
|
}
|
||||||
|
if (context.activeObject.currentFrameNum >= context.activeObject.activeLayer.frames.length) {
|
||||||
|
for (let i=context.activeObject.activeLayer.frames.length; i<context.activeObject.currentFrameNum; i++) {
|
||||||
|
context.activeObject.activeLayer.frames.push(new Frame())
|
||||||
|
}
|
||||||
|
context.activeObject.activeLayer.frames.push(newKeyframe)
|
||||||
|
} else if (context.activeObject.activeLayer.frames[context.activeObject.currentFrameNum].frameType != "keyframe") {
|
||||||
|
context.activeObject.activeLayer.frames[context.activeObject.currentFrameNum] = newKeyframe
|
||||||
|
}
|
||||||
|
console.log(context.activeObject.activeLayer)
|
||||||
|
updateLayers()
|
||||||
|
}
|
||||||
|
|
||||||
function stage() {
|
function stage() {
|
||||||
let stage = document.createElement("canvas")
|
let stage = document.createElement("canvas")
|
||||||
let scroller = document.createElement("div")
|
let scroller = document.createElement("div")
|
||||||
|
|
@ -1882,11 +1949,24 @@ function updateLayers() {
|
||||||
let layerTrack = document.createElement("div")
|
let layerTrack = document.createElement("div")
|
||||||
layerTrack.className = "layer-track"
|
layerTrack.className = "layer-track"
|
||||||
framescontainer.appendChild(layerTrack)
|
framescontainer.appendChild(layerTrack)
|
||||||
|
layerTrack.addEventListener("click", (e) => {
|
||||||
|
console.log(layerTrack.getBoundingClientRect())
|
||||||
|
let mouse = getMousePos(layerTrack, e)
|
||||||
|
let frameNum = parseInt(mouse.x/25)
|
||||||
|
context.activeObject.currentFrameNum = frameNum
|
||||||
|
updateLayers()
|
||||||
|
updateMenu()
|
||||||
|
})
|
||||||
let highlightedFrame = false
|
let highlightedFrame = false
|
||||||
layer.frames.forEach((frame, i) => {
|
layer.frames.forEach((frame, i) => {
|
||||||
// for (let j=0; j<5-i; j++) {
|
// for (let j=0; j<5-i; j++) {
|
||||||
let frameEl = document.createElement("div")
|
let frameEl = document.createElement("div")
|
||||||
frameEl.className = "frame"
|
frameEl.className = "frame"
|
||||||
|
frameEl.setAttribute("frameNum", i)
|
||||||
|
// frameEl.addEventListener("click", () => {
|
||||||
|
// context.activeObject.currentFrameNum = frameEl.getAttribute("frameNum")
|
||||||
|
// updateLayers()
|
||||||
|
// })
|
||||||
if (i == context.activeObject.currentFrameNum) {
|
if (i == context.activeObject.currentFrameNum) {
|
||||||
frameEl.classList.add("active")
|
frameEl.classList.add("active")
|
||||||
highlightedFrame = true
|
highlightedFrame = true
|
||||||
|
|
@ -1910,13 +1990,17 @@ function updateLayers() {
|
||||||
|
|
||||||
async function updateMenu() {
|
async function updateMenu() {
|
||||||
let activeFrame;
|
let activeFrame;
|
||||||
|
let activeKeyframe;
|
||||||
let newFrameMenuItem;
|
let newFrameMenuItem;
|
||||||
let newKeyframeMenuItem;
|
let newKeyframeMenuItem;
|
||||||
let deleteFrameMenuItem;
|
let deleteFrameMenuItem;
|
||||||
|
|
||||||
|
activeKeyframe = false
|
||||||
if (context.activeObject.activeLayer.frames[context.activeObject.currentFrameNum]) {
|
if (context.activeObject.activeLayer.frames[context.activeObject.currentFrameNum]) {
|
||||||
activeFrame = true
|
activeFrame = true
|
||||||
|
if (context.activeObject.activeLayer.frames[context.activeObject.currentFrameNum].frameType=="keyframe") {
|
||||||
|
activeKeyframe = true
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
activeFrame = false
|
activeFrame = false
|
||||||
}
|
}
|
||||||
|
|
@ -1985,12 +2069,12 @@ async function updateMenu() {
|
||||||
newFrameMenuItem = {
|
newFrameMenuItem = {
|
||||||
text: "New Frame",
|
text: "New Frame",
|
||||||
enabled: !activeFrame,
|
enabled: !activeFrame,
|
||||||
action: () => {}
|
action: addFrame
|
||||||
}
|
}
|
||||||
newKeyframeMenuItem = {
|
newKeyframeMenuItem = {
|
||||||
text: "New Keyframe",
|
text: "New Keyframe",
|
||||||
enabled: !activeFrame,
|
enabled: !activeKeyframe,
|
||||||
action: () => {}
|
action: addKeyframe
|
||||||
}
|
}
|
||||||
deleteFrameMenuItem = {
|
deleteFrameMenuItem = {
|
||||||
text: "Delete Frame",
|
text: "Delete Frame",
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue