Open Source Tomb Raider Engine
Vous ne pouvez pas sélectionner plus de 25 sujets Les noms de sujets doivent commencer par une lettre ou un nombre, peuvent contenir des tirets ('-') et peuvent comporter jusqu'à 35 caractères.

LoaderTR3.cpp 3.2KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116
  1. /*!
  2. * \file src/loader/LoaderTR3.cpp
  3. * \brief TR3 level file loader
  4. *
  5. * \author xythobuz
  6. */
  7. #include "global.h"
  8. #include "loader/LoaderTR3.h"
  9. int LoaderTR3::load(std::string f) {
  10. if (file.open(f) != 0) {
  11. return 1; // Could not open file
  12. }
  13. uint32_t version = file.readU32();
  14. if ((version != 0xFF080038) && (version != 0xFF180038)) {
  15. return 2; // Not a TR3 level?!
  16. }
  17. loadPalette();
  18. loadTextures();
  19. file.seek(file.tell() + 4); // Unused value?
  20. loadRooms();
  21. loadFloorData();
  22. loadMeshes();
  23. loadMoveables();
  24. loadStaticMeshes();
  25. loadSprites();
  26. loadCameras();
  27. loadSoundSources();
  28. loadBoxesOverlapsZones();
  29. loadAnimatedTextures();
  30. loadTextiles();
  31. loadItems();
  32. file.seek(file.tell() + 8192); // Skip Light map, only for 8bit coloring
  33. loadCinematicFrames();
  34. loadDemoData();
  35. loadSoundMap();
  36. loadSoundDetails();
  37. loadSampleIndices();
  38. loadExternalSoundFile(f);
  39. // TODO load TR3 PC version CDAUDIO.WAD file
  40. // TODO load TR3 Mac version CDAudio.db and WAV files
  41. return 0;
  42. }
  43. void LoaderTR3::loadRoomLights() {
  44. int16_t intensity1 = file.read16();
  45. int16_t intensity2 = file.read16();
  46. uint16_t numLights = file.readU16();
  47. for (unsigned int l = 0; l < numLights; l++) {
  48. // Position of light, in world coordinates
  49. int32_t x = file.read32();
  50. int32_t y = file.read32();
  51. int32_t z = file.read32();
  52. uint16_t intensity1 = file.readU16();
  53. uint16_t intensity2 = file.readU16(); // Almost always equal to intensity1
  54. uint32_t fade1 = file.readU32(); // Falloff value?
  55. uint32_t fade2 = file.readU32(); // Falloff value?
  56. // TODO store light somewhere
  57. }
  58. }
  59. void LoaderTR3::loadRoomDataEnd(int16_t& alternateRoom, unsigned int& roomFlags) {
  60. LoaderTR2::loadRoomDataEnd(alternateRoom, roomFlags);
  61. uint8_t r = file.readU8();
  62. uint8_t g = file.readU8();
  63. uint8_t b = file.readU8();
  64. // TODO store room-light color (?) somewhere
  65. }
  66. void LoaderTR3::loadRoomMesh(std::vector<IndexedRectangle>& rectangles,
  67. std::vector<IndexedRectangle>& triangles,
  68. uint16_t& numRectangles, uint16_t& numTriangles) {
  69. numRectangles = file.readU16();
  70. for (unsigned int r = 0; r < numRectangles; r++) {
  71. // Indices into the vertex list read just before
  72. uint16_t vertex1 = file.readU16();
  73. uint16_t vertex2 = file.readU16();
  74. uint16_t vertex3 = file.readU16();
  75. uint16_t vertex4 = file.readU16();
  76. // Index into the object-texture list
  77. uint16_t texture = file.readU16() & 0x7FFF;
  78. rectangles.emplace_back(texture, vertex1, vertex2, vertex3, vertex4);
  79. }
  80. numTriangles = file.readU16();
  81. for (unsigned int t = 0; t < numTriangles; t++) {
  82. // Indices into the room vertex list
  83. uint16_t vertex1 = file.readU16();
  84. uint16_t vertex2 = file.readU16();
  85. uint16_t vertex3 = file.readU16();
  86. // Index into the object-texture list
  87. uint16_t texture = file.readU16() & 0x7FFF;
  88. triangles.emplace_back(texture, vertex1, vertex2, vertex3);
  89. }
  90. }