{"action":"closed","issue":{"url":"https://api.github.com/repos/wonderunit/storyboarder/issues/1072","repository_url":"https://api.github.com/repos/wonderunit/storyboarder","labels_url":"https://api.github.com/repos/wonderunit/storyboarder/issues/1072/labels{/name}","comments_url":"https://api.github.com/repos/wonderunit/storyboarder/issues/1072/comments","events_url":"https://api.github.com/repos/wonderunit/storyboarder/issues/1072/events","html_url":"https://github.com/wonderunit/storyboarder/issues/1072","id":310516357,"node_id":"MDU6SXNzdWUzMTA1MTYzNTc=","number":1072,"title":"Implement new version of Sketchpane","user":{"login":"setpixel","id":441117,"node_id":"MDQ6VXNlcjQ0MTExNw==","avatar_url":"https://avatars2.githubusercontent.com/u/441117?v=4","gravatar_id":"","url":"https://api.github.com/users/setpixel","html_url":"https://github.com/setpixel","followers_url":"https://api.github.com/users/setpixel/followers","following_url":"https://api.github.com/users/setpixel/following{/other_user}","gists_url":"https://api.github.com/users/setpixel/gists{/gist_id}","starred_url":"https://api.github.com/users/setpixel/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/setpixel/subscriptions","organizations_url":"https://api.github.com/users/setpixel/orgs","repos_url":"https://api.github.com/users/setpixel/repos","events_url":"https://api.github.com/users/setpixel/events{/privacy}","received_events_url":"https://api.github.com/users/setpixel/received_events","type":"User","site_admin":false},"labels":[{"id":505739539,"node_id":"MDU6TGFiZWw1MDU3Mzk1Mzk=","url":"https://api.github.com/repos/wonderunit/storyboarder/labels/enhancement","name":"enhancement","color":"84b6eb","default":true}],"state":"closed","locked":false,"assignee":{"login":"audionerd","id":23459,"node_id":"MDQ6VXNlcjIzNDU5","avatar_url":"https://avatars2.githubusercontent.com/u/23459?v=4","gravatar_id":"","url":"https://api.github.com/users/audionerd","html_url":"https://github.com/audionerd","followers_url":"https://api.github.com/users/audionerd/followers","following_url":"https://api.github.com/users/audionerd/following{/other_user}","gists_url":"https://api.github.com/users/audionerd/gists{/gist_id}","starred_url":"https://api.github.com/users/audionerd/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/audionerd/subscriptions","organizations_url":"https://api.github.com/users/audionerd/orgs","repos_url":"https://api.github.com/users/audionerd/repos","events_url":"https://api.github.com/users/audionerd/events{/privacy}","received_events_url":"https://api.github.com/users/audionerd/received_events","type":"User","site_admin":false},"assignees":[{"login":"audionerd","id":23459,"node_id":"MDQ6VXNlcjIzNDU5","avatar_url":"https://avatars2.githubusercontent.com/u/23459?v=4","gravatar_id":"","url":"https://api.github.com/users/audionerd","html_url":"https://github.com/audionerd","followers_url":"https://api.github.com/users/audionerd/followers","following_url":"https://api.github.com/users/audionerd/following{/other_user}","gists_url":"https://api.github.com/users/audionerd/gists{/gist_id}","starred_url":"https://api.github.com/users/audionerd/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/audionerd/subscriptions","organizations_url":"https://api.github.com/users/audionerd/orgs","repos_url":"https://api.github.com/users/audionerd/repos","events_url":"https://api.github.com/users/audionerd/events{/privacy}","received_events_url":"https://api.github.com/users/audionerd/received_events","type":"User","site_admin":false}],"milestone":{"url":"https://api.github.com/repos/wonderunit/storyboarder/milestones/8","html_url":"https://github.com/wonderunit/storyboarder/milestone/8","labels_url":"https://api.github.com/repos/wonderunit/storyboarder/milestones/8/labels","id":2628599,"node_id":"MDk6TWlsZXN0b25lMjYyODU5OQ==","number":8,"title":"V2","description":"","creator":{"login":"setpixel","id":441117,"node_id":"MDQ6VXNlcjQ0MTExNw==","avatar_url":"https://avatars2.githubusercontent.com/u/441117?v=4","gravatar_id":"","url":"https://api.github.com/users/setpixel","html_url":"https://github.com/setpixel","followers_url":"https://api.github.com/users/setpixel/followers","following_url":"https://api.github.com/users/setpixel/following{/other_user}","gists_url":"https://api.github.com/users/setpixel/gists{/gist_id}","starred_url":"https://api.github.com/users/setpixel/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/setpixel/subscriptions","organizations_url":"https://api.github.com/users/setpixel/orgs","repos_url":"https://api.github.com/users/setpixel/repos","events_url":"https://api.github.com/users/setpixel/events{/privacy}","received_events_url":"https://api.github.com/users/setpixel/received_events","type":"User","site_admin":false},"open_issues":55,"closed_issues":59,"state":"open","created_at":"2017-07-08T02:25:46Z","updated_at":"2018-06-01T16:21:01Z","due_on":null,"closed_at":null},"comments":3,"created_at":"2018-04-02T15:29:27Z","updated_at":"2018-06-01T16:21:01Z","closed_at":"2018-06-01T16:21:01Z","author_association":"COLLABORATOR","body":"Implement new version of Sketchpane in Storyboarder based on our work on Alchemancy. You can test the online demo here in chrome: https://wonderunit.github.io/alchemancy/\r\n\r\n### Tasks\r\n\r\n- [x] live stroke alpha\r\n- [x] fix live layer going over layers\r\n- [x] reference layer opacity bug when switching to eraser?\r\n- [x] eraser multi-erase fail?\r\n- [x] tools drawing on wrong layers?\r\n- [x] undo/redo pre-multiply weirdness?\r\n- [x] hook up grain scale in brush shader\r\n\r\nProfiling\r\n- [x] Memory use goes up and frame rate goes down during a session of drawing with many strokes. Profile to determine the cause of the memory leaks.\r\n\r\nBrush Definitions\r\n- [x] Load from a JSON file\r\n- [x] Reference images in JSON file\r\n- [x] Add Tone\r\n- [x] Re-order brush tools\r\n- [x] Assign key commands to brush tools (1-7). Will need to think about how this changes keymap loading.\r\n\r\nFile > Exporting\r\n- [x] Export Animated GIF (fails on getCanvasSize) `exporter#exportAnimatedGif`\r\n- [x] Export Scene for Final Cut Pro X\r\n- [x] Export Scene as Images\r\n- [ ] Export to Web\r\n- [x] Export Project as ZIP\r\n\r\nFile\r\n- [x] Cleanup Scene\r\n- [x] Print to PDF\r\n- [x] Print a Worksheet\r\n- [x] Import Worksheet (fails on getCanvasSize)\r\n- [x] Import Images (fails on getCanvasSize)\r\n- [x] Import Image from mobile server (importImage)\r\n\r\nEdit\r\n- [x] Copy\r\n  - [x] Copying a very new board and attempting to paste fails with an `Could not load image` from common#getCanvasImageSourcesDataForBoard\r\n- [x] Paste\r\n  - [x] Reference layer should show default opacity 0.75 when thumbnailing post-paste\r\n  - [x] SketchPane should respect layer opacity when compositing\r\n- [x] Duplicate Board\r\n- [x] Re-ordering Boards\r\n- [x] New Board\r\n\r\nTools\r\n- [x] Flip Horizontal\r\n- [x] Flip Vertical\r\n\r\n- [x] Edit in Photoshop (should save to PSD, read PSD on change, update on window refocus)\r\n- [x] Thumbnail does not always update\r\n\r\nHelp\r\n- [x] Key Commands (need to tie in keys for Quick Erase again?)\r\n\r\nToolbar UI\r\n- [x] Palette Color\r\n  - [x] Loading and Setting from prefs\r\n  - [x] Storing Per-Brush\r\n\r\n- [x] Grid Guide\r\n- [x] Center Guide\r\n- [x] Thirds Guide\r\n- [x] 3D Guide\r\n- [x] Onion Skin\r\n  - [x] One below, then layer, then one above\r\n  - [x] Multiply blend mode\r\n  - [x] Test with white backgrounded images\r\n  - [x] Test with multi-scene projects (script-based)\r\n\r\n- [x] Captions\r\n\r\nInput Modes:\r\n- [x] Move Mode\r\n- [x] Scale Mode\r\n- [x] \"Locked\" Mode\r\n  - [x] setIsLocked\r\n  - [x] preventIfLocked\r\n  - [x] onDblClick\r\n  - [x] 'requestUnlock' event\r\n\r\n- [x] Add White back to color picker\r\n\r\n- Sketch Sprint / Pomodoro https://github.com/wonderunit/storyboarder/issues/1125\r\n\r\nTimeline\r\n...\r\n\r\nShot Generator\r\n- [x] Drawing to Layer\r\n\r\nLayer UI\r\n- [x] Merge Down\r\n- [x] Merge Up\r\n- [x] Layer Opacity Slider\r\n- [x] Layer Clear Button\r\n\r\nDrawing\r\n- [x] Line Mileage Counter\r\n- [x] Re-integrate Sound Events (Sonifier)\r\n- [x] Prevent drawing when locked\r\n- [ ] Prevent drawing if pointer is on a UI element above the stage?\r\n\r\nSketchPane\r\n- [x] consistent browser cursor setting (currently flashes sometimes)\r\n- [x] hide cursor until first pointer event\r\n- [x] Fix bug where mouse cursor sprite texture is clipped\r\n- [x] layer opacity feature?\r\n- [x] live sketch layer should match opacity of the layer it is drawing on\r\n- [ ] check for memory leaks\r\n  - [ ] PIXI.utils.clearTextureCache()\r\n  - [ ] dispose canvases, textures\r\n  - [ ] https://developers.google.com/web/tools/chrome-devtools/memory-problems/\r\n\r\nMisc\r\n- rename grain* in shader (grainMovement, grainScale, grainZoom, etc) for clarity\r\n- [x] test packaging the app. make sure brushes are loading properly\r\n- review uses of getCanvasSize\r\n- review uses of getLayerCanvas, getLayerCanvasByName\r\n- review remaining TODOs added in PR commits\r\n\r\n- replace direct references to storyboarderSketchPane.sketchPane with storyboarderSketchPane helper methods\r\n- cleanup copyBoard logic\r\n  - can saveImageFile be sync instead of async?\r\n- review each place where markImageFileDirty([..]) is set manually and determine if it is still necessary\r\n\r\n### SketchPane\r\n\r\nReview replaceTexture, draw, replace, etc. Try to unify.\r\n\r\nWe need to set Layer textures from:\r\n- Canvases (for Guides and Onion Skin)\r\n- Images (for reading layer files)\r\n- Display Objects (for internal operations)\r\n\r\nreplaceTexture destroys the existing texture entirely. Is this really necessary?\r\nDo we ever need to actually destroy and replace the existing texture, or can we\r\nalways just render to it? Is there any advantage to replacing the texture vs drawing to it?\r\nHow to cleanup after replaceTextureFromCanvas?\r\nBetter names for Layer#draw and Layer#replace?\r\nDo we even need Layer#replace?\r\n\r\n### CLEANUP\r\n- [x] Remove dead code commented out in PR if it is definitely no longer needed\r\n  - [x] cleanup storyboarder-sketch-pane.js\r\n- [x] Remove old SketchPane classes\r\n- [x] Remove old sketchpane-preview\r\n\r\n### FUTURE\r\n- Fix convoluted copy/paste logic (reducers for board, ensure save completes, run async + wait for complete before accepting new commands)\r\n- replace saveDataURLtoFile with utility fn\r\n- [x] onion skin: cancel loading images if we switch away boards\r\n- [x] cache images for re-use (say, a pool of the past 3 or 6 or something?) maybe filestamp/etag checking?\r\n\r\n### Related to the Mode Merge\r\n\r\nenableBrushCursor\r\nrefreshLinkedBoardByFilename\r\nupdateSketchPaneBoard\r\n  (replace uses of getLayerCanvasByName)\r\nisCursorOnDrawingArea and window vs container events\r\n  el canvasPointerDown\r\n  sketchPaneDOMElement pointerover\r\n  sketchPaneDOMElement pointerout\r\n    isCursorOnDrawingArea was used for conditional cursor rendering\r\ngetCanvasSize\r\nreview renderCursor\r\nreview onSketchPaneBeforeUp\r\nreview onSketchPaneOnUp\r\nadd analyticsTiming back / see onFrame\r\n\r\nenableDrawingSoundEffects\r\n\r\nmergeLayers\r\n\r\ninsertNewBoardsWithFiles (insertNewBoardsWithFiles)\r\n\r\nconsistent use of storyboarderSketchPane.replaceLayers. figure out what needs to save undo state and what doesn't. search for uses of layers[n].replace and determine if we should use storyboarderSketchPane.replaceLayers instead"}}
{"actor":{"display_login":"audionerd"}}