bool intersect_ray_mesh(const ray & ray, const geometry_mesh & mesh, float * hit_t, int * hit_tri, float2 * hit_uv) { float best_t = std::numeric_limits<float>::infinity(), t; float2 best_uv, uv; int best_tri = -1; for(auto & tri : mesh.triangles) { if(intersect_ray_triangle(ray, mesh.vertices[tri[0]].position, mesh.vertices[tri[1]].position, mesh.vertices[tri[2]].position, &t, &uv) && t < best_t) { best_t = t; best_uv = uv; best_tri = &tri - mesh.triangles.data(); } } if(best_tri == -1) return false; if(hit_t) *hit_t = best_t; if(hit_tri) *hit_tri = best_tri; if(hit_uv) *hit_uv = best_uv; return true; }
Intersection *intersect_ray_glm_object(Ray *ray, GLMmodel *model) { static GLMgroup* group; static GLMtriangle* triangle; Vect V0, V1, V2; Intersection *nearest_inter = NULL; Intersection *inter = NULL; // iterate over all groups in the model for (group = model->groups; group; group = group->next) { // iterate over all triangles in this group for (int i = 0; i < group->numtriangles; i++) { triangle = &model->triangles[group->triangles[i]]; // get triangle vertices V0[X] = model->vertices[3 * triangle->vindices[0]]; V0[Y] = model->vertices[3 * triangle->vindices[0] + 1]; V0[Z] = model->vertices[3 * triangle->vindices[0] + 2]; V1[X] = model->vertices[3 * triangle->vindices[1]]; V1[Y] = model->vertices[3 * triangle->vindices[1] + 1]; V1[Z] = model->vertices[3 * triangle->vindices[1] + 2]; V2[X] = model->vertices[3 * triangle->vindices[2]]; V2[Y] = model->vertices[3 * triangle->vindices[2] + 1]; V2[Z] = model->vertices[3 * triangle->vindices[2] + 2]; // test for intersection inter = intersect_ray_triangle(ray, V0, V1, V2); // we have a hit in front of the camera... if (inter) { // set normal inter->N[X] = model->facetnorms[3 * triangle->findex]; inter->N[Y] = model->facetnorms[3 * triangle->findex + 1]; inter->N[Z] = model->facetnorms[3 * triangle->findex + 2]; inter->surf = model_surf_list[model->index]; //MY CODE inter->objP[0] = model->position[0]; inter->objP[1] = model->position[1]; inter->objP[2] = model->position[2]; inter->model = model; // this the first hit if (!nearest_inter) { nearest_inter = inter; } // this is closer than any previous hit else if (inter->t < nearest_inter->t) { free(nearest_inter); nearest_inter = inter; } // something else is closer--move along else { free(inter); } } } } return nearest_inter; }