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