yuchi's Development Home
글 수 694
자정쯤에 석촌호수를 한바퀴 돌고왔다.
걸어다니면서 꽤 많은 생각을 했고, 그 과정에서 좀 더 편하게 오클루젼을 생성할 수 있는 아이디어를 떠올렸다.
집에 돌아와서 바로 코딩 시작.
일단 최근 발견한 오클루젼 편집 기능의 버그를 잡기로 했다.
오클루젼을 생성하면 어딘가 이상한 위치로 튀는것처럼 보이는 버그였는데, 좀 더 확실한 체크를 위해서 z버퍼를 무시하고 오클루젼을 렌더링 하는 코드를 넣기로 했다.
그런데 보다보니 오클루젼 렌더링을 비롯하여,박스,스피어등 immediate 렌더링 함수들의 렌더링 옵션이 어느 새 요상하게 섞여 버린걸 발견.
순전히 내 불찰인데 일단 눈에 거슬리니 깔끔하게 정리하기로 했다.
렌더모드와 렌더타입 두 가지로 확실히 구분하고 렌더러의 함수들을 고쳤다.
렌더러DLL의 몇 가지 함수들을 고쳤으므로, 지오메리트DLL의 함수들도 수정해야했다.
버그를 막기 위해 일부러 함수 프로토타입을 고쳤다.
지오메트리에서 줄줄이 쏟아져 나오는 신택스 에러를 찾아서 수정했다.
이제 엔진을 사용하는 맵툴과 게임 클라이언트를 고쳤다.
정상작동을 확인한 후 툴에 오클루젼 렌더링시 z버퍼를 무시하는 옵션을 넣었다.
여기까지 하니 새벽 3시반쯤.
이제 오클루젼 코드를 보기 시작.
일단 위치가 엄하게 튀는것은 복합적인 문제였다. 수학적 논리가 잘못된 코드들을 찾아냈다.
한참 뚫어지게 보긴 했지만 어렵지 않게 잡았다.
여기까지 하니 새벽 5시쯤.
예전에 오클루젼 편집 하다보면 가끔 크래쉬하곤 했는데, 그 문제도 잡기로 했다.
이리저리 테스트 해서 크래쉬하는 경우를 재현할 순 있게됐다.
오클루젼은 공간에 어떻게 걸쳐지느냐에 따라 사이즈가 바뀌므로, 일종의 가변 스트럭쳐를 사용한다. 그래서 malloc(),free()를 사용하는데 어느 순간인가 힙을 해제한 다음 다시 써넣어서 힙체크에 걸리고 있었다.
한참을 삽질한 끝에 엔진의 렌더링 큐에 들어간 상태로 오클루젼을 삭제하면, 다음번 렌더링 할때 이미 삭제된 오클루젼의 플래그를 0으로 세팅하게 되는 것을 발견.
카메라를 조정하지 않으면 크래쉬하지 않는 이유도 여기 있었던 것이다. 카메라가 움직이지 않으면 렌더링 큐에 넣을 오클루젼도 갱신하지 않으니까.
다이나믹 렌더링 오브젝트들에 관해서도 동일한 문제가 있을것으로 보고 코드를 뒤져보니 역시나 문제의 소지가 있었다. 단 오클루젼을 제외한 대부분의 개체들은 자체 메모리풀을 사용하고 있으므로 딱히 힙체크에는 걸릴 일이 없었던 것이다.
어쨌건 잠재적인 문제까지 수정하고 테스트하니 아침 8시가 훌쩍 넘었다.
간만의 밤샘 코딩. 원래 하려던 오클루젼 생성 기능 추가는 못했지만, 현존하는 버그와 잠재적인 버그를 수정했다. 또한 그 동안 잊고 있었던 코드들을 리뷰하는 알찬 시간이었다.
뿌듯하다.
교회 갈때까지 좀 자야겠다.
걸어다니면서 꽤 많은 생각을 했고, 그 과정에서 좀 더 편하게 오클루젼을 생성할 수 있는 아이디어를 떠올렸다.
집에 돌아와서 바로 코딩 시작.
일단 최근 발견한 오클루젼 편집 기능의 버그를 잡기로 했다.
오클루젼을 생성하면 어딘가 이상한 위치로 튀는것처럼 보이는 버그였는데, 좀 더 확실한 체크를 위해서 z버퍼를 무시하고 오클루젼을 렌더링 하는 코드를 넣기로 했다.
그런데 보다보니 오클루젼 렌더링을 비롯하여,박스,스피어등 immediate 렌더링 함수들의 렌더링 옵션이 어느 새 요상하게 섞여 버린걸 발견.
순전히 내 불찰인데 일단 눈에 거슬리니 깔끔하게 정리하기로 했다.
렌더모드와 렌더타입 두 가지로 확실히 구분하고 렌더러의 함수들을 고쳤다.
렌더러DLL의 몇 가지 함수들을 고쳤으므로, 지오메리트DLL의 함수들도 수정해야했다.
버그를 막기 위해 일부러 함수 프로토타입을 고쳤다.
지오메트리에서 줄줄이 쏟아져 나오는 신택스 에러를 찾아서 수정했다.
이제 엔진을 사용하는 맵툴과 게임 클라이언트를 고쳤다.
정상작동을 확인한 후 툴에 오클루젼 렌더링시 z버퍼를 무시하는 옵션을 넣었다.
여기까지 하니 새벽 3시반쯤.
이제 오클루젼 코드를 보기 시작.
일단 위치가 엄하게 튀는것은 복합적인 문제였다. 수학적 논리가 잘못된 코드들을 찾아냈다.
한참 뚫어지게 보긴 했지만 어렵지 않게 잡았다.
여기까지 하니 새벽 5시쯤.
예전에 오클루젼 편집 하다보면 가끔 크래쉬하곤 했는데, 그 문제도 잡기로 했다.
이리저리 테스트 해서 크래쉬하는 경우를 재현할 순 있게됐다.
오클루젼은 공간에 어떻게 걸쳐지느냐에 따라 사이즈가 바뀌므로, 일종의 가변 스트럭쳐를 사용한다. 그래서 malloc(),free()를 사용하는데 어느 순간인가 힙을 해제한 다음 다시 써넣어서 힙체크에 걸리고 있었다.
한참을 삽질한 끝에 엔진의 렌더링 큐에 들어간 상태로 오클루젼을 삭제하면, 다음번 렌더링 할때 이미 삭제된 오클루젼의 플래그를 0으로 세팅하게 되는 것을 발견.
카메라를 조정하지 않으면 크래쉬하지 않는 이유도 여기 있었던 것이다. 카메라가 움직이지 않으면 렌더링 큐에 넣을 오클루젼도 갱신하지 않으니까.
다이나믹 렌더링 오브젝트들에 관해서도 동일한 문제가 있을것으로 보고 코드를 뒤져보니 역시나 문제의 소지가 있었다. 단 오클루젼을 제외한 대부분의 개체들은 자체 메모리풀을 사용하고 있으므로 딱히 힙체크에는 걸릴 일이 없었던 것이다.
어쨌건 잠재적인 문제까지 수정하고 테스트하니 아침 8시가 훌쩍 넘었다.
간만의 밤샘 코딩. 원래 하려던 오클루젼 생성 기능 추가는 못했지만, 현존하는 버그와 잠재적인 버그를 수정했다. 또한 그 동안 잊고 있었던 코드들을 리뷰하는 알찬 시간이었다.
뿌듯하다.
교회 갈때까지 좀 자야겠다.