(defmap kinetic-energy
(let [m %1, v %2]
(float3 (* 0.5 m (dot v v)))))
#extension GL_ARB_texture_rectangle : enable
varying vec2 __coord;
uniform vec2 __dim;
void main()
{
__coord = (gl_MultiTexCoord0.xy * __dim);
gl_Position = (gl_ModelViewProjectionMatrix * gl_Vertex);
}
#extension GL_ARB_texture_rectangle : enable
uniform sampler2DRect _tex0;
uniform sampler2DRect _tex1;
varying vec2 __coord;
uniform vec2 __dim;
void main()
{
float m = texture2DRect(_tex0, __coord).x;
vec3 v = texture2DRect(_tex1, __coord).xyz;
gl_FragData[0] = vec4(vec3(((0.5 * m) * dot(v, v))), 1.0);
}
(defreduce sum (+ %1 %2))
#extension GL_ARB_texture_rectangle : enable
varying vec2 __coord;
uniform vec2 __dim;
void main()
{
__coord = (gl_MultiTexCoord0.xy * __dim);
gl_Position = (gl_ModelViewProjectionMatrix * gl_Vertex);
}
#extension GL_ARB_texture_rectangle : enable
uniform sampler2DRect __data;
uniform vec2 __bounds;
void reduce(inout vec3 _b, in vec3 _c)
{
_b = (_b + _c);
}
varying vec2 __coord;
uniform vec2 __dim;
void main()
{
vec2 _source_coord = (floor(__coord) * 2.0);
bool _x = (__bounds.x > _source_coord.x);
bool _y = (__bounds.y > _source_coord.y);
vec3 _a = texture2DRect(__data, _source_coord).xyz;
if (_x)
{
reduce(_a, texture2DRect(__data, (_source_coord + vec2(1.0, 0.0))).xyz);
}
if (_y)
{
reduce(_a, texture2DRect(__data, (_source_coord + vec2(0.0, 1.0))).xyz);
}
if ((_x && _y))
{
reduce(_a, texture2DRect(__data, (_source_coord + vec2(1.0, 1.0))).xyz);
}
gl_FragData[0] = vec4(_a, 1.0);
}
(defmap potential-energy
(let [m1 %1, m2 (lookup %1 idx)
p1 %2, p2 (lookup %2 idx)]
(float3 (* g m1 m2 (length (- p1 p2))))))
#extension GL_ARB_texture_rectangle : enable
varying vec2 __coord;
uniform vec2 __dim;
void main()
{
__coord = (gl_MultiTexCoord0.xy * __dim);
gl_Position = (gl_ModelViewProjectionMatrix * gl_Vertex);
}
#extension GL_ARB_texture_rectangle : enable
uniform sampler2DRect _tex0;
uniform sampler2DRect _tex1;
uniform int idx;
uniform float g;
varying vec2 __coord;
uniform vec2 __dim;
void main()
{
float m1 = texture2DRect(_tex0, __coord).x;
float m2 = texture2DRect(_tex0, vec2(mod(float(idx), __dim.x), floor((float(idx) / __dim.x)))).x;
vec3 p1 = texture2DRect(_tex1, __coord).xyz;
vec3 p2 = texture2DRect(_tex1, vec2(mod(float(idx), __dim.x), floor((float(idx) / __dim.x)))).xyz;
gl_FragData[0] = vec4(vec3((((g * m1) * m2) * length((p1 - p2)))), 1.0);
}
(defmap add
(+ %1 (* k %2)))
#extension GL_ARB_texture_rectangle : enable
varying vec2 __coord;
uniform vec2 __dim;
void main()
{
__coord = (gl_MultiTexCoord0.xy * __dim);
gl_Position = (gl_ModelViewProjectionMatrix * gl_Vertex);
}
#extension GL_ARB_texture_rectangle : enable
uniform sampler2DRect _tex0;
uniform sampler2DRect _tex1;
uniform float k;
varying vec2 __coord;
uniform vec2 __dim;
void main()
{
gl_FragData[0] = vec4((texture2DRect(_tex0, __coord).xyz + (k * texture2DRect(_tex1, __coord).xyz)), 1.0);
}
(defmap gravity
(let [m2 (lookup %1 idx)
p1 %2, p2 (lookup %2 idx)
diff (- p2 p1)]
(? (= :index (float idx))
(float3 0.0)
(/ (* diff g m2) (pow (dot diff diff) 1.5))))
#extension GL_ARB_texture_rectangle : enable
varying vec2 __coord;
uniform vec2 __dim;
void main()
{
__coord = (gl_MultiTexCoord0.xy * __dim);
gl_Position = (gl_ModelViewProjectionMatrix * gl_Vertex);
}
#extension GL_ARB_texture_rectangle : enable
uniform sampler2DRect _tex0;
uniform sampler2DRect _tex1;
uniform int idx;
uniform float g;
varying vec2 __coord;
uniform vec2 __dim;
void main()
{
float __index = ((floor(__coord.y) * __dim.x) + floor(__coord.x));
float m2 = texture2DRect(_tex0, vec2(mod(float(idx), __dim.x), floor((float(idx) / __dim.x)))).x;
vec3 p1 = texture2DRect(_tex1, __coord).xyz;
vec3 p2 = texture2DRect(_tex1, vec2(mod(float(idx), __dim.x), floor((float(idx) / __dim.x)))).xyz;
vec3 diff = (p2 - p1);
gl_FragData[0] = vec4(((__index == float(idx)) ? vec3(0.0) : (((diff * g) * m2) / pow(dot(diff, diff), 1.5))), 1.0);
}