Skip to content

Instantly share code, notes, and snippets.

@ztellman
Created October 1, 2009 01:32
Show Gist options
  • Save ztellman/198632 to your computer and use it in GitHub Desktop.
Save ztellman/198632 to your computer and use it in GitHub Desktop.

Kinetic Energy

(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);
}

Sum

(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);
}

Potential Energy

(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);
}

Scaled Add

(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);
}

Gravity

(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);
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment