Skip to content

Instantly share code, notes, and snippets.

@skrat
Created December 3, 2018 17:58
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save skrat/90da7738d335dfe48973b8f80dce5a00 to your computer and use it in GitHub Desktop.
Save skrat/90da7738d335dfe48973b8f80dce5a00 to your computer and use it in GitHub Desktop.
(ns skrat.sketch-002.filament)
(def ^:dynamic *engine* nil)
(defn mat4
"Create new mat4"
[]
(. js/mat4 (create)))
(def VertexAttribute
js/Filament.VertexAttribute)
(def vPOSITION
(.-POSITION VertexAttribute))
(def vNORMAL
(.-NORMAL VertexAttribute))
(def vCOLOR
(.-COLOR VertexAttribute))
(def AttributeType
js/Filament.VertexBuffer$AttributeType)
(def aFLOAT2
(.-FLOAT2 AttributeType))
(def aUBYTE4
(.-UBYTE4 AttributeType))
(def IndexType
js/Filament.IndexBuffer$IndexType)
(def iUSHORT
(.-USHORT IndexType))
(def PrimitiveType
js/Filament.RenderableManager$PrimitiveType)
(def pTRIANGLES
(.-TRIANGLES PrimitiveType))
(def Projection
js/Filament.Camera$Projection)
(def pORTHO
(.-ORTHO Projection))
(defn engine
"Create engine for `canvas` element"
[canvas]
(. js/Filament.Engine (create canvas)))
(defn scene
"Create new scene"
[]
(. *engine* (createScene)))
(defn entity
"Create new entity"
[]
(.. js/Filament.EntityManager (get) (create)))
(defn vertex-buffer
"Create new vertex buffer builder"
[]
(.. js/Filament.VertexBuffer (Builder)))
(defn index-buffer
"Create new index buffer builder"
[]
(.. js/Filament.IndexBuffer (Builder)))
(defn material
"Create new material"
[url]
(. *engine* (createMaterial url)))
(defn material-instance
"Get material default instance"
[mat]
(. mat (getDefaultInstance)))
(defn swap-chain
"Create swap chain"
[]
(. *engine* (createSwapChain)))
(defn renderer
"Create new renderer"
[]
(. *engine* (createRenderer)))
(defn camera
"Create new camera"
[]
(. *engine* (createCamera)))
(defn view
"Create new view"
[]
(. *engine* (createView)))
(defn transform-manager
"Get transform manager"
[]
(. *engine* (getTransformManager)))
(defn get-instance
"Gets an Instance representing the transform component associated with the given Entity"
[tm e]
(. tm (getInstance e)))
(defn set-transform
"Set a local transform of a transform component"
[tm e tf]
(. tm (setTransform (get-instance tm e) tf)))
(defn add-entity
"Add entity to scene"
[scene entity]
(. scene (addEntity entity)))
(defn set-buffer-at
"Fill vertex buffer with data"
[vb idx buf]
(. vb (setBufferAt *engine* idx buf)))
(defn set-buffer
"Fill index buffer with data"
[ib buf]
(. ib (setBuffer *engine* buf)))
(defn set-camera
"Set view camera"
[view camera]
(. view (setCamera camera)))
(defn set-scene
"Set view scene"
[view scene]
(. view (setScene scene)))
(defn set-clear-color
"Set view clear color"
[view [r g b a]]
(. view (setClearColor #js [r g b a])))
(defn set-viewport
"Set view viewport"
[view [x y w h]]
(. view (setViewport #js [x y w h])))
(defn set-projection
"Set camera projection"
[camera proj left right bottom top near far]
(. camera (setProjection proj left right bottom top near far)))
(defn renderable-manager
"Create renederable manager builder"
[count]
(.. js/Filament.RenderableManager (Builder count)))
(defn build
"Build anything"
[builder & args]
(apply (.bind (.-build builder) builder) *engine* args))
(defn render
"Render"
[renderer swapchain view]
(. renderer (render swapchain view)))
(defn init
"Init Filament"
[deps canvas f]
(js/Filament.init
(clj->js deps)
#(binding [*engine* (engine canvas)] (f))))
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment