🎉 Add first impl of wasm-friendly for Shape data structure

This commit is contained in:
Andrey Antukh 2024-10-24 18:35:57 +02:00
parent e7d7291947
commit 043c23899a
7 changed files with 300 additions and 78 deletions

View file

@ -276,18 +276,20 @@
(when ^boolean render.wasm/enabled?
(mf/with-effect []
(when-let [canvas (mf/ref-val canvas-ref)]
(time (when-let [canvas (mf/ref-val canvas-ref)]
(->> render.wasm/module
(p/fmap (fn [ready?]
(when ready?
(mf/set-ref-val! canvas-init true)
(render.wasm/assign-canvas canvas)))))
(fn []
(render.wasm/clear-canvas))))
(render.wasm/clear-canvas)))))
(mf/with-effect [vbox' base-objects]
(when (mf/ref-val canvas-init)
(render.wasm/draw-objects base-objects zoom vbox'))))
(mf/with-effect [vbox objects-modified]
(let [sem (when (mf/ref-val canvas-init)
(render.wasm/draw-objects objects-modified zoom vbox))]
(partial render.wasm/cancel-draw sem)))
)
(hooks/setup-dom-events zoom disable-paste in-viewport? read-only? drawing-tool drawing-path?)
(hooks/setup-viewport-size vport viewport-ref)

View file

@ -17,7 +17,8 @@
(defonce ^:dynamic internal-module #js {})
(defonce ^:dynamic internal-gpu-state #js {})
(defn draw-objects [objects zoom vbox]
(defn draw-objects
[objects zoom vbox]
(let [draw-rect (unchecked-get internal-module "_draw_rect")
translate (unchecked-get internal-module "_translate")
reset-canvas (unchecked-get internal-module "_reset_canvas")
@ -35,17 +36,24 @@
(translate gpu-state (- x) (- y)))
(run! (fn [shape]
;; (js/console.log "render-shape" (.-buffer shape))
(let [selrect (dm/get-prop shape :selrect)
x1 (dm/get-prop selrect :x1)
y1 (dm/get-prop selrect :y1)
x2 (dm/get-prop selrect :x2)
y2 (dm/get-prop selrect :y2)]
;; (prn (:id shape) selrect)
(draw-rect gpu-state x1 y1 x2 y2)))
(vals objects))
(flush gpu-state)))))
(def canvas-options
(defn cancel-draw
[sem]
(when (some? sem)
(js/cancelAnimationFrame sem)))
(def ^:private canvas-options
#js {:antialias true
:depth true
:stencil true

View file

@ -181,10 +181,12 @@
[state name]
(let [page-id (get state :current-page-id)
objects (get-in state [:workspace-data :pages-index page-id :objects])
result (or (d/seek (fn [[_ shape]] (= name (:name shape))) objects)
result (or (d/seek (fn [shape] (= name (:name shape))) (vals objects))
(get objects (uuid/uuid name)))]
(logjs name result)
nil))
#_(logjs name result)
result
#_nil))
(defn ^:export dump-object
[name]