출처:
Ray Tracing in One Weekend - A List of Hittable Objects
Github - GaepoMorningEagles/mini_raytracing_in_c
광선과 hit 할 수 있는 객체들, 과제에서 구현해야 하는 객체들을 hittable objects라고 하겠다. 이 객체들을 담고 있는 연결리스트를 world
라고 했다. oadd()
를 통해 world
리스트에 추가된 순서대로 광선과의 hit 여부를 검사한다.
world
리스트에 다음으로 어떤 타입의 객체가 들어올지 모르기 때문에 element
는 void *
타입으로 객체 정보를 받는다. 만약 객체가 원기둥이면, t_cylinder *
타입의 변수가 element
에 저장된다. 현재는 구만 만들었기 때문에, 구 두 개를 리스트에 추가하겠다.
hit()
에서 world
리스트와 광선 ray
, 그리고 현재 hit 정보를 담고 있는 rec
를 받아와서 hit 여부를 검사한다. 반복문을 통해 리스트에 있는 객체들을 처음부터 끝까지 검사한다. 현재 광선이 쏘고 있는 픽셀에서 뭐라도 hit 했다면 hit_anything
의 값을 true
로 바꿔준다. 그리고 그 hit 한 곳에서의 rec.t
값을 rec.tmax
에 넣어준다.(이 부분에 대한 설명은 이전 챕터에 나와있다.) 여기서 객체가 여러 개 겹쳐있든 아니든 하나라도 hit 를 했다면 true
가 리턴된다.
여기서 hit 여부를 검사하는 함수인 hit_obj()
안에서 현재 리스트가 가리키고 있는 노드의 객체 타입이 무엇인지 확인하고, 그에 맞는 함수로 들어가서 hit 여부를 검사하고 결과값을 리턴한다.