fV3 BlockFormation::getOffset(fV3 direction, size_t rank, size_t file) const
{
  fV3 left(-direction.y, direction.x, direction.z),
      rank_offset(direction * (rank_middle - (rank * spacing))),
      file_offset(left * ((file * spacing) - file_middle));

  return (rank_offset + file_offset);
}
Esempio n. 2
0
bool Archive::InitFiles() {
	// Create FileInfo structures from the data entries within the hogg
	if (fseek(file_, hogg::HOGG_DATAENTRIES_OFFSET, SEEK_SET) != 0) {
		perror("Failed to seek to the data entries section");
		return false;
	}

	char* dataEntryData = new char[sizeof(hogg::DataEntry) * num_files_];
	fread(dataEntryData, sizeof(hogg::DataEntry), num_files_, file_);

	hogg::DataEntry* dataEntry = (hogg::DataEntry*)dataEntryData;

	int i;
	for (i = 0; i < num_files_; i++) {
		auto fi = new FileInfo(this);
		fi->data_size(dataEntry->size_on_disk);
		fi->file_offset(dataEntry->file_offset);
		fi->last_updated(dataEntry->timestamp);

		file_infos_[i] = fi;
		dataEntry++;
	}

	delete [] dataEntryData;

	// Set the decompressed size of FileInfos which are compressed
	char* compressionData = new char[sizeof(hogg::CompressionInfo) * num_files_];
	fread(compressionData, sizeof(hogg::CompressionInfo), num_files_, file_);

	hogg::CompressionInfo* compressionInfo = (hogg::CompressionInfo*)compressionData;

	for (i = 0; i < num_files_; i++) {
		auto fi = file_infos_[i];
		fi->file_path_string_id(compressionInfo->file_path_id);
		fi->decompressed_size(compressionInfo->uncompressed_size);

		compressionInfo++;
	}

	delete [] compressionData;

	return true;
}