Add sphere_point_lies_on_surface and sphere_compute_normal
This commit is contained in:
		
							parent
							
								
									ca2a5c1b3b
								
							
						
					
					
						commit
						bfb1a1b3d5
					
				
					 1 changed files with 43 additions and 0 deletions
				
			
		
							
								
								
									
										43
									
								
								src/object.c
									
										
									
									
									
								
							
							
						
						
									
										43
									
								
								src/object.c
									
										
									
									
									
								
							| 
						 | 
				
			
			@ -29,6 +29,8 @@ typedef struct _Sphere {
 | 
			
		|||
} Sphere;
 | 
			
		||||
 | 
			
		||||
static int sphere_does_intersect(Object *obj, Ray ray, float **t);
 | 
			
		||||
static int sphere_point_lies_on_surface(Object *obj, Vector3 p);
 | 
			
		||||
static Vector3 sphere_compute_normal(Object *obj, Vector3 p);
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
| 
						 | 
				
			
			@ -226,3 +228,44 @@ sphere_does_intersect(Object *obj, Ray ray, float **t)
 | 
			
		|||
 | 
			
		||||
    return nints;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * sphere_point_lies_on_surface --
 | 
			
		||||
 *
 | 
			
		||||
 * Determine if a point lies on the given sphere.
 | 
			
		||||
 */
 | 
			
		||||
int
 | 
			
		||||
sphere_point_lies_on_surface(Object *obj, Vector3 p)
 | 
			
		||||
{
 | 
			
		||||
    assert(obj != NULL && obj->type == ObjectTypeSphere);
 | 
			
		||||
 | 
			
		||||
    Vector3 loc = object_get_location(obj);
 | 
			
		||||
    float x = p.x - loc.x;
 | 
			
		||||
    float y = p.y - loc.y;
 | 
			
		||||
    float z = p.z - loc.z;
 | 
			
		||||
    float r = object_sphere_get_radius(obj);
 | 
			
		||||
 | 
			
		||||
    return (x * x) + (y * y) + (z * z) == (r * r);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * sphere_compute_normal --
 | 
			
		||||
 *
 | 
			
		||||
 * Compute the normal for the given Object (which must be a Sphere) at the given point. This point must lie on the
 | 
			
		||||
 * surface of the object.
 | 
			
		||||
 */
 | 
			
		||||
/* static */ Vector3
 | 
			
		||||
sphere_compute_normal(Object *obj, Vector3 p)
 | 
			
		||||
{
 | 
			
		||||
    assert(obj != NULL && obj->type == ObjectTypeSphere);
 | 
			
		||||
 | 
			
		||||
    // Make sure the given point is actually on the surface of the sphere.
 | 
			
		||||
    if (!sphere_point_lies_on_surface(obj, p)) {
 | 
			
		||||
        return Vector3Zero;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    // The fun thing about sphere is the normal to any point on the sphere is the point itself. Woo!
 | 
			
		||||
    return p;
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue