Last active
March 22, 2017 04:30
-
-
Save selfsame/cb97a5f34b5c611641d3 to your computer and use it in GitHub Desktop.
spermwhale
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
(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