Advertisement
Guest User

Untitled

a guest
Jul 3rd, 2015
217
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 5.67 KB | None | 0 0
  1. (defn draw-fn [gl driver programs]
  2. (fn [state]
  3. (let [{:keys [p mv
  4. color-texture specular-texture
  5. sphere
  6. model
  7. rotation]} (:scene state)
  8. now (/ (.getTime (js/Date.)) 50)
  9. rotation (- (utils/deg->rad now))
  10. program (get programs :simple)
  11. point-lighting-location {:data #js[-10 4 0]
  12. :immutable? false}
  13. square-mv (-> mv
  14. ;;(geom/translate [(* rotation 4) -0.5 -5])
  15. (geom/translate [(* (js/Math.sin (/ now 8)) 4) (* (js/Math.cos (/ now 3)) 2) -5])
  16. (geom/* (-> (mat/matrix44)
  17. (geom/rotate-around-axis [0 1 0] rotation)
  18. (geom/rotate-around-axis [1 0 0] (- (/ js/Math.PI 3)))))
  19. object-array)
  20. model-mv (-> mv
  21. (geom/translate [0 -0.5 -2.5])
  22. (geom/* (-> M44
  23. (geom/rotate-around-axis [1 0 0] (- (/ js/Math.PI 2))))))
  24. sphere-mv (-> mv
  25. (geom/translate [-3 -0.5 -2.5])
  26. (geom/* (-> M44
  27. (geom/rotate-around-axis [0 1 0] rotation)
  28. (geom/rotate-around-axis [1 0 0] (- (/ js/Math.PI 2))))))
  29. scene-data (-> (get-data p model-mv (:vertices model) (:normals model) color-texture (:texture-coords model) point-lighting-location #js[0.2 0.2 0.2] #js[0.2 0.2 0.2] #js[0.2 0.2 0.2])
  30. (select-keys (get-in programs [:specular :inputs]))
  31. (assoc {:tag :element-index} (:indices model)))
  32. screen-data (-> (get-data p model-mv (:vertices laptop-screen) (:normals laptop-screen) (get-in state [:framebuffer :color])
  33. (:texture-coords laptop-screen) point-lighting-location #js[0.2 0.2 0.2] #js[0.2 0.2 0.2] #js[0.2 0.2 0.2])
  34. (select-keys (get-in programs [:specular :inputs]))
  35. (assoc {:tag :element-index} (:indices model)))
  36. sphere-data (-> (get-data p sphere-mv (:vertices sphere) (:normals sphere) color-texture (:texture-coords sphere) point-lighting-location #js[0.2 0.2 0.2] #js[0.2 0.2 0.2] #js[0.2 0.2 0.2])
  37. (select-keys (get-in programs [:specular :inputs]))
  38. (assoc {:tag :element-index} (:indices sphere)))
  39. screen-texture-data {progs/u-p-matrix p
  40. progs/u-mv-matrix square-mv
  41. progs/a-position (get-in state [:scene :square-vertices])
  42. progs/a-color (get-in state [:scene :square-colors])}]
  43. (.clear gl (bit-or (.-COLOR_BUFFER_BIT gl) (.-DEPTH_BUFFER_BIT gl)))
  44. ;; First draw to the framebuffer
  45. (.viewport gl 0 0 512 512)
  46. (.bindFramebuffer gl ggl/FRAMEBUFFER (get-in state [:framebuffer :frame-buffer]))
  47. (.clear gl (bit-or (.-COLOR_BUFFER_BIT gl) (.-DEPTH_BUFFER_BIT gl)))
  48. ;; 1. This draw call ends up in the frame buffer to be used as a texture
  49. (gd/bind driver (get programs :simple) screen-texture-data)
  50. (gd/draw-arrays driver (get programs :simple) {:draw-mode :triangle-strip
  51. :count 4} (:framebuffer state))
  52. ;; 2. This doesn't generate any errors, and does not end up in the frame buffer
  53. (gd/bind driver (get programs :specular) sphere-data)
  54. (gd/draw-elements driver (get programs :specular) {:draw-mode :triangles
  55. :first 0
  56. :count (get-in sphere [:indices :count])} (:framebuffer state))
  57. ;; Reset the viewport, bind our framebuffer as a texture, and draw the "real" scene
  58. (.viewport gl 0 0 (get-in state [:canvas :width]) (get-in state [:canvas :height]))
  59. (.bindTexture gl ggl/TEXTURE_2D (get-in state [:framebuffer :color :texture]))
  60. (gd/bind driver (get programs :specular) screen-data)
  61. (gd/draw-arrays driver (get programs :specular) {:draw-mode :triangle-strip
  62. :count 4})
  63. (gd/draw-elements driver (gd/bind driver (get programs :specular) scene-data) {:draw-mode :triangles
  64. :first 0
  65. :count (get-in model [:indices :count])})
  66. ;; 3. Same call as #2, gets drawn properly
  67. (gd/draw-elements driver (gd/bind driver (get programs :specular) sphere-data) {:draw-mode :triangles
  68. :first 0
  69. :count (get-in sphere [:indices :count])}))))
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement