Skip to content

Instantly share code, notes, and snippets.

@selfsame
Last active March 22, 2017 04:30
Show Gist options
  • Save selfsame/cb97a5f34b5c611641d3 to your computer and use it in GitHub Desktop.
Save selfsame/cb97a5f34b5c611641d3 to your computer and use it in GitHub Desktop.
spermwhale
(ns biology.core
(:use hard.core hard.input hard.tween unity.messages)
(:require unity.core))
(defn scene-spermwhale [_]
(add [(find-name "Main Camera") :y] -3000 3 (fn [_] (load-scene "spermwhale"))))
(defn scene-options [_]
(add [(find-name "Main Camera") :x] -20 1 (fn [_] (load-scene "spermwhale"))))
(defn scene-information [_]
(add [(find-name "Main Camera") :x] 20 1 (fn [_] (load-scene "spermwhale"))))
(defn quit-game [_] (quit))
(defn item-down [gob]
(add [(child-component gob UnityEngine.TextMesh) :color] (color 1 0 0) 0.2))
(defn item-leave [gob]
(add [gob :euler] [0 -25 0] 0.2 :relative)
(add [(child-component gob UnityEngine.TextMesh) :color] (color 1 1 1) 0.2))
(defn item-enter [gob]
(add [(child-component gob UnityEngine.TextMesh) :color] (color 1 0.5 0) 0.2)
(add [gob :euler] [0 25 0] 0.2 :relative))
(defn shape-weight! [comp idx n]
(.SetBlendShapeWeight comp idx n))
(defn cos [n] (UnityEngine.Mathf/Cos n))
(defn sin [n] (UnityEngine.Mathf/Sin n))
(defn limit [n lb ub] (+ lb (* (+ n 1) (* (- ub lb) 0.5))))
(defn animate-background [this]
(let [delta UnityEngine.Time/time
waveh (* (cos (* delta 0.8)) 0.03)
s1 (* (limit (sin delta) 0.1 0.5) 80)
s2 (* (limit (cos (* delta 1.3)) 0.1 0.6) 100)
s3 (* (limit (sin (* delta 1.2) ) 0.1 0.7) 60)
npos (-v + (vec3 this) [0 waveh 0])
skin (child-component this UnityEngine.SkinnedMeshRenderer)]
(shape-weight! skin 0 s1)
(shape-weight! skin 1 s2)
(shape-weight! skin 2 s3)
(position! this npos)))
(def VEL (atom [0 0 0]))
(def LAST (atom [0 0 0]))
(def SPINE (atom 0))
(def BANK (atom 0))
(def POWER (atom 0))
(def SPLASHES (atom {}))
(defn update-whale [this delta]
(let [h (get-axis :horizontal)
v (get-axis :vertical)
pos (vec3 this)
grav (if (pos? (.y pos)) [0 -0.01 0] [0 0 0])
[ex ey ez] (unvec (rotation this))
smod (* v -0.5)
spine (if (pos? smod)
(if (> 20 (+ @SPINE smod)) smod 0)
(if (< -20 (+ @SPINE smod)) smod 0))]
(swap! SPINE #(+ % spine))
(swap! POWER #(Mathf/Clamp (+ (* % 0.99) (Mathf/Abs spine)) 0 10))
(reset! VEL (-v - pos @LAST))
(reset! LAST (unvec pos))
(mapv
(fn [s]
(let [bone (find-name s)]
(rotate! bone (vec3 [0 spine 0]))))
["tail1" "tail2" "tail3" "tail4" "tail5"])
(rotate! this (vec3 [h 0 (+ (* v 0.1) (* @SPINE 0.006 @POWER -1))]))
(unvec (position! this (-v + grav (-v - pos (-v * (.right (.transform this)) @POWER 0.05)))))))
(defn froth! [parent speed]
(do (let [child (clone! (resource "foam") (-v + (vec3 parent) [0 0.5 0]))
rot (-v * [(rand)(rand)(rand)] [360 360 360])]
(parent! child parent)
(local-scale! child [0.1 0.1 0.1])
(add [child :blend-shape 0] 100 (* speed 0.9))
(add [child :local-scale] [5 5 5] (* speed 0.9))
(add [child :euler] rot (* speed 0.9) :relative)
(add [child :position] (-v * [(rand) 0 (rand)] 0.5) speed :relative destroy!))))
(defn splash! [this]
(let [sps (GameObject/FindGameObjectsWithTag "splashpoint")]
(mapv (fn [sp]
(when (< -1 (.y (vec3 sp)) 1)
(let [spv3 (vec3 sp)
norm (.normalized (vec3 (-v - (vec3 sp) (vec3 this))))
velocity @VEL
mag (+ (.magnitude (vec3 velocity)) 0.1)
w-scale (-v + (-v * mag 0.1) 1)
center (vec3 (-v * (vec3 this) [1 0 1]))
speed (+ 0.6 mag)]
(when-not (get @SPLASHES sp)
(let [foam (clone! (resource "wave2") (-v * (vec3 sp) [1 0 1]))]
(local-scale! foam [0.1 0.1 0.1])
(parent! foam (find-name "splashfx"))
(.LookAt (.transform foam) center)
(rotate-around! foam center (vec3 [0 1 0]) (* (- (rand) 0.5) 45))
(swap! SPLASHES conj {sp foam})
(add [foam :local-scale] w-scale (* speed 0.3)
#(do (froth! % (* speed 0.6)) (add [% :local-scale] [0.1 0.1 0.1] (* speed 0.7))))
(add [foam :position] (-v * [1 0 1] (-v + norm (-v * velocity 2))) speed :relative)
(add [foam :y] 0 (* speed 1.1) #(do (destroy! %) (swap! SPLASHES dissoc sp))))))))
sps)))
(defn dive-start [this]
(let [whale (find-name "whale")
forward (unvec (.forward (.transform whale)))]
(reset! VEL (unvec (.forward (.transform whale))))))
(defn dive-update [this]
(let [delta UnityEngine.Time/deltaTime
whale (find-name "whale")
camera (find-name "whalecam")
[camx camy camz] (unvec (vec3 camera))
whale-pos (update-whale whale delta)
[whale-x whale-y whale-z] whale-pos
shaft (find-name "shaft")
cam-y (.y (vec3 camera))]
(position! camera (lerp (vec3 camera) [whale-x whale-y (- whale-z 60)] (* delta 2 )))
(when (and (pos? cam-y) (not (pos? (.y (vec3 camera)))))
(do (set! (.enabled (component shaft "MeshRenderer")) true)
(add [(find-name "sun") :light :intensity] 1.0 0.2)))
(when (and (not (pos? cam-y)) (pos? (.y (vec3 camera))))
(do (set! (.enabled (component shaft "MeshRenderer")) false)
(add [(find-name "sun") :light :intensity] 1.5 0.2)))
(position! shaft (-v * (vec3 shaft) [ 1 0 1]))
(when (key-up? "escape") (load-scene "menu"))
(when (< -12 whale-y 12)
(splash! whale))))
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment