--- libgig/trunk/src/gig.cpp 2014/05/16 23:08:42 2555 +++ libgig/trunk/src/gig.cpp 2014/05/20 12:15:05 2564 @@ -3509,6 +3509,8 @@ // delete temporary region delete tempRgn; + + UpdateVelocityTable(); } /** @brief Divide split zone of a dimension in two (increment zone amount). @@ -3646,6 +3648,8 @@ // delete temporary region delete tempRgn; + + UpdateVelocityTable(); } DimensionRegion* Region::GetDimensionRegionByBit(const std::map& DimCase) { @@ -3739,16 +3743,18 @@ } bitpos += pDimensionDefinitions[i].bits; } - DimensionRegion* dimreg = pDimensionRegions[dimregidx]; + DimensionRegion* dimreg = pDimensionRegions[dimregidx & 255]; + if (!dimreg) return NULL; if (veldim != -1) { // (dimreg is now the dimension region for the lowest velocity) if (dimreg->VelocityTable) // custom defined zone ranges - bits = dimreg->VelocityTable[DimValues[veldim]]; + bits = dimreg->VelocityTable[DimValues[veldim] & 127]; else // normal split type - bits = uint8_t(DimValues[veldim] / pDimensionDefinitions[veldim].zone_size); + bits = uint8_t((DimValues[veldim] & 127) / pDimensionDefinitions[veldim].zone_size); - dimregidx |= bits << velbitpos; - dimreg = pDimensionRegions[dimregidx]; + const uint8_t limiter_mask = (1 << pDimensionDefinitions[veldim].bits) - 1; + dimregidx |= (bits & limiter_mask) << velbitpos; + dimreg = pDimensionRegions[dimregidx & 255]; } return dimreg; }