clray
diff src/rt.cc @ 54:6a30f27fa1e6
separated the OpenGL visualization and added a CPU raytracing mode
author | John Tsiombikas <nuclear@member.fsf.org> |
---|---|
date | Fri, 10 Sep 2010 16:47:00 +0100 |
parents | 54a96b738afe |
children | df239a52a091 |
line diff
1.1 --- a/src/rt.cc Sun Sep 05 16:43:55 2010 +0100 1.2 +++ b/src/rt.cc Fri Sep 10 16:47:00 2010 +0100 1.3 @@ -24,22 +24,6 @@ 1.4 NUM_KERNEL_ARGS 1.5 }; 1.6 1.7 -struct RendInfo { 1.8 - float ambient[4]; 1.9 - int xsz, ysz; 1.10 - int num_faces, num_lights; 1.11 - int max_iter; 1.12 - int cast_shadows; 1.13 -}; 1.14 - 1.15 -struct Ray { 1.16 - float origin[4], dir[4]; 1.17 -}; 1.18 - 1.19 -struct Light { 1.20 - float pos[4], color[4]; 1.21 -}; 1.22 - 1.23 static void update_render_info(); 1.24 static Ray get_primary_ray(int x, int y, int w, int h, float vfov_deg); 1.25 static float *create_kdimage(const KDNodeGPU *kdtree, int num_nodes, int *xsz_ret, int *ysz_ret); 1.26 @@ -49,10 +33,6 @@ 1.27 static CLProgram *prog; 1.28 static int global_size; 1.29 1.30 -static Light lightlist[] = { 1.31 - {{-8, 15, 18, 0}, {1, 1, 1, 1}} 1.32 -}; 1.33 - 1.34 1.35 static RendInfo rinf; 1.36 static int saved_iter_val; 1.37 @@ -72,7 +52,7 @@ 1.38 rinf.xsz = xsz; 1.39 rinf.ysz = ysz; 1.40 rinf.num_faces = scn->get_num_faces(); 1.41 - rinf.num_lights = sizeof lightlist / sizeof *lightlist; 1.42 + rinf.num_lights = scn->get_num_lights(); 1.43 rinf.max_iter = saved_iter_val = 6; 1.44 rinf.cast_shadows = true; 1.45 1.46 @@ -84,10 +64,11 @@ 1.47 prim_rays[i * xsz + j] = get_primary_ray(j, i, xsz, ysz, 45.0); 1.48 } 1.49 } 1.50 + dbg_set_primary_rays(prim_rays); // give them to the debug renderer 1.51 1.52 /* setup opencl */ 1.53 prog = new CLProgram("render"); 1.54 - if(!prog->load("rt.cl")) { 1.55 + if(!prog->load("src/rt.cl")) { 1.56 return false; 1.57 } 1.58 1.59 @@ -114,7 +95,7 @@ 1.60 prog->set_arg_buffer(KARG_RENDER_INFO, ARG_RD, sizeof rinf, &rinf); 1.61 prog->set_arg_buffer(KARG_FACES, ARG_RD, rinf.num_faces * sizeof(Face), faces); 1.62 prog->set_arg_buffer(KARG_MATLIB, ARG_RD, scn->get_num_materials() * sizeof(Material), scn->get_materials()); 1.63 - prog->set_arg_buffer(KARG_LIGHTS, ARG_RD, sizeof lightlist, lightlist); 1.64 + prog->set_arg_buffer(KARG_LIGHTS, ARG_RD, scn->get_num_lights() * sizeof(Light), scn->get_lights()); 1.65 prog->set_arg_buffer(KARG_PRIM_RAYS, ARG_RD, xsz * ysz * sizeof *prim_rays, prim_rays); 1.66 prog->set_arg_buffer(KARG_XFORM, ARG_RD, 16 * sizeof(float)); 1.67 prog->set_arg_buffer(KARG_INVTRANS_XFORM, ARG_RD, 16 * sizeof(float)); 1.68 @@ -133,9 +114,12 @@ 1.69 return false; 1.70 } 1.71 1.72 - delete [] prim_rays; 1.73 + //delete [] prim_rays; now dbg_renderer handles them 1.74 1.75 global_size = xsz * ysz; 1.76 + 1.77 + 1.78 + init_dbg_renderer(xsz, ysz, scn, tex); 1.79 return true; 1.80 } 1.81 1.82 @@ -143,7 +127,11 @@ 1.83 { 1.84 delete prog; 1.85 1.86 - printf("rendertime mean: %ld msec\n", timing_sample_sum / num_timing_samples); 1.87 + destroy_dbg_renderer(); 1.88 + 1.89 + if(num_timing_samples) { 1.90 + printf("rendertime mean: %ld msec\n", timing_sample_sum / num_timing_samples); 1.91 + } 1.92 } 1.93 1.94 bool render() 1.95 @@ -201,75 +189,6 @@ 1.96 return true; 1.97 } 1.98 1.99 -#define MIN(a, b) ((a) < (b) ? (a) : (b)) 1.100 -static void dbg_set_gl_material(Material *mat) 1.101 -{ 1.102 - static Material def_mat = {{0.7, 0.7, 0.7, 1}, {0, 0, 0, 0}, 0, 0, 0}; 1.103 - 1.104 - if(!mat) mat = &def_mat; 1.105 - 1.106 - glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE, mat->kd); 1.107 - glMaterialfv(GL_FRONT_AND_BACK, GL_SPECULAR, mat->ks); 1.108 - glMaterialf(GL_FRONT_AND_BACK, GL_SHININESS, MIN(mat->spow, 128.0f)); 1.109 -} 1.110 - 1.111 -void dbg_render_gl(Scene *scn, bool show_tree, bool show_obj) 1.112 -{ 1.113 - glPushAttrib(GL_ENABLE_BIT | GL_TRANSFORM_BIT | GL_LIGHTING_BIT); 1.114 - 1.115 - for(int i=0; i<rinf.num_lights; i++) { 1.116 - float lpos[4]; 1.117 - 1.118 - memcpy(lpos, lightlist[i].pos, sizeof lpos); 1.119 - lpos[3] = 1.0; 1.120 - 1.121 - glLightfv(GL_LIGHT0 + i, GL_POSITION, lpos); 1.122 - glLightfv(GL_LIGHT0 + i, GL_DIFFUSE, lightlist[i].color); 1.123 - glEnable(GL_LIGHT0 + i); 1.124 - } 1.125 - 1.126 - glDisable(GL_TEXTURE_2D); 1.127 - glEnable(GL_DEPTH_TEST); 1.128 - glEnable(GL_LIGHTING); 1.129 - 1.130 - glMatrixMode(GL_PROJECTION); 1.131 - glPushMatrix(); 1.132 - glLoadIdentity(); 1.133 - gluPerspective(45.0, (float)rinf.xsz / (float)rinf.ysz, 0.5, 1000.0); 1.134 - 1.135 - if(show_obj) { 1.136 - Material *materials = scn->get_materials(); 1.137 - 1.138 - int num_faces = scn->get_num_faces(); 1.139 - int cur_mat = -1; 1.140 - 1.141 - for(int i=0; i<num_faces; i++) { 1.142 - if(faces[i].matid != cur_mat) { 1.143 - if(cur_mat != -1) { 1.144 - glEnd(); 1.145 - } 1.146 - dbg_set_gl_material(materials ? materials + faces[i].matid : 0); 1.147 - cur_mat = faces[i].matid; 1.148 - glBegin(GL_TRIANGLES); 1.149 - } 1.150 - 1.151 - for(int j=0; j<3; j++) { 1.152 - glNormal3fv(faces[i].v[j].normal); 1.153 - glVertex3fv(faces[i].v[j].pos); 1.154 - } 1.155 - } 1.156 - glEnd(); 1.157 - } 1.158 - 1.159 - if(show_tree) { 1.160 - scn->draw_kdtree(); 1.161 - } 1.162 - 1.163 - glPopMatrix(); 1.164 - glPopAttrib(); 1.165 - 1.166 - assert(glGetError() == GL_NO_ERROR); 1.167 -} 1.168 1.169 void set_xform(float *matrix, float *invtrans) 1.170 { 1.171 @@ -286,6 +205,12 @@ 1.172 unmap_mem_buffer(mbuf_invtrans); 1.173 } 1.174 1.175 + 1.176 +const RendInfo *get_render_info() 1.177 +{ 1.178 + return &rinf; 1.179 +} 1.180 + 1.181 void set_render_option(int opt, bool val) 1.182 { 1.183 switch(opt) { 1.184 @@ -403,6 +328,8 @@ 1.185 return ray; 1.186 } 1.187 1.188 +#define MIN(a, b) ((a) < (b) ? (a) : (b)) 1.189 + 1.190 static float *create_kdimage(const KDNodeGPU *kdtree, int num_nodes, int *xsz_ret, int *ysz_ret) 1.191 { 1.192 int ysz = MIN(num_nodes, KDIMG_MAX_HEIGHT);