diff --git a/project.clj b/project.clj index 18b64d1..799b3ad 100644 --- a/project.clj +++ b/project.clj @@ -13,7 +13,9 @@ [org.clojure/core.async "0.4.474"] [jarohen/chord "0.8.1"] [ring "1.7.0-RC1"] - [compojure "1.6.1"]] + [compojure "1.6.1"] + [reagent "0.8.1"] + [secretary "1.2.3"]] :plugins [[lein-figwheel "0.5.16"] [lein-cljsbuild "1.1.7" :exclusions [[org.clojure/clojure]]]] @@ -24,15 +26,7 @@ [{:id "dev" :source-paths ["src"] - ;; The presence of a :figwheel configuration here - ;; will cause figwheel to inject the figwheel client - ;; into your build - :figwheel {:on-jsload "sliva.core/on-js-reload" - ;; :open-urls will pop open your application - ;; in the default browser once Figwheel has - ;; started and compiled your application. - ;; Comment this out once it no longer serves you. - :open-urls ["http://localhost:3449/index.html"]} + :figwheel {:on-jsload "sliva.core/init-app"} :compiler {:main sliva.core :asset-path "js/compiled/out" @@ -67,7 +61,7 @@ ;; doesn't work for you just run your own server :) (see lein-ring) - :ring-handler sliva.server/routes + :ring-handler sliva.server/handler ;; To be able to open files in your editor from the heads up display ;; you will need to put a script on your path. diff --git a/resources/public/index.html b/resources/public/index.html index 03287b8..a62658c 100644 --- a/resources/public/index.html +++ b/resources/public/index.html @@ -10,7 +10,7 @@
- + diff --git a/src/sliva/core.cljs b/src/sliva/core.cljs index 5bf1e1a..911a38e 100644 --- a/src/sliva/core.cljs +++ b/src/sliva/core.cljs @@ -1,144 +1,32 @@ (ns sliva.core - (:require [sliva.ctl :refer [websocket-init vtic]] - [cljs.core.async :refer [>!]]) + (:require + [secretary.core :as secretary :refer-macros [defroute]] + [reagent.core :as reagent] + [sliva.data :refer [appstate]] + [sliva.routes :refer [app-routes]] + [sliva.pages.hub :refer [hub]]) (:require-macros [cljs.core.async.macros :refer [go go-loop]])) (enable-console-print!) (console.log "Hello, Sky!") -;;;;; ☭☭☭☭☭☭☭☭☭☭☭☭☭☭ ;;;;;; -;; ☭☭☭☭ Parametri razni ☭☭☭☭ ;; -;;;;; ☭☭☭☭☭☭☭☭☭☭☭☭☭☭ ;;;;;; +;; Page switching +(defmulti current-page #(@appstate :page)) +(defmethod current-page :hub [] hub) -(def odmik-kamere 100) -(def rotacija-kamere 1) -(def FOV 140) -(def lik-sirina 2) -(def obj-limit 1000) +;;(defn on-js-reload [] +;; (stop-render) +;; (start-render) +;; (websocket-init)) -(def objekti (atom [])) -(def stevec (atom 0)) +;; On figwheel reload do this (reload routes, render currently active page) +(defn init-app [] + (app-routes) + (reagent/render [current-page] (.getElementById js/document "container"))) -(def rotacija-x 0.006) -(def rotacija-y 0.001) -(def rotacija-z 0.003) - -(def zamik-barve 0.0000666) -(def zacetna-barva 0.333) -(def saturacija 1) -(def svetlost 0.4) - -(def w-diff 0.5) -(def gostota-obj 2) - -;; Inicializacija ;; - -(def scena (THREE.Scene.)) - -(def kamera (THREE.PerspectiveCamera. FOV (/ (.-innerWidth js/window) - (.-innerHeight js/window)) 0.1 2000)) -(aset kamera "position" "z" odmik-kamere) -(aset kamera "aspect" (/ (.-innerWidth js/window) - (.-innerHeight js/window))) -(.updateProjectionMatrix kamera) - -(def izris (THREE.WebGLRenderer. (js-obj "alpha" true))) -(.setSize izris (.-innerWidth js/window) (.-innerHeight js/window)) - -;; Crno ozadje -(.setClearColor izris 0x000000 1) - -(defn dodaj-obj [sirina] - (let [barva (js/THREE.Color.) - mat (js/THREE.LineBasicMaterial.) - geo (js/THREE.Geometry.) - koti (.-vertices geo) - zamik (/ sirina 2) - -zamik (* -1 zamik)] - - ;; Nastavi barvo novega objekta - (.setHSL barva (* @stevec zacetna-barva) saturacija svetlost) - (aset mat "color" barva) - - ;; Kvadratek (za nov objekt) - (.push koti (js/THREE.Vector3. -zamik 0 0) (js/THREE.Vector3. 0 zamik 0)) - (.push koti (js/THREE.Vector3. -zamik 0 0) (js/THREE.Vector3. 0 -zamik 0)) - (.push koti (js/THREE.Vector3. zamik 0 0) (js/THREE.Vector3. 0 zamik 0)) - (.push koti (js/THREE.Vector3. zamik 0 0) (js/THREE.Vector3. 0 -zamik 0)) - - (let [obj (js/THREE.Line. geo mat (.-LineSegments js/THREE)) - novi-objekti (conj (take obj-limit @objekti) - obj)] - (.add scena obj) - - ;; pucaj sceno ane - (reset! objekti novi-objekti)))) - -(defn obj-anim [obj] - (.rotateY obj rotacija-y) - (.rotateZ obj rotacija-z) - (.rotateX obj rotacija-x) - - (let [new-scale (+ (aget obj "scale" "x") - w-diff)] - (aset obj "scale" "x" new-scale) - (aset obj "scale" "y" new-scale) - (aset obj "scale" "z" new-scale)) - - (.offsetHSL (aget obj "material" "color") zamik-barve 0 0)) - -(defn cam-rotate [] - (.translateX kamera rotacija-kamere) - (.translateZ kamera (- odmik-kamere - (.sqrt js/Math (+ (.pow js/Math odmik-kamere 2) - (.pow js/Math rotacija-kamere 2))))) - (.lookAt kamera scena.position)) - -(defn render [] - (.requestAnimationFrame js/window render) - - (reset! stevec (inc @stevec)) - - (if (= 0 (rem @stevec gostota-obj)) - (dodaj-obj lik-sirina)) - - (.render izris scena kamera) - - (run! obj-anim @objekti) - (cam-rotate)) - -(defn start-render [] - (let [container (.getElementById js/document "container")] - (.appendChild container (.-domElement izris)))) - -(defn stop-render [] - (let [container (.getElementById js/document "container")] - (.removeChild container (.-firstChild container)))) - -;; Zacetek ;; +;; Vstopna tocka (aset js/document "onreadystatechange" (fn [] (if (= (.-readyState js/document) "complete") - (do - (start-render) - (render) - (websocket-init))))) - -(defn on-js-reload [] - (stop-render) - (start-render) - (websocket-init)) - -;; Hendlaj risajz -(defn on-window-resize[] - (let [sirina (.-innerWidth js/window) - visina (.-innerHeight js/window)] - (aset kamera "aspect" (/ sirina visina)) - (.updateProjectionMatrix kamera) - (.setSize izris sirina visina))) -(.addEventListener js/window "resize" on-window-resize false) - -(.addEventListener js/window "click" (fn [] - (go [] - (>! @vtic "ping")))) + (init-app)))) diff --git a/src/sliva/ctl.cljs b/src/sliva/ctl.cljs deleted file mode 100644 index 3158b35..0000000 --- a/src/sliva/ctl.cljs +++ /dev/null @@ -1,22 +0,0 @@ -(ns sliva.ctl - (:require [chord.client :refer [ws-ch]] - [cljs.core.async :refer [! put! close! chan]]) - (:require-macros [cljs.core.async.macros :refer [go go-loop]])) - -(def vtic (atom (chan))) - -(defn websocket-init [] - (console.log "init webscoket") - (go (let [{:keys [ws-channel error]} (! ws-channel "Hello server") - - ;; (go-loop [] - ;; (let [{:keys [message]} (! put! close! go go-loop]] - [clojure.string :as str])) - -(defn socket-handler [request] - (let [cid (java.util.UUID/randomUUID)] - (with-channel request ws-ch - (go - (let [{:keys [message]} (! ws-ch (str "Hello " cid)) - (go-loop [] - (let [{:keys [message]} (! ws-ch "pong") - - "Unknown command :/")) - (recur)))))))) - ;;(close! ws-ch))))) + [sliva.server.handlers :refer [socket-handler]])) +;; wat (defroutes routes - (GET "/" [] (resource-response "index.html" {:root "public"})) + ;;(GET "/" [] (resource-response "index.html" {:root "public"})) (GET "/hello" [] "wat") (GET "/ws" [] socket-handler) (resources "/")) diff --git a/src/sliva/server/handlers.clj b/src/sliva/server/handlers.clj new file mode 100644 index 0000000..7a6ee84 --- /dev/null +++ b/src/sliva/server/handlers.clj @@ -0,0 +1,37 @@ +(ns sliva.server.handlers + (:require [compojure.core :refer [defroutes GET]] + [compojure.route :refer [resources]] + [clojure.string :as str] + [clojure.core.async :refer [chan ! put! close! go go-loop]] + [ring.util.response :refer [resource-response]] + [ring.middleware.reload :refer [wrap-reload]] + [chord.http-kit :refer [with-channel]])) + +(def clients (atom {})) + +(defn send-all [& args] + (println "sending to all" args (keys @clients)) + (doseq [conn @clients] + (println "sending" args) + (put! (val conn) (str/join ":" args)))) + +(defn socket-handler [request] + (let [cid (java.util.UUID/randomUUID)] + (with-channel request ws-ch + (go + (let [{:keys [message]} (! ws-ch (str "Hello " cid)) + (swap! clients assoc cid ws-ch) + (send-all "open" cid) + (go-loop [] + (let [{:keys [message]} (! ws-ch "pong") + + "Unknown command :/")) (keys @clients) + (recur)))))))) +;;(close! ws-ch))))) diff --git a/src/sliva/socket.cljs b/src/sliva/socket.cljs new file mode 100644 index 0000000..0439517 --- /dev/null +++ b/src/sliva/socket.cljs @@ -0,0 +1,35 @@ +(ns sliva.socket + (:require [chord.client :refer [ws-ch]] + [cljs.core.async :refer [! put! close!]] + [sliva.data :refer [vtic]]) + (:require-macros [cljs.core.async.macros :refer [go go-loop]])) + +;; Zacetek ;; +;;(aset js/document "onreadystatechange" +;; (fn [] +;; (if (= (.-readyState js/document) "complete") +;; (do +;; (start-render) +;; (render) +;; (websocket-init))))) + +(defn websocket-init [] + (console.log "init webscoket") + (go (let [{:keys [ws-channel error]} (! ws-channel "Hello server") + + ;; (go-loop [] + ;; (let [{:keys [message]} (! @vtic "ping")))))