public static TerrainPatch.Header DecodePatchHeader(BitPack bitpack) { TerrainPatch.Header header = new TerrainPatch.Header { QuantWBits = bitpack.UnpackBits(8) }; // Quantized word bits if (header.QuantWBits == END_OF_PATCHES) { return(header); } // DC offset header.DCOffset = bitpack.UnpackFloat(); // Range header.Range = bitpack.UnpackBits(16); // Patch IDs (10 bits) header.PatchIDs = bitpack.UnpackBits(10); // Word bits header.WordBits = (uint)((header.QuantWBits & 0x0f) + 2); return(header); }
public void BitUnpacking() { byte[] data = new byte[] { 0x80, 0x00, 0x0F, 0x50, 0x83, 0x7D }; BitPack bitpacker = new BitPack(data, 0); int b = bitpacker.UnpackBits(1); Assert.IsTrue(b == 1, "Unpacked " + b + " instead of 1"); b = bitpacker.UnpackBits(1); Assert.IsTrue(b == 0, "Unpacked " + b + " instead of 0"); bitpacker = new BitPack(data, 2); b = bitpacker.UnpackBits(4); Assert.IsTrue(b == 0, "Unpacked " + b + " instead of 0"); b = bitpacker.UnpackBits(8); Assert.IsTrue(b == 0xF5, "Unpacked " + b + " instead of 0xF5"); b = bitpacker.UnpackBits(4); Assert.IsTrue(b == 0, "Unpacked " + b + " instead of 0"); b = bitpacker.UnpackBits(10); Assert.IsTrue(b == 0x0183, "Unpacked " + b + " instead of 0x0183"); }
public void BitPacking() { byte[] packedBytes = new byte[12]; BitPack bitpacker = new BitPack(packedBytes, 0); bitpacker.PackBits(0x0ABBCCDD, 32); bitpacker.PackBits(25, 5); bitpacker.PackFloat(123.321f); bitpacker.PackBits(1000, 16); bitpacker = new BitPack(packedBytes, 0); int b = bitpacker.UnpackBits(32); Assert.IsTrue(b == 0x0ABBCCDD, "Unpacked " + b + " instead of 2864434397"); b = bitpacker.UnpackBits(5); Assert.IsTrue(b == 25, "Unpacked " + b + " instead of 25"); float f = bitpacker.UnpackFloat(); Assert.IsTrue(f == 123.321f, "Unpacked " + f + " instead of 123.321"); b = bitpacker.UnpackBits(16); Assert.IsTrue(b == 1000, "Unpacked " + b + " instead of 1000"); }
public static void DecodePatch(int[] patches, BitPack bitpack, TerrainPatch.Header header, int size) { int temp; for (int n = 0; n < size * size; n++) { // ? temp = bitpack.UnpackBits(1); if (temp != 0) { // Value or EOB temp = bitpack.UnpackBits(1); if (temp != 0) { // Value temp = bitpack.UnpackBits(1); if (temp != 0) { // Negative temp = bitpack.UnpackBits((int)header.WordBits); patches[n] = temp * -1; } else { // Positive temp = bitpack.UnpackBits((int)header.WordBits); patches[n] = temp; } } else { // Set the rest to zero // TODO: This might not be necessary for (int o = n; o < size * size; o++) { patches[o] = 0; } break; } } else { patches[n] = 0; } } }
private void UpdateParcelOverlay(SceneParcel parcel) { BitPack bitmap = new BitPack(parcel.Bitmap, 0); for (int y = 0; y < 64; y++) { for (int x = 0; x < 64; x++) { if (bitmap.UnpackBits(1) != 0) { m_parcelOverlay[y * 64 + x] = parcel.LocalID; } } } }
public static int GetParcelArea(SceneParcel parcel, out Vector3 aabbMin, out Vector3 aabbMax) { int minX = 64; int minY = 64; int maxX = 0; int maxY = 0; int area = 0; System.Diagnostics.Debug.Assert(parcel.Bitmap != null); System.Diagnostics.Debug.Assert(parcel.Bitmap.Length == 512); BitPack bitmap = new BitPack(parcel.Bitmap, 0); for (int y = 0; y < 64; y++) { for (int x = 0; x < 64; x++) { if (bitmap.UnpackBits(1) != 0) { int x4 = x * 4; int y4 = y * 4; if (minX > x4) { minX = x4; } if (minY > y4) { minY = y4; } if (maxX < x4) { maxX = x4; } if (maxX < y4) { maxY = y4; } area += 16; } } } aabbMin = new Vector3(minX, minY, 0f); aabbMax = new Vector3(maxX, maxY, 0f); return(area); }
public void SplitParcel(SceneParcel parcel, int startX, int endX, int startY, int endY) { SceneParcel newParcel = new SceneParcel(parcel); newParcel.ID = UUID.Random(); newParcel.LocalID = System.Threading.Interlocked.Increment(ref m_currentParcelID); newParcel.ClaimDate = DateTime.UtcNow; newParcel.Dwell = 0f; m_parcels.Add(newParcel.ID, newParcel.LocalID, newParcel); // Update parcel bitmaps BitPack origParcelBitmap = new BitPack(parcel.Bitmap, 0); BitPack parcelBitmap = new BitPack(new byte[512], 0); BitPack newParcelBitmap = new BitPack(newParcel.Bitmap, 0); for (int y = 0; y < 64; y++) { for (int x = 0; x < 64; x++) { bool origParcelBit = (origParcelBitmap.UnpackBits(1) != 0); if (x >= startX && x <= endX && y >= startY && y <= endY) { // Inside the new parcel parcelBitmap.PackBit(false); newParcelBitmap.PackBit(true); m_parcelOverlay[y * 64 + x] = newParcel.LocalID; } else { // Not inside the new parcel parcelBitmap.PackBit(origParcelBit); newParcelBitmap.PackBit(false); } } } // Update parcel landing info SceneParcel landingParcel; if (TryGetParcel(newParcel.LandingLocation, out landingParcel) && landingParcel == parcel) { newParcel.Landing = LandingType.None; newParcel.LandingLocation = Vector3.Zero; } else { parcel.Landing = LandingType.None; parcel.LandingLocation = Vector3.Zero; } // Update max prim counts Vector3 aabbMin, aabbMax; int area = GetParcelArea(parcel, out aabbMin, out aabbMax); parcel.MaxPrims = (int)Math.Round((float)area * m_primsPerSquareMeter); area = GetParcelArea(newParcel, out aabbMin, out aabbMax); newParcel.MaxPrims = (int)Math.Round((float)area * m_primsPerSquareMeter); Serialize(); }