Example #1
0
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;
}
Example #2
0
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;
}