Actual blob shading yaaay
This commit is contained in:
parent
326bd01c7a
commit
9d95bc980b
|
@ -1,5 +1,21 @@
|
|||
void main()
|
||||
{
|
||||
// Setting Each Pixel To Red
|
||||
gl_FragColor = vec4(1.0, 1.0, 0.0, 1.0);
|
||||
varying vec2 xy;
|
||||
uniform vec4 blobs[10];
|
||||
|
||||
float doBlob(vec4 blob) {
|
||||
vec2 s = pow(blob.xy - xy, vec2(2.0, 2.0));
|
||||
return 1.0 / ((s.x / blob.z) + (s.y / blob.w));
|
||||
}
|
||||
void main() {
|
||||
float v = 0.0;
|
||||
for (int i = 0; i < 10; i ++) {
|
||||
v += doBlob(blobs[i]/*vec4(0.3, 0.3, 0.1, 0.1)*/);
|
||||
}
|
||||
float celledge = min(fract(xy.x), fract(xy.y));
|
||||
float majorxy = (fract(xy.x) < fract(xy.y)) ? xy.x : xy.y;
|
||||
float cell = (mod(abs(floor(majorxy)), 2.0) + 1.0) / 2.0;
|
||||
|
||||
gl_FragColor = v > 0.32 ? vec4(1.0, 1.0, 1.0, 1.0) :
|
||||
(v > 0.3 ? vec4(v, v, v, 1.0) :
|
||||
(celledge < 0.01 ? vec4(cell, cell, cell, 1.0)
|
||||
: vec4(0.0, 0.0, 0.0, 0.0)));
|
||||
}
|
||||
|
|
|
@ -1,5 +1,6 @@
|
|||
void main()
|
||||
{
|
||||
// Transforming The Vertex
|
||||
varying vec2 xy;
|
||||
|
||||
void main() {
|
||||
gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex;
|
||||
xy = vec2(gl_MultiTexCoord0);
|
||||
}
|
||||
|
|
38
src/celldiv/blob.clj
Normal file
38
src/celldiv/blob.clj
Normal file
|
@ -0,0 +1,38 @@
|
|||
(ns celldiv.blob
|
||||
(:import [org.newdawn.slick.opengl.renderer Renderer SGL]
|
||||
[org.lwjgl BufferUtils]
|
||||
[org.lwjgl.opengl ARBShaderObjects])
|
||||
(:require [hottub.resource :as res]))
|
||||
|
||||
(def minx -3)
|
||||
(def maxx 3)
|
||||
(def miny -3)
|
||||
(def maxy 3)
|
||||
(def GL (Renderer/get))
|
||||
(def blobbuf (BufferUtils/createFloatBuffer (* 4 10)))
|
||||
(def emptyblob {:x 0 :y 0 :scalex 0 :scaley 0})
|
||||
|
||||
(defn with-blob-shader [f & args]
|
||||
(let [shader (res/get-shader "res/shader/blob")]
|
||||
(.bind shader)
|
||||
(apply f shader args)
|
||||
(.unbind shader)))
|
||||
|
||||
(defn draw-blobs [shader blobs x y w h]
|
||||
(.glBegin GL SGL/GL_QUADS)
|
||||
(let [blobs (take 10 (concat blobs (cycle [emptyblob])))
|
||||
floats (flatten (map (fn [{:keys [x y scalex scaley]}] [x y scalex scaley]) blobs))]
|
||||
(.rewind blobbuf)
|
||||
(doseq [v floats] (.put blobbuf (float v)))
|
||||
(.rewind blobbuf)
|
||||
(ARBShaderObjects/glUniform4ARB (.getUniformID shader "blobs") blobbuf))
|
||||
(.glTexCoord2f GL minx miny)
|
||||
(.glVertex3f GL x y 0)
|
||||
(.glTexCoord2f GL minx maxy)
|
||||
(.glVertex3f GL x (+ y h) 0)
|
||||
(.glTexCoord2f GL maxx maxy)
|
||||
(.glVertex3f GL (+ x w) (+ y h) 0)
|
||||
(.glTexCoord2f GL maxx miny)
|
||||
(.glVertex3f GL (+ x w) y 0)
|
||||
(.glEnd GL))
|
||||
|
|
@ -4,7 +4,8 @@
|
|||
[hottub.resource :as res]
|
||||
[hottub.timeline :as tln]
|
||||
[hottub.screen :as scr]
|
||||
[hottub.util :as u]))
|
||||
[hottub.util :as u]
|
||||
[celldiv.blob :as blob]))
|
||||
|
||||
(defn -main [& args]
|
||||
(res/start-resource-expiry-thread)
|
||||
|
@ -41,13 +42,12 @@
|
|||
|
||||
(defn render-gs [gs g]
|
||||
(gs/with-gs gs
|
||||
(let [shader (res/get-shader "res/shader/blob")]
|
||||
(.bind shader)
|
||||
(.fillRect g 0 0 100 100)
|
||||
(.unbind shader))
|
||||
(doseq [sprite (gs/q :type :sprite)]
|
||||
(if-let [image (res/get-image (:image sprite))]
|
||||
(.draw image (:x sprite) (:y sprite))))))
|
||||
(.draw image (:x sprite) (:y sprite))))
|
||||
(blob/with-blob-shader blob/draw-blobs
|
||||
[{:x 0.3 :y 0.4 :scalex 0.2 :scaley 0.3}
|
||||
{:x -0.3 :y -0.4 :scalex 0.5 :scaley 0.3}] 0 0 300 300)))
|
||||
|
||||
(defmethod slick/update-game :game [screen inputtln delta]
|
||||
(if-let [input (tln/timeline-last-value inputtln)]
|
||||
|
@ -89,7 +89,7 @@
|
|||
tln (:tln subscreen)
|
||||
ts (tln/time-nearest tln (:ts screen))
|
||||
gs (last (get tln ts))]
|
||||
(render-gs gs)))
|
||||
(render-gs gs graphics)))
|
||||
|
||||
;;; repl helpers
|
||||
(def ^:dynamic g nil)
|
||||
|
|
Loading…
Reference in a new issue