오늘은 청크 경계면에서 옆 청크의 블록을 확인해 필요없는 청크 경계면을 그리지 않는 기능을 공부했습니다


24b0d121e09c28a8699fe8b115ef046ec94dcdf3


이전에는 mapData를 모든 청크에 돌려썼는데

이제 청크마다 고유의 mapData를 만들어주겠습니다

SetMapData는 16*16*16크기의 3차원 바이트배열을 만들고

모든 원소를 순회하며 값을 넣습니다

그리고 해당 배열을 반환합니다

일단 1로채우겠습니다 1은 흙블록입니다




24b0d121e09c28a8699fe8b115ef046ec94dcaf2


SetDictionary메소드입니다

생성한 mapData를 관리하게 위해 딕셔너리를 사용하겠습니다


24b0d121e09c28a8699fe8b115ef046c65f22c49


딕셔너리의 키는 청크의 오리진입니다

즉 키 값으로 청크의 오리진인 (0,0,0)을 넣으면 (0,0,0)부터 (15,15,15)의 블록데이터를 가진 mapData 3차원 배열을 반환합니다


이제 3중 for문을 통해 딕셔너리를 채워주겠습니다 TotalChunkLength는 x,y,z방향으로 몇개의 청크를 만들건지에 대한 값입니다



24b0d121e09c28a8699fe8b115ef04699239f3bb


해당 좌표의 블록이 공기인지 아닌지 판단하는 IsTransparent함수입니다

첫번째로 음수는 공기블록으로 처리해줍니다

계산의 편의를 위해 저희는 음수좌표를 쓰지 않기로 했습니다 따라서 x,y,z가 음수이면 블록이 없다는 뜻이므로 참을 반환해 면을 그리도록 합니다


만약 좌표가 음수가 아니라면 두번째 if문으로 넘어갑니다

이 if문에서는 받은 좌표의 블록데이터를 얻기 위해 딕셔너리를 참조합니다

받은 좌표의 청크오리진을 구하기위해 16으로 나누어줍니다 그리고 이를 청크키로 지정해줍니다

딕셔너리에 trygetvalue를 합니다 해당하는 키값쌍이 있으면 참을 반환합니다

값이 있다면 이제 맵데이터의 몇번째 블록을 볼지 정해야합니다

받은 x,y,z좌표를 16으로 나머지연산을 해줍니다 그 결과를 맵데이터에 넣어주면 원하는 위치의 블록정보를 얻어올수있습니다


만약 두번째 if문도 넘어가게된다면 

즉 청크오리진에 할당된 맵데이터가 없다면 블록이 없다는 뜻이므로 면을 그려야하겠죠?

true를 반환해줍니다



24b0d121e09c28a8699fe8b115ef046c66f4294b9e


이제 청크를 만들어보겠습니다

기존 CreateChunk와 크게 다른점은 없습니다

3*3*3 규모의 청크들을 생성해보겠습니다


24b0d121e09c28a8699fe8b115ef0469963bf6bcfe



24b0d121e09c28a8699fe8b115ef046eca4ecff122



24b0d121e09c28a8699fe8b115ef046ecf4cccf423


청크사이의 경계면을 제대로 검사해 필요한 면만 그려냈습니다





24b0d121e09c28a8699fe8b115ef046b696e9335



성능이 더욱 오른 느낌입니다