구체를 만들고 난 뒤 다른 오브젝트를 만들려고 할 때쯤 이러한 오브젝트를 만드는 것 말고 다른 기능이 존재해야하나? 라고 생각한 뒤 과제를 확인해보았고, 거기서 카메라가 2대 이상일 때 키보드로 전환이 가능해야하는 문제에 직면하였다.🤦♂️
그 글을 보자마자 아차 싶었다. 전혀 고려하지 않고 설계하였기 때문이다. 그래서 메인문을 전체적으로 뜯어고치는 사태가 벌어지고 말았다.
고치는 와중에 벌어지는 VM의 미스테리한 오류와 seg fault 그리고 길어지는 머리카락....아니 코드들.
그리고 이러한 모든 문제를 뛰어넘어 안될 것 같은 카메라 전환에 성공하였다!
이렇게 반짝 이해하기까지 너무 오래걸린 것 같지만 이해하고 넘어갔다는 것이 중요하다.
이미지가 만들어지는 과정은 이러하다.
void *mlx_new_image ( void *mlx_ptr, int width, int height );
를 통해 이미지 포인터를 생성한다.
char * mlx_get_data_addr ( void *img_ptr, int *bits_per_pixel, int *size_line, int *endian );
를 통해 이미지의 char pointer 값을 받는다.
그리고 오브젝트 intersect 계산을 한 뒤 mlx_pixel_put(...)
통해 색 이미지를 받아온다.
마지막으로 int mlx_put_image_to_window(void *mlx_ptr, void *win_ptr, void *img_ptr, int x, int y);
에서 img_ptr에 받아온 이미지 포인터들을 넣어주면 화면이 나오게 되는 것이다.
그럼 카메라가 2개 이상일 때 이 일련의 과정을 어떻게 처리해야하는지가 문제였다.
처음엔 카메라를 기준으로 이미지를 만들어보았다. 카메라를 구성하는 구조체에 mlx_get_data_addr
함수에 필요한 변수들을 넣어서 카메라 한대당 이미지를 만들었다.
그렇게 하니까 seg fault가 떴다. 그리고 점점 코드들이 전체적으로 틀어지면서 나중엔 구조체를 전부 엎어야하는 지경까지 와서 다시 롤백을 하여 생각했다.
카메라를 기준으로 잡으면 안되겠구나.🤔 결국 이미지를 나타내기 하기 위해선 mlx_put_image_to_window
함수에서 img_ptr
변수가 필요한건데 이것을 어떻게 효과적으로 다음걸로 전환하게 할 수 있을까.
그렇게 생각에 잠겨있을 때 또다른 문제점에 봉착한다.
바로 전환시 다시 원래대로 돌아와야 한다는 점이다.
정말 이때는 멘탈이 나갈 뻔했다. 하지만 마음을 다잡고 다시 생각했다.
아, 카메라는 그냥 개수만 세고 그 개수만큼 이미지를 만들고 계산하여 넣으면 되는 게 아닐까.
그래서 바로 구체나 빛을 여러개 넣을 때 사용했던 리스트를 사용해서 이미지 전용 리스트를 만들었다.
여기서 카메라 전환을 눌렀을 때 순서대로 돌아서 다시 원래 보였던 화면으로 돌아오게 하기 위해 원형 연결 리스트가 사용된 것이다.
즉시 코드 리빌딩에 나섰고 메인문이 조금 바뀌긴했지만 전체적인 파일에서 변한 것은 별로 없었기 때문에 시간적으로도 정신적으로도 바꿔볼만한 도전이었다.
void circle_lstadd(t_list **lst, t_list *new)
{
if (*lst == NULL)
{
*lst = new;
new->next = new;
}
else
{
new->next = (*lst)->next;
(*lst)->next = new;
*lst = new;
}
}
이같은 원형 연결 리스트를 만들고 이미지 리스트를 만들고 돌려보니 다시 seg fault가 떴다. 이 문제는 간단하게도 처음 헤드포인트를 설정을 해줘야했던 것과 if (*lst == NULL)
이렇게 써야하는 부분을 if (*lst != NULL)
이렇게 써서 오류가 났던 것이다.
그리고 다시 코드를 돌려보니 성공적으로 오류도 뜨지 않고 전환이 이루어졌다.
중간중간 여러 오류나 할말이 많지만 짧게 얘기하면 이렇게 카메라 전환에 성공을 하였다.