def testBoth(self): self.assertEqual(-1, zigZagDecode(zigZagEncode(-1))) self.assertEqual(-2, zigZagDecode(zigZagEncode(-2))) self.assertEqual(0, zigZagDecode(zigZagEncode(0))) self.assertEqual(1, zigZagDecode(zigZagEncode(1))) self.assertEqual(2, zigZagDecode(zigZagEncode(2))) self.assertEqual(-10000, zigZagDecode(zigZagEncode(-10000))) self.assertEqual(10000, zigZagDecode(zigZagEncode(10000))) self.assertEqual(0, zigZagEncode(zigZagDecode(0))) self.assertEqual(1, zigZagEncode(zigZagDecode(1))) self.assertEqual(2, zigZagEncode(zigZagDecode(2))) self.assertEqual(2000000, zigZagEncode(zigZagDecode(2000000)))
def fromFile(self, filePath, west, east, south, north, hasLighting=False, hasWatermask=False): self.__init__(west=west, east=east, south=south, north=north) self.hasLighting = hasLighting self.hasWatermask = hasWatermask with open(filePath, 'rb') as f: # Header for k, v in TerrainTile.quantizedMeshHeader.iteritems(): self.header[k] = unpackEntry(f, v) # Delta decoding ud = 0 vd = 0 hd = 0 # Vertices vertexCount = unpackEntry(f, TerrainTile.vertexData['vertexCount']) for i in xrange(0, vertexCount): ud += zigZagDecode( unpackEntry(f, TerrainTile.vertexData['uVertexCount']) ) self.u.append(ud) for i in xrange(0, vertexCount): vd += zigZagDecode( unpackEntry(f, TerrainTile.vertexData['vVertexCount']) ) self.v.append(vd) for i in xrange(0, vertexCount): hd += zigZagDecode( unpackEntry(f, TerrainTile.vertexData['heightVertexCount']) ) self.h.append(hd) # Indices # TODO: verify padding meta = TerrainTile.indexData16 if vertexCount > TerrainTile.BYTESPLIT: meta = TerrainTile.indexData32 triangleCount = unpackEntry(f, meta['triangleCount']) ind = unpackIndices(f, triangleCount * 3, meta['indices']) self.indices = decodeIndices(ind) meta = TerrainTile.EdgeIndices16 if vertexCount > TerrainTile.BYTESPLIT: meta = TerrainTile.indexData32 # Edges (vertices on the edge of the tile) # Indices (are the also high water mark encoded?) westIndicesCount = unpackEntry(f, meta['westVertexCount']) self.westI = unpackIndices(f, westIndicesCount, meta['westIndices']) southIndicesCount = unpackEntry(f, meta['southVertexCount']) self.southI = unpackIndices(f, southIndicesCount, meta['southIndices']) eastIndicesCount = unpackEntry(f, meta['eastVertexCount']) self.eastI = unpackIndices(f, eastIndicesCount, meta['eastIndices']) northIndicesCount = unpackEntry(f, meta['northVertexCount']) self.northI = unpackIndices(f, northIndicesCount, meta['northIndices']) if self.hasLighting: # One byte of padding # Light extension header meta = TerrainTile.ExtensionHeader extensionId = unpackEntry(f, meta['extensionId']) if extensionId == 1: extensionLength = unpackEntry(f, meta['extensionLength']) # Consider padding of 2 bits, no idea why? f.read(2) for i in xrange(0, (extensionLength / 2) - 1): x = unpackEntry(f, TerrainTile.OctEncodedVertexNormals['xy']) y = unpackEntry(f, TerrainTile.OctEncodedVertexNormals['xy']) self.vLight.append(octDecode(x, y)) if self.hasWatermask: meta = TerrainTile.ExtensionHeader extensionId = unpackEntry(f, meta['extensionId']) if extensionId == 2: extensionLength = unpackEntry(f, meta['extensionLength']) row = [] for i in xrange(0, extensionLength): row.append(unpackEntry(f, TerrainTile.WaterMask['xy'])) if len(row) == 256: self.watermask.append(row) row = [] if len(row) > 0: self.watermask.append(row) data = f.read(1) if data: raise Exception('Should have reached end of file, but didn\'t')
def testBoth(self): self.assertEqual(-1, zigZagDecode(zigZagEncode(-1))) self.assertEqual(-2, zigZagDecode(zigZagEncode(-2))) self.assertEqual(0, zigZagDecode(zigZagEncode(0))) self.assertEqual(1, zigZagDecode(zigZagEncode(1))) self.assertEqual(2, zigZagDecode(zigZagEncode(2))) self.assertEqual(-10000, zigZagDecode(zigZagEncode(-10000))) self.assertEqual(10000, zigZagDecode(zigZagEncode(10000))) self.assertEqual(0, zigZagEncode(zigZagDecode(0))) self.assertEqual(1, zigZagEncode(zigZagDecode(1))) self.assertEqual(2, zigZagEncode(zigZagDecode(2))) self.assertEqual(2000000, zigZagEncode(zigZagDecode(2000000)))