# HG changeset patch # User John Tsiombikas # Date 1288071937 -10800 # Node ID 03022062c46417782a6e3f24296624ec53a3f754 # Parent 09bb67c000bc0de547e1846699177a72b14d5e5a lalal diff -r 09bb67c000bc -r 03022062c464 Makefile --- a/Makefile Thu Oct 21 23:39:26 2010 +0300 +++ b/Makefile Tue Oct 26 08:45:37 2010 +0300 @@ -11,9 +11,9 @@ CC = gcc CXX = g++ -CFLAGS = -pedantic -Wall -g `pkg-config --cflags vmath` -CXXFLAGS = -pedantic -Wall -g `pkg-config --cflags vmath` -LDFLAGS = $(libgl) `pkg-config --libs vmath` +CFLAGS = -pedantic -Wall -g `pkg-config --cflags vmath freetype2` +CXXFLAGS = -pedantic -Wall -g `pkg-config --cflags vmath freetype2` -I/usr/local/include/utk +LDFLAGS = $(libgl) `pkg-config --libs vmath freetype2` -lutk $(bin): $(obj) $(CXX) -o $@ $(obj) $(LDFLAGS) diff -r 09bb67c000bc -r 03022062c464 sdr/julia.p.glsl --- a/sdr/julia.p.glsl Thu Oct 21 23:39:26 2010 +0300 +++ b/sdr/julia.p.glsl Tue Oct 26 08:45:37 2010 +0300 @@ -3,6 +3,8 @@ uniform sampler2D ray_tex; uniform float err_thres; uniform int iter; +uniform float reflectivity; +uniform vec3 diffuse_color; #define quat(s, x, y, z) vec4(x, y, z, s) #define quat_identity() vec4(0.0, 0.0, 0.0, 1.0) @@ -20,13 +22,18 @@ vec4 qprime; }; +struct Material { + vec3 kd, ks; + float spow; + float kr; +}; + struct ISect { bool hit; float t; vec3 pos; vec3 normal; - vec3 color; - float kr; + Material mat; }; ISect find_intersection(Ray ray); @@ -44,6 +51,7 @@ ISect ray_floor(Ray ray); Ray get_primary_ray(); +vec3 steps_color(int steps); void main() { @@ -57,7 +65,7 @@ if(res.hit) { color += shade(ray, res) * energy; - energy *= res.kr; + energy *= res.mat.kr; ray.origin = res.pos; ray.dir = reflect(ray.dir, res.normal); @@ -97,10 +105,10 @@ float ndotl = dot(ldir, isect.normal); float ndoth = dot(hdir, isect.normal); - vec3 dcol = /*isect.color * max(ndotl, 0.0) */ amboc(isect); - vec3 scol = vec3(1.0, 1.0, 1.0) * pow(max(ndoth, 0.0), 40.0); + vec3 dcol = isect.mat.kd;// * abs(ndotl); + vec3 scol = isect.mat.ks * pow(abs(ndoth), isect.mat.spow); - return /*vec3(0.05, 0.05, 0.05) + */dcol;// + scol; + return vec3(0.05, 0.05, 0.05) + dcol + scol; } #define AO_STEP 0.04 @@ -117,7 +125,8 @@ sum += 1.0 / pow(2.0, fi) * (sample_dist - jdist); } - return 1.0 - AO_MAGIC * sum; + float res = 1.0 - AO_MAGIC * sum; + return clamp(res, 0.0, 1.0); } vec3 sky(Ray ray) @@ -185,16 +194,19 @@ return res; } +#define MIN_STEP 0.001 ISect ray_julia(Ray inray) { float dist_acc = 0.0; Ray ray = inray; ISect res; + int i = 0; for(float fi=0.0; ; fi+=0.1) { + i++; vec4 q = quat(ray.origin.x, ray.origin.y, ray.origin.z, 0.0); - float dist = julia_dist(q); + float dist = max(julia_dist(q), MIN_STEP); ray.origin += ray.dir * dist; dist_acc += dist; @@ -204,9 +216,10 @@ res.t = dist_acc; res.pos = ray.origin; res.normal = normalize(julia_grad(quat(res.pos.x, res.pos.y, res.pos.z, 0.0))); - res.color = vec3(0.75, 0.8, 0.9);//abs(res.normal) * 0.2; - //res.kr = 0.6; - res.kr = 0.0; + res.mat.kr = reflectivity; + res.mat.kd = diffuse_color * amboc(res) * (1.0 - res.mat.kr); + res.mat.ks = vec3(0.4, 0.4, 0.4);//vec3(res.mat.kr, res.mat.kr, res.mat.kr); + res.mat.spow = 50.0; break; } @@ -242,8 +255,8 @@ res.hit = true; res.t = min(t1, t2); res.pos = ray.origin + ray.dir * res.t; - res.color = vec3(1.0, 0.3, 0.2); - res.normal = res.pos / rad; + //res.mat.kd = vec3(1.0, 0.3, 0.2); + //res.normal = res.pos / rad; } return res; @@ -272,8 +285,10 @@ res.hit = true; float chess = mod(floor(res.pos.x) + floor(res.pos.z), 2.0); - res.color = mix(vec3(0.498, 0.165, 0.149), vec3(0.776, 0.851, 0.847), chess); - res.kr = 0.0; + res.mat.kd = mix(vec3(0.498, 0.165, 0.149), vec3(0.776, 0.851, 0.847), chess); + res.mat.ks = vec3(0.0, 0.0, 0.0); + res.mat.spow = 1.0; + res.mat.kr = 0.0; } return res; } @@ -287,3 +302,27 @@ return ray; } + +vec3 steps_color(int steps) +{ + if(steps <= 1) { + return vec3(0.0, 0.5, 0.0); + } else if(steps == 2) { + return vec3(0.0, 1.0, 0.0); + } else if(steps == 3) { + return vec3(0.0, 0.0, 0.5); + } else if(steps == 4) { + return vec3(0.0, 0.0, 1.0); + } else if(steps == 5) { + return vec3(0.0, 0.5, 0.5); + } else if(steps == 6) { + return vec3(0.0, 1.0, 1.0); + } else if(steps == 7) { + return vec3(0.5, 0.0, 0.5); + } else if(steps == 8) { + return vec3(1.0, 0.0, 1.0); + } else if(steps == 9) { + return vec3(0.5, 0.0, 0.0); + } + return vec3(0.5 + float(steps - 9) / 10.0, 0.0, 0.0); +} diff -r 09bb67c000bc -r 03022062c464 src/rayfract.cc --- a/src/rayfract.cc Thu Oct 21 23:39:26 2010 +0300 +++ b/src/rayfract.cc Tue Oct 26 08:45:37 2010 +0300 @@ -5,12 +5,15 @@ #include #include #include "sdr.h" +#include "gui.h" void disp(); void reshape(int x, int y); void keyb(unsigned char key, int x, int y); +void keyb_up(unsigned char key, int x, int y); void mouse(int bn, int state, int x, int y); void motion(int x, int y); +void passive_motion(int x, int y); int load_shader(); unsigned int create_ray_texture(int xsz, int ysz, float vfov, Vector2 *tex_scale = 0); @@ -26,6 +29,8 @@ Vector4 seed; float err_thres = 0.0075; int iter = 10; +float reflectivity = 0.2; +Vector3 color(0.9, 0.95, 1.0); int main(int argc, char **argv) { @@ -43,8 +48,10 @@ glutDisplayFunc(disp); glutReshapeFunc(reshape); glutKeyboardFunc(keyb); + glutKeyboardUpFunc(keyb_up); glutMouseFunc(mouse); glutMotionFunc(motion); + glutPassiveMotionFunc(passive_motion); glEnable(GL_DEPTH_TEST); glEnable(GL_LIGHTING); @@ -57,6 +64,10 @@ return 1; } + if(gui_init(xsz, ysz) == -1) { + return 1; + } + glutMainLoop(); return 0; } @@ -73,6 +84,9 @@ set_uniform_float4(sdr, "seed", seed.x, seed.y, seed.z, seed.w); set_uniform_float(sdr, "err_thres", err_thres); set_uniform_int(sdr, "iter", iter); + set_uniform_float(sdr, "reflectivity", reflectivity); + set_uniform_float3(sdr, "diffuse_color", color.x, color.y, color.z); + return 0; } @@ -112,6 +126,8 @@ glMatrixMode(GL_TEXTURE); glPopMatrix(); + gui_draw(); + glutSwapBuffers(); assert(glGetError() == GL_NO_ERROR); } @@ -170,7 +186,35 @@ load_shader(); glutPostRedisplay(); break; + + case 'r': + reflectivity = reflectivity > 0.0 ? 0.0 : 0.6; + set_uniform_float(sdr, "reflectivity", reflectivity); + glutPostRedisplay(); + break; + + case '`': + { + static bool vis = true; + vis = !vis; + gui_set_visible(vis); + glutPostRedisplay(); + } + break; } + + utk::KeyboardEvent ev(key); + ev.pressed = true; + utk::event(&ev); + glutPostRedisplay(); +} + +void keyb_up(unsigned char key, int x, int y) +{ + utk::KeyboardEvent ev(key); + ev.pressed = false; + utk::event(&ev); + glutPostRedisplay(); } int bnstate[16]; @@ -178,22 +222,31 @@ int prev_x = -1, prev_y; void mouse(int bn, int state, int x, int y) { - bnstate[bn] = state == GLUT_DOWN ? 1 : 0; - if(state == GLUT_DOWN) { - if(bn == 3) { - cam_dist -= 0.1; - glutPostRedisplay(); - if(cam_dist < 0) cam_dist = 0; - } else if(bn == 4) { - cam_dist += 0.1; - glutPostRedisplay(); + utk::Container *utkroot = utk::get_root_widget(); + + if(utkroot->get_child_at(x, y) == utkroot) { + bnstate[bn] = state == GLUT_DOWN ? 1 : 0; + if(state == GLUT_DOWN) { + if(bn == 3) { + cam_dist -= 0.1; + glutPostRedisplay(); + if(cam_dist < 0) cam_dist = 0; + } else if(bn == 4) { + cam_dist += 0.1; + glutPostRedisplay(); + } else { + prev_x = x; + prev_y = y; + } } else { - prev_x = x; - prev_y = y; + prev_x = -1; } - } else { - prev_x = -1; } + + utk::MButtonEvent ev(bn, x, y); + ev.pressed = state == GLUT_DOWN; + utk::event(&ev); + glutPostRedisplay(); } void motion(int x, int y) @@ -220,6 +273,17 @@ prev_x = x; prev_y = y; + + utk::MMotionEvent ev(x, y); + utk::event(&ev); + glutPostRedisplay(); +} + +void passive_motion(int x, int y) +{ + utk::MMotionEvent ev(x, y); + utk::event(&ev); + //glutPostRedisplay(); } unsigned int create_ray_texture(int xsz, int ysz, float vfov, Vector2 *tex_scale)