Beispiel #1
0
    void GenMesh(Func <PointI, int> gen, int maxTerrIdx, RangeI[] ranges)
    {
        for (int ti = 1; ti <= maxTerrIdx; ti++)
        {
            for (int d = 0; d < 3; d++)
            {
                int id, jd;
                switch (d)
                {
                case 0: id = 1; jd = 2; break;

                case 1: id = 2; jd = 0; break;

                case 2: id = 0; jd = 1; break;

                default: throw new InvalidProgramException();
                }

                int ni = ranges[id].Max - ranges[id].Min;
                int nj = ranges[jd].Max - ranges[jd].Min;

                for (int dir = 0; dir < 2; dir++)
                {
                    for (int k = ranges[d].Min; k < ranges[d].Max - 1; k++)
                    {
                        //Filling slice
                        int[,] slice = new int[ni, nj];
                        int n = 0;
                        for (int i = 0; i < ni; i++)
                        {
                            for (int j = 0; j < nj; j++)
                            {
                                PointI p0 = new PointI(3);
                                p0[d]  = k;
                                p0[id] = i + ranges[id].Min;
                                p0[jd] = j + ranges[jd].Min;
                                PointI p1 = p0.Clone();
                                p1[d]++;

                                int v0 = gen(p0);
                                int v1 = gen(p1);

                                if (dir == 0 && v0 == ti && v1 == 0 ||
                                    dir == 1 && v0 == 0 && v1 == ti)
                                {
                                    slice[i, j] = 1;
                                    n++;
                                }
                            }
                        }

                        //Draw quads greedy
                        //int debugI = 0;
                        while (n > 0)
                        {
                            int l = 0, t = 0;

                            //Find left top
                            for (int i = 0; i < ni; i++)
                            {
                                for (int j = 0; j < nj; j++)
                                {
                                    if (slice[i, j] == 1)
                                    {
                                        t = i;
                                        l = j;
                                        goto Exit1;
                                    }
                                }
                            }

Exit1:
                            //Find width
                            int w = 1;
                            for (int j = l + 1; j < nj; j++, w++)
                            {
                                if (slice[t, j] == 0)
                                {
                                    break;
                                }
                            }

                            //Find height
                            int h = 1;
                            for (int i = t + 1; i < ni; i++, h++)
                            {
                                for (int j = l; j < l + w; j++)
                                {
                                    if (slice[i, j] == 0)
                                    {
                                        goto Exit2;
                                    }
                                }
                            }

Exit2:
                            //Erase slice
                            for (int i = t; i < t + h; i++)
                            {
                                for (int j = l; j < l + w; j++)
                                {
                                    slice[i, j] = 0;
                                    n--;
                                }
                            }

                            DrawQuad(d, dir, k, ti, new RangeI(t, t + h), new RangeI(l, l + w));

                            //debugI++;
                            //if (debugI > 100) break;
                        }
                    }
                }
            }
        }
    }