for (int i = 0; i < ssx.Count - 1; i++)

                {

                    int startx = ssx[i], endx = ssx[i + 1];

                    for (int j = 0; j < ssy.Count - 1; j++)

                    {

                        int starty = ssy[j], endy = ssy[j + 1];

                        for (int k = 0; k < ssz.Count - 1; k++)

                        {

                            int startz = ssz[k], endz = ssz[k + 1];


                            if (OctreeEditor.global.GetChunkGrid(new Vector3Int(startx, starty, startz)) == null) continue;


                            for (int ii = startx; ii <= endx; ii += 4)

                            {

                                for (int jj = starty; jj <= endy; jj += 4)

                                {

                                    for (int kk = startz; kk <= endz; kk += 4)

                                    {

                                        Vector3Int worldPos = new Vector3Int(ii, jj, kk);

                                        if (GetCube(worldPos) != null)

                                        {

                                            Vector3Int arrInd = EditData.GetMinPos(worldPos - minPos, gridSize) / gridSize;

                                            //8 possible nodes

                                            for (int iii = -1; iii <= 0; iii++)

                                                for (int kkk = -1; kkk <= 0; kkk++)

                                                    for (int jjj = -1; jjj <= 0; jjj++)

                                                    {

                                                        Vector3Int ind = arrInd + new Vector3Int(iii, kkk, jjj);


                                                        if (ind.x >= 0 && ind.y >= 0 && ind.z >= 0 && ind.x < arrSize.x && ind.y < arrSize.y && ind.z < arrSize.z)

                                                        {

                                                            editArr[ind.x * arrSize.y * arrSize.z + ind.y * arrSize.z + ind.z] = 0;


                                                            if (terrain[ind.x * arrSize.y * arrSize.z + ind.y * arrSize.z + ind.z] != -1)//terrain exists

                                                                div[ind.x * arrSize.y * arrSize.z + ind.y * arrSize.z + ind.z] = cubeDivCountTerrainExist;

                                                            else

                                                            {

                                                                div[ind.x * arrSize.y * arrSize.z + ind.y * arrSize.z + ind.z] = cubeDivCount;

                                                            }

                                                        }

                                                    }

                                        }

                                    }

                                }

                            }

                        }

                    }

                }


ㅋㅋㅋ..

근데 이거 아니면 성능 안나와







이제 lod 수준에 무관하게 지형수정정보를 로드해줄 수 있어

전에도 가능은 했는데 성능문제가 많아서 수정이 많으면 로드를 취소하는 편법을 썼었어.


이제는 성능에 딱 수정이 존재하는 범위만큼의 부하만 추가돼



어떤 리프노드에 수정이 존재하면, 해당 수정과 노드 크기 차에 비례해서 추가로 노드를 분할해줘.


최적화를 위해, 청크 내에서 수정이 존재하는 리프노드들을 구해야 해. 

그런데 또 각 리프노드 내에 수정이 존재하는지 알기 위해서는 청크범위 전체를 블록 사이즈 단위로 순회해야 해. 

윗 사진의 lod 청크 크기가 128 (리프노드 크기는 4) 이니깐, 128 * 128 * 128회 순회를 했어야 하는거야.


이걸 줄이기 위해 32 * 32 * 32 범위에 수정이 있는지에 대한 정보를 미리 가지고 있고, 

lod청크를 순회할 때 다시 32 * 32 * 32범위로 나누고 순회하는데, 이 범위에 수정이 있는지에 대한 정보는 한번에 구할 수 있게 해줘서 대부분 스킵할 수 있어.


이걸로 지형 알고리즘은 거의 완성된거 같아. 전부터 이 부분 최적화 해야겠다면서 미루고 있었거든.




층 시스템은 없애기로 결정했어. 

그걸 대체할 시스템을 떠올렸는데, 다이나믹 던전이라고 이름 붙였어.


플레이어가 땅을 파다보면, 주위에 던전을 생성해줘. 높은 확률로 던전과 마주할 수 있도록. 

멀어지면 이 던전을 다시 삭제해줘. 이 던전은 절차적으로 생성해야해.

쉽게 가자면 사전 생성해둔 던전룸들을 주위에 배치하고 이어주면 돼.


복셀 알고리즘을 이용하기 때문에 어렵지 않게 넓은 공간을 한번에 파내고 채워낼 수 있어.


또, 지하에 넓은 공간이 있으면 특수 골렘이 스폰되고, 얘네들을 잡으면 광물을 드롭해.


일단은 괜찮은 아이디어인것 같아.



아 그리고 물 메쉬도 바꿔줬어.

기존에는 지형과 마찬가지로 옥트리로 관리했는데 물은 변형이 일어나지 않으니 괜히 복잡하게 그럴 필요가 없더라고.

마인크래프트 청크 로드하듯이 로드해주는 방식으로 바꿨어.



사진이 없어서 전에 버그났던 사진으로 대체했어

이후에 손봐서 강 바이옴에서 멀어지면서 물이 완전히 사라지게 만들 생각이야. 전에도 그렇게 했는데 지형 알고리즘 바꾸면서 이렇게 됐네.