Advertisement
YaLTeR

Rage demo reader

Jun 15th, 2015
270
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.13 KB | None | 0 0
  1. #include <fstream>
  2. #include <iomanip>
  3. #include <iostream>
  4. #include <cstdint>
  5. #include <vector>
  6.  
  7. #include <intrin.h>
  8.  
  9. const double M_PI = 3.14159265358979323846;
  10.  
  11. // Stolen from HLSDK, added the roll calculation.
  12. void VectorAngles(const float forward[3], const float right[3], double angles[3])
  13. {
  14.     double tmp, yaw, pitch, roll;
  15.  
  16.     if (forward[1] == 0 && forward[0] == 0) {
  17.         yaw = 0;
  18.         if (forward[2] > 0)
  19.             pitch = 90;
  20.         else
  21.             pitch = 270;
  22.     } else {
  23.         yaw = (std::atan2(forward[1], forward[0]) * 180 / M_PI);
  24.         if (yaw < 0)
  25.             yaw += 360;
  26.  
  27.         tmp = std::sqrt(forward[0] * forward[0] + forward[1] * forward[1]);
  28.         pitch = (std::atan2(-forward[2], tmp) * 180 / M_PI);
  29.         if (pitch < 0)
  30.             pitch += 360;
  31.  
  32.         tmp = std::sqrt(right[0] * right[0] + right[1] * right[1]);
  33.         roll = (std::atan2(-right[2], tmp) * 180 / M_PI);
  34.         if (roll < 0)
  35.             roll += 360;
  36.     }
  37.  
  38.     angles[0] = pitch;
  39.     angles[1] = yaw;
  40.     angles[2] = roll;
  41. }
  42.  
  43. void ScanFrame(const unsigned char frame[147])
  44. {
  45.     uint32_t fOrigin[3];
  46.     std::memcpy(fOrigin, frame + 0x62, sizeof(fOrigin));
  47.     fOrigin[0] = _byteswap_ulong(fOrigin[0]);
  48.     fOrigin[1] = _byteswap_ulong(fOrigin[1]);
  49.     fOrigin[2] = _byteswap_ulong(fOrigin[2]);
  50.  
  51.     float *origin = reinterpret_cast<float*>(fOrigin);
  52.     std::cout << "Origin: " << origin[0] << " " << origin[1] << " " << origin[2] << "\t";
  53.  
  54.     uint32_t fFOV[2];
  55.     std::memcpy(fFOV, frame + 0x18, sizeof(fFOV));
  56.     fFOV[0] = _byteswap_ulong(fFOV[0]);
  57.     fFOV[1] = _byteswap_ulong(fFOV[1]);
  58.  
  59.     float *FOV = reinterpret_cast<float*>(fFOV);
  60.     std::cout << "FOV: " << FOV[0] << " " << FOV[1] << "\t";
  61.  
  62.     uint32_t fVectors[9];
  63.     std::memcpy(fVectors, frame + 0x6e, sizeof(fVectors));
  64.     for (int i = 0; i < 9; ++i) fVectors[i] = _byteswap_ulong(fVectors[i]);
  65.  
  66.     float *forward = reinterpret_cast<float*>(fVectors),
  67.         *right = reinterpret_cast<float*>(&fVectors[3]),
  68.         *up = reinterpret_cast<float*>(&fVectors[6]);
  69.  
  70.     double angles[3];
  71.     VectorAngles(forward, right, angles);
  72.     std::cout << "Angles: " << angles[0] << " " << angles[1] << " " << angles[2];
  73.  
  74.     std::cout << "\n";
  75. }
  76.  
  77. int main(int argc, char *argv[]) {
  78.     if (argc != 2) {
  79.         std::cerr << "Usage: tool.exe <filename>\n";
  80.         return 1;
  81.     }
  82.  
  83.     std::ifstream in(argv[1], std::ios::binary);
  84.     if (!in.is_open()) {
  85.         std::cerr << "Error opening the input file.\n";
  86.         return 1;
  87.     }
  88.     in.seekg(0, std::ios::end);
  89.     std::size_t size = in.tellg();
  90.     if (size <= 4 || (size - 4) % 147) {
  91.         std::cout << "Wrong file size: size <= 4 or (size - 4) not divisible by 147!\n";
  92.         return 1;
  93.     }
  94.     in.seekg(0, std::ios::beg);
  95.  
  96.     std::vector<char> buf(size);
  97.     std::copy(std::istreambuf_iterator<char>(in), std::istreambuf_iterator<char>(), buf.begin());
  98.  
  99.     uint32_t unk;
  100.     std::memcpy(&unk, buf.data(), 4);
  101.     std::cout << "First 4 bytes: " << std::hex << unk << std::dec << std::fixed << std::setprecision(6) << "\n";
  102.  
  103.     int lines = 0;
  104.     std::size_t bytesread = 4;
  105.     while (bytesread < size) {
  106.         char frame[147];
  107.         std::memcpy(frame, buf.data() + bytesread, 147);
  108.  
  109.         std::cout << "Frame " << lines << ":\t";
  110.         ScanFrame(reinterpret_cast<const unsigned char*>(frame));
  111.  
  112.         bytesread += 147;
  113.         lines++;
  114.     }
  115.  
  116.     std::system("pause");
  117. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement