# HG changeset patch # User John Tsiombikas # Date 1281354940 -3600 # Node ID 63a6b46f58a07eb0964c123d1234466e88fc0783 # Parent 8baea9b66b50417dc0dea13e9171554482bed31a fixed diff -r 8baea9b66b50 -r 63a6b46f58a0 rt.cl --- a/rt.cl Mon Aug 09 06:45:57 2010 +0100 +++ b/rt.cl Mon Aug 09 12:55:40 2010 +0100 @@ -5,7 +5,6 @@ int num_faces, num_lights; int max_iter; float4 ambient; - int dbg; }; struct Vertex { @@ -56,7 +55,6 @@ #define MIN_ENERGY 0.001 #define EPSILON 1e-6 -//float4 trace(struct Ray ray, struct Scene *scn); float4 shade(struct Ray ray, struct Scene *scn, const struct SurfPoint *sp); bool find_intersection(struct Ray ray, const struct Scene *scn, struct SurfPoint *sp); bool intersect(struct Ray ray, global const struct Face *face, struct SurfPoint *sp); @@ -74,17 +72,10 @@ global const struct Light *lights, global const struct Ray *primrays, global const float *xform, - global const float *invtrans, - global struct Face *outfaces) + global const float *invtrans) { int idx = get_global_id(0); - if(!idx) { - for(int i=0; inum_faces; i++) { - outfaces[i] = faces[i]; - } - } - struct Scene scn; scn.ambient = rinf->ambient; scn.faces = faces; @@ -96,8 +87,6 @@ struct Ray ray = primrays[idx]; transform_ray(&ray, xform, invtrans); - //fb[idx] = trace(ray, &scn); - float4 pixel = (float4)(0, 0, 0, 0); float4 energy = (float4)(1.0, 1.0, 1.0, 1.0); int iter = 0; @@ -121,19 +110,6 @@ fb[idx] = pixel; } -/*float4 trace(struct Ray ray, struct Scene *scn) -{ - float4 color; - struct SurfPoint sp; - - if(find_intersection(ray, scn, &sp)) { - color = shade(ray, scn, &sp); - } else { - color = (float4)(0, 0, 0, 0); - } - return color; -}*/ - float4 shade(struct Ray ray, struct Scene *scn, const struct SurfPoint *sp) { float4 norm = sp->norm; @@ -162,8 +138,8 @@ float diff = fmax(dot(ldir, norm), 0.0f); dcol += sp->mat.kd * diff * scn->lights[i].color; - //float spec = powr(fmax(dot(ldir, vref), 0.0f), mat.spow); - //scol += sp->mat.ks * spec * scn->lights[i].color; + float spec = powr(fmax(dot(ldir, vref), 0.0f), sp->mat.spow); + scol += sp->mat.ks * spec * scn->lights[i].color; } } @@ -221,14 +197,14 @@ float4 bc = calc_bary(pt, face, norm); float bc_sum = bc.x + bc.y + bc.z; - if(bc_sum < 0.0 || bc_sum > 1.0 + EPSILON) { + if(bc_sum < 1.0 - EPSILON || bc_sum > 1.0 + EPSILON) { return false; bc *= 1.2; } sp->t = t; sp->pos = pt; - sp->norm = norm; + sp->norm = -normalize(face->v[0].normal * bc.x + face->v[1].normal * bc.y + face->v[2].normal * bc.z); sp->obj = face; sp->dbg = bc; return true; diff -r 8baea9b66b50 -r 63a6b46f58a0 src/clray.cc --- a/src/clray.cc Mon Aug 09 06:45:57 2010 +0100 +++ b/src/clray.cc Mon Aug 09 12:55:40 2010 +0100 @@ -26,7 +26,6 @@ static float cam_dist = 10.0; static bool dbg_glrender = true; -static int dbg_dbg = 8; static Scene scn; @@ -173,18 +172,6 @@ glutPostRedisplay(); break; - case '=': - dbg_set_dbg(++dbg_dbg); - need_update = true; - glutPostRedisplay(); - break; - - case '-': - dbg_set_dbg(--dbg_dbg); - need_update = true; - glutPostRedisplay(); - break; - default: break; } diff -r 8baea9b66b50 -r 63a6b46f58a0 src/mesh.cc --- a/src/mesh.cc Mon Aug 09 06:45:57 2010 +0100 +++ b/src/mesh.cc Mon Aug 09 12:55:40 2010 +0100 @@ -59,6 +59,8 @@ Vector3() { x = y = z = 0.0; } Vector3(float a, float b, float c) { x = a; y = b; z = c; } + + void normalize() { float len = sqrt(x * x + y * y + z * z); x /= len; y /= len; z /= len; } }; struct Vector2 { @@ -117,6 +119,9 @@ static bool find_file(char *res, int sz, const char *fname, const char *path = ".", const char *mode = "rb"); static const char *dirname(const char *str); +static Vector3 operator -(const Vector3 &a, const Vector3 &b); +static Vector3 cross(const Vector3 &a, const Vector3 &b); + static map matnames; @@ -406,13 +411,14 @@ for(size_t i=0; if.size(); i++) { Face face; + Vector3 v[3]; for(int j=0; j<3; j++) { obj_face *f = &obj->f[i]; - face.v[j].pos[0] = obj->v[f->v[j]].x; - face.v[j].pos[1] = obj->v[f->v[j]].y; - face.v[j].pos[2] = obj->v[f->v[j]].z; + face.v[j].pos[0] = v[j].x = obj->v[f->v[j]].x; + face.v[j].pos[1] = v[j].y = obj->v[f->v[j]].y; + face.v[j].pos[2] = v[j].z = obj->v[f->v[j]].z; face.v[j].pos[3] = 0.0; int nidx = f->n[j] < 0 ? 0 : f->n[j]; @@ -426,9 +432,14 @@ face.v[j].tex[1] = obj->vt[tidx].y; } - face.normal[0] = face.v[0].normal[0]; - face.normal[1] = face.v[1].normal[1]; - face.normal[2] = face.v[2].normal[2]; + Vector3 a = v[1] - v[0]; + Vector3 b = v[2] - v[0]; + Vector3 n = cross(a, b); + n.normalize(); + + face.normal[0] = n.x; + face.normal[1] = n.y; + face.normal[2] = n.z; face.normal[3] = 0.0; mesh->faces.push_back(face); @@ -729,3 +740,17 @@ } return buf; } + +static Vector3 operator -(const Vector3 &a, const Vector3 &b) +{ + return Vector3(a.x - b.x, a.y - b.y, a.z - b.z); +} + +static Vector3 cross(const Vector3 &a, const Vector3 &b) +{ + Vector3 res; + res.x = a.y * b.z - a.z * b.y; + res.y = a.z * b.x - a.x * b.z; + res.z = a.x * b.y - a.y * b.x; + return res; +} diff -r 8baea9b66b50 -r 63a6b46f58a0 src/rt.cc --- a/src/rt.cc Mon Aug 09 06:45:57 2010 +0100 +++ b/src/rt.cc Mon Aug 09 12:55:40 2010 +0100 @@ -16,7 +16,6 @@ KARG_PRIM_RAYS, KARG_XFORM, KARG_INVTRANS_XFORM, - KARG_OUTFACES, /* DBG */ NUM_KERNEL_ARGS }; @@ -26,7 +25,6 @@ int num_faces, num_lights; int max_iter; float ambient[4]; - int dbg; }; struct Ray { @@ -64,7 +62,6 @@ rinf.num_faces = scn->get_num_faces(); rinf.num_lights = sizeof lightlist / sizeof *lightlist; rinf.max_iter = 6; - rinf.dbg = 8; /* calculate primary rays */ prim_rays = new Ray[xsz * ysz]; @@ -96,7 +93,6 @@ prog->set_arg_buffer(KARG_PRIM_RAYS, ARG_RD, xsz * ysz * sizeof *prim_rays, prim_rays); prog->set_arg_buffer(KARG_XFORM, ARG_RD, 16 * sizeof(float)); prog->set_arg_buffer(KARG_INVTRANS_XFORM, ARG_RD, 16 * sizeof(float)); - prog->set_arg_buffer(KARG_OUTFACES, ARG_WR, rinf.num_faces * sizeof(Face)); if(prog->get_num_args() < NUM_KERNEL_ARGS) { return false; @@ -126,19 +122,6 @@ } printf("done\n"); - /* DEBUG */ - CLMemBuffer *dbgbuf = prog->get_arg_buffer(KARG_OUTFACES); - Face *outfaces = (Face*)map_mem_buffer(dbgbuf, MAP_RD); - for(int i=0; iget_arg_buffer(KARG_FRAMEBUFFER); void *fb = map_mem_buffer(mbuf, MAP_RD); @@ -152,16 +135,6 @@ return true; } -void dbg_set_dbg(int dbg) -{ - printf("setting dbg: %d\n", dbg); - - CLMemBuffer *mbuf = prog->get_arg_buffer(KARG_RENDER_INFO); - RendInfo *rinf = (RendInfo*)map_mem_buffer(mbuf, MAP_WR); - rinf->dbg = dbg; - unmap_mem_buffer(mbuf); -} - void dbg_render_gl(Scene *scn) { float lpos[] = {-1, 1, 10, 0}; @@ -199,18 +172,6 @@ glVertex3fv(pos); } } - - /*for(size_t i=0; imeshes.size(); i++) { - Material *mat = &scn->matlib[scn->meshes[i]->matid]; - - glColor3f(mat->kd[0], mat->kd[1], mat->kd[2]); - for(size_t j=0; jmeshes[i]->faces.size(); j++) { - for(int k=0; k<3; k++) { - float *pos = scn->meshes[i]->faces[j].v[k].pos; - glVertex3f(pos[0], pos[1], pos[2]); - } - } - }*/ glEnd(); glPopMatrix(); diff -r 8baea9b66b50 -r 63a6b46f58a0 src/rt.h --- a/src/rt.h Mon Aug 09 06:45:57 2010 +0100 +++ b/src/rt.h Mon Aug 09 12:55:40 2010 +0100 @@ -8,7 +8,6 @@ bool render(); void set_xform(float *matrix, float *invtrans); -void dbg_set_dbg(int dbg); void dbg_render_gl(Scene *scn); #endif /* RT_H_ */