public void FloodLight(int[] chunk, byte[] light, int startx, int starty, int startz, int[] dataLightRadius, bool[] dataTransparent) { int start = Index3d(startx, starty, startz, 16, 16); if (light[start] == minlight) { return; } q.Clear(); q.Push(start); for (; ;) { if (q.Count == 0) { break; } int vPos = q.Pop(); int vLight = light[vPos]; if (vLight == minlight) { continue; } int vBlock = chunk[vPos]; if (!dataTransparent[vBlock] && dataLightRadius[vBlock] == 0) { continue; } int x = MapUtilCi.PosX(vPos, 16, 16); int y = MapUtilCi.PosY(vPos, 16, 16); int z = MapUtilCi.PosZ(vPos, 16, 16); if (x < 15) { Push(q, light, vLight, vPos + XPlus); } if (x > 0) { Push(q, light, vLight, vPos + XMinus); } if (y < 15) { Push(q, light, vLight, vPos + YPlus); } if (y > 0) { Push(q, light, vLight, vPos + YMinus); } if (z < 15) { Push(q, light, vLight, vPos + ZPlus); } if (z > 0) { Push(q, light, vLight, vPos + ZMinus); } } }
void LightEmitting(int[] workportion, byte[] worklight, int[] dataLightRadius, bool[] dataTransparent) { const int portionsize = 16; const int portionsize3 = portionsize * portionsize * portionsize; for (int pos = 0; pos < portionsize3; pos++) { if (workportion[pos] >= 10) //optimization { if (dataLightRadius[workportion[pos]] != 0) //optimization { if (dataLightRadius[workportion[pos]] > worklight[pos]) { int xx = MapUtilCi.PosX(pos, portionsize, portionsize); int yy = MapUtilCi.PosY(pos, portionsize, portionsize); int zz = MapUtilCi.PosZ(pos, portionsize, portionsize); int l = dataLightRadius[workportion[pos]]; worklight[pos] = Game.IntToByte(MathCi.MaxInt(l, worklight[pos])); flood.FloodLight(workportion, worklight, xx, yy, zz, dataLightRadius, dataTransparent); } } } } }
public static void FloodLight_(FastQueueInt q, int[] portion, byte[] light, int startx, int starty, int startz, int[] dataLightRadius, bool[] dataTransparent) { const int portionsize = 16; int pos = Index3d(startx, starty, startz, portionsize, portionsize); if (light[pos] == minlight) { return; } int lightradius = dataLightRadius[portion[pos]]; if (lightradius != 0) { light[pos] = Game.IntToByte(lightradius); } //if (light[pos + 1] == light[pos] // && light[pos - 1] == light[pos] // && light[pos + portionsize] == light[pos] // && light[pos - portionsize] == light[pos] // && light[pos + portionsize * portionsize] == light[pos] // && light[pos - portionsize * portionsize] == light[pos]) //{ // return; //} q.Clear(); int start = Index3d(startx, starty, startz, portionsize, portionsize); q.Push(start); for (; ;) { if (q.Count == 0) { break; } int vpos = q.Pop(); int vlight = light[vpos]; if (vlight == minlight) { continue; } int vblock = portion[vpos]; if (!dataTransparent[vblock] && dataLightRadius[vblock] == 0) { continue; } int x = MapUtilCi.PosX(vpos, 16, 16); int y = MapUtilCi.PosY(vpos, 16, 16); int z = MapUtilCi.PosZ(vpos, 16, 16); if (x < 15) { Push(q, light, vlight, vpos + XPlus); } if (x > 0) { Push(q, light, vlight, vpos + XMinus); } if (y < 15) { Push(q, light, vlight, vpos + YPlus); } if (y > 0) { Push(q, light, vlight, vpos + YMinus); } if (z < 15) { Push(q, light, vlight, vpos + ZPlus); } if (z > 0) { Push(q, light, vlight, vpos + ZMinus); } } }