rw-parser-ng 2.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (72) hide show
  1. package/LICENSE +674 -0
  2. package/README.md +88 -0
  3. package/lib/index.d.ts +6 -0
  4. package/lib/index.js +26 -0
  5. package/lib/renderware/RwFile.d.ts +10 -0
  6. package/lib/renderware/RwFile.js +33 -0
  7. package/lib/renderware/RwSections.d.ts +20 -0
  8. package/lib/renderware/RwSections.js +29 -0
  9. package/lib/renderware/dff/DffModelType.d.ts +5 -0
  10. package/lib/renderware/dff/DffModelType.js +9 -0
  11. package/lib/renderware/dff/DffParser.d.ts +155 -0
  12. package/lib/renderware/dff/DffParser.js +418 -0
  13. package/lib/renderware/errors/RwParseError.d.ts +6 -0
  14. package/lib/renderware/errors/RwParseError.js +34 -0
  15. package/lib/renderware/txd/TxdParser.d.ts +38 -0
  16. package/lib/renderware/txd/TxdParser.js +185 -0
  17. package/lib/renderware/utils/ImageDecoder.d.ts +23 -0
  18. package/lib/renderware/utils/ImageDecoder.js +512 -0
  19. package/lib/renderware/utils/ImageFormatEnums.d.ts +25 -0
  20. package/lib/renderware/utils/ImageFormatEnums.js +32 -0
  21. package/lib/renderware/utils/RwVersion.d.ts +7 -0
  22. package/lib/renderware/utils/RwVersion.js +30 -0
  23. package/lib/scripts/sort_models.d.ts +1 -0
  24. package/lib/scripts/sort_models.js +185 -0
  25. package/lib/scripts/sort_worker.d.ts +1 -0
  26. package/lib/scripts/sort_worker.js +140 -0
  27. package/lib/src/index.d.ts +8 -0
  28. package/lib/src/index.js +28 -0
  29. package/lib/src/renderware/RwFile.d.ts +10 -0
  30. package/lib/src/renderware/RwFile.js +33 -0
  31. package/lib/src/renderware/RwSections.d.ts +20 -0
  32. package/lib/src/renderware/RwSections.js +29 -0
  33. package/lib/src/renderware/common/types.d.ts +50 -0
  34. package/lib/src/renderware/common/types.js +2 -0
  35. package/lib/src/renderware/dff/DffModelType.d.ts +5 -0
  36. package/lib/src/renderware/dff/DffModelType.js +9 -0
  37. package/lib/src/renderware/dff/DffParser.d.ts +112 -0
  38. package/lib/src/renderware/dff/DffParser.js +418 -0
  39. package/lib/src/renderware/errors/RwParseError.d.ts +6 -0
  40. package/lib/src/renderware/errors/RwParseError.js +34 -0
  41. package/lib/src/renderware/ifp/IfpData.d.ts +28 -0
  42. package/lib/src/renderware/ifp/IfpData.js +9 -0
  43. package/lib/src/renderware/ifp/IfpParser.d.ts +12 -0
  44. package/lib/src/renderware/ifp/IfpParser.js +196 -0
  45. package/lib/src/renderware/txd/TxdParser.d.ts +38 -0
  46. package/lib/src/renderware/txd/TxdParser.js +185 -0
  47. package/lib/src/renderware/utils/ImageDecoder.d.ts +23 -0
  48. package/lib/src/renderware/utils/ImageDecoder.js +512 -0
  49. package/lib/src/renderware/utils/ImageFormatEnums.d.ts +25 -0
  50. package/lib/src/renderware/utils/ImageFormatEnums.js +32 -0
  51. package/lib/src/renderware/utils/RwVersion.d.ts +7 -0
  52. package/lib/src/renderware/utils/RwVersion.js +30 -0
  53. package/lib/src/utils/ByteStream.d.ts +17 -0
  54. package/lib/src/utils/ByteStream.js +65 -0
  55. package/lib/utils/ByteStream.d.ts +16 -0
  56. package/lib/utils/ByteStream.js +60 -0
  57. package/package.json +64 -0
  58. package/src/index.ts +10 -0
  59. package/src/renderware/RwFile.ts +22 -0
  60. package/src/renderware/RwSections.ts +27 -0
  61. package/src/renderware/common/types.ts +59 -0
  62. package/src/renderware/dff/DffModelType.ts +5 -0
  63. package/src/renderware/dff/DffParser.ts +596 -0
  64. package/src/renderware/errors/RwParseError.ts +11 -0
  65. package/src/renderware/ifp/IfpData.ts +33 -0
  66. package/src/renderware/ifp/IfpParser.ts +203 -0
  67. package/src/renderware/txd/TxdParser.ts +234 -0
  68. package/src/renderware/utils/ImageDecoder.ts +571 -0
  69. package/src/renderware/utils/ImageFormatEnums.ts +28 -0
  70. package/src/renderware/utils/RwVersion.ts +28 -0
  71. package/src/utils/ByteStream.ts +75 -0
  72. package/tsconfig.json +68 -0
@@ -0,0 +1,185 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
36
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
37
+ return new (P || (P = Promise))(function (resolve, reject) {
38
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
39
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
40
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
41
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
42
+ });
43
+ };
44
+ var __generator = (this && this.__generator) || function (thisArg, body) {
45
+ var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g = Object.create((typeof Iterator === "function" ? Iterator : Object).prototype);
46
+ return g.next = verb(0), g["throw"] = verb(1), g["return"] = verb(2), typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
47
+ function verb(n) { return function (v) { return step([n, v]); }; }
48
+ function step(op) {
49
+ if (f) throw new TypeError("Generator is already executing.");
50
+ while (g && (g = 0, op[0] && (_ = 0)), _) try {
51
+ if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
52
+ if (y = 0, t) op = [op[0] & 2, t.value];
53
+ switch (op[0]) {
54
+ case 0: case 1: t = op; break;
55
+ case 4: _.label++; return { value: op[1], done: false };
56
+ case 5: _.label++; y = op[1]; op = [0]; continue;
57
+ case 7: op = _.ops.pop(); _.trys.pop(); continue;
58
+ default:
59
+ if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
60
+ if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
61
+ if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
62
+ if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
63
+ if (t[2]) _.ops.pop();
64
+ _.trys.pop(); continue;
65
+ }
66
+ op = body.call(thisArg, _);
67
+ } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
68
+ if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
69
+ }
70
+ };
71
+ var __spreadArray = (this && this.__spreadArray) || function (to, from, pack) {
72
+ if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {
73
+ if (ar || !(i in from)) {
74
+ if (!ar) ar = Array.prototype.slice.call(from, 0, i);
75
+ ar[i] = from[i];
76
+ }
77
+ }
78
+ return to.concat(ar || Array.prototype.slice.call(from));
79
+ };
80
+ var _a;
81
+ Object.defineProperty(exports, "__esModule", { value: true });
82
+ var worker_threads_1 = require("worker_threads");
83
+ var index_1 = require("../src/index");
84
+ var fs_1 = require("fs");
85
+ var path = __importStar(require("path"));
86
+ var os = __importStar(require("os"));
87
+ var sourceDir = 'C:\\Users\\Administrator\\Documents\\Code\\playground-render\\assets\\source_skins';
88
+ var outputDir = 'C:\\Users\\Administrator\\Documents\\Code\\playground-render\\assets\\sorted_skins';
89
+ var modelTypeToDir = (_a = {},
90
+ _a[index_1.DffModelType.GENERIC] = 'objects',
91
+ _a[index_1.DffModelType.SKIN] = 'skins',
92
+ _a[index_1.DffModelType.VEHICLE] = 'vehicles',
93
+ _a);
94
+ function createDirectory(dir) {
95
+ return __awaiter(this, void 0, void 0, function () {
96
+ return __generator(this, function (_a) {
97
+ switch (_a.label) {
98
+ case 0: return [4 /*yield*/, fs_1.promises.mkdir(dir, { recursive: true })];
99
+ case 1:
100
+ _a.sent();
101
+ return [2 /*return*/];
102
+ }
103
+ });
104
+ });
105
+ }
106
+ function sortAndIndexAssets() {
107
+ return __awaiter(this, void 0, void 0, function () {
108
+ var texturesDir, modelDirs, allFiles, filesQueue, numWorkers, modelIndex, textureIndex, processedFiles, runWorker, workerPromises, i;
109
+ return __generator(this, function (_a) {
110
+ switch (_a.label) {
111
+ case 0:
112
+ console.time('Total execution time');
113
+ texturesDir = path.join(outputDir, 'textures');
114
+ modelDirs = Object.values(modelTypeToDir).map(function (dir) { return path.join(outputDir, dir); });
115
+ return [4 /*yield*/, Promise.all(__spreadArray([createDirectory(texturesDir)], modelDirs.map(createDirectory), true))];
116
+ case 1:
117
+ _a.sent();
118
+ return [4 /*yield*/, fs_1.promises.readdir(sourceDir)];
119
+ case 2:
120
+ allFiles = (_a.sent()).filter(function (f) { return ['.dff', '.txd'].includes(path.extname(f).toLowerCase()); });
121
+ filesQueue = __spreadArray([], allFiles, true);
122
+ numWorkers = os.cpus().length;
123
+ console.log("Starting processing with ".concat(numWorkers, " workers for ").concat(allFiles.length, " files."));
124
+ modelIndex = { skins: [], objects: [], vehicles: [] };
125
+ textureIndex = {};
126
+ processedFiles = 0;
127
+ runWorker = function (workerId) { return new Promise(function (resolve, reject) {
128
+ var worker = new worker_threads_1.Worker(path.join(__dirname, 'sort_worker.js'));
129
+ worker.on('message', function (result) {
130
+ processedFiles++;
131
+ process.stdout.write("\rProcessing: ".concat(processedFiles, "/").concat(allFiles.length));
132
+ if (result.type === 'dff') {
133
+ modelIndex[result.category].push(result.file);
134
+ }
135
+ else if (result.type === 'txd') {
136
+ textureIndex[result.file] = result.textures;
137
+ }
138
+ else if (result.type === 'error') {
139
+ console.error("\n[Worker ".concat(workerId, "] Error processing ").concat(result.file, ": ").concat(result.message));
140
+ }
141
+ if (filesQueue.length > 0) {
142
+ worker.postMessage({ file: filesQueue.pop(), sourceDir: sourceDir, outputDir: outputDir, texturesDir: texturesDir, modelTypeToDir: modelTypeToDir });
143
+ }
144
+ else {
145
+ worker.postMessage(null);
146
+ }
147
+ });
148
+ worker.on('error', reject);
149
+ worker.on('exit', function (code) {
150
+ if (code === 0) {
151
+ resolve();
152
+ }
153
+ else {
154
+ reject(new Error("Worker ".concat(workerId, " stopped with exit code ").concat(code)));
155
+ }
156
+ });
157
+ if (filesQueue.length > 0) {
158
+ worker.postMessage({ file: filesQueue.pop(), sourceDir: sourceDir, outputDir: outputDir, texturesDir: texturesDir, modelTypeToDir: modelTypeToDir });
159
+ }
160
+ else {
161
+ worker.postMessage(null);
162
+ }
163
+ }); };
164
+ workerPromises = [];
165
+ for (i = 0; i < numWorkers; i++) {
166
+ workerPromises.push(runWorker(i + 1));
167
+ }
168
+ return [4 /*yield*/, Promise.all(workerPromises)];
169
+ case 3:
170
+ _a.sent();
171
+ console.log('\nWriting index files...');
172
+ return [4 /*yield*/, Promise.all([
173
+ fs_1.promises.writeFile(path.join(outputDir, 'index.json'), JSON.stringify(modelIndex, null, 2)),
174
+ fs_1.promises.writeFile(path.join(texturesDir, 'index.json'), JSON.stringify(textureIndex, null, 2))
175
+ ])];
176
+ case 4:
177
+ _a.sent();
178
+ console.log('Sorting and indexing complete!');
179
+ console.timeEnd('Total execution time');
180
+ return [2 /*return*/];
181
+ }
182
+ });
183
+ });
184
+ }
185
+ sortAndIndexAssets().catch(console.error);
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,140 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
36
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
37
+ return new (P || (P = Promise))(function (resolve, reject) {
38
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
39
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
40
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
41
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
42
+ });
43
+ };
44
+ var __generator = (this && this.__generator) || function (thisArg, body) {
45
+ var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g = Object.create((typeof Iterator === "function" ? Iterator : Object).prototype);
46
+ return g.next = verb(0), g["throw"] = verb(1), g["return"] = verb(2), typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
47
+ function verb(n) { return function (v) { return step([n, v]); }; }
48
+ function step(op) {
49
+ if (f) throw new TypeError("Generator is already executing.");
50
+ while (g && (g = 0, op[0] && (_ = 0)), _) try {
51
+ if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
52
+ if (y = 0, t) op = [op[0] & 2, t.value];
53
+ switch (op[0]) {
54
+ case 0: case 1: t = op; break;
55
+ case 4: _.label++; return { value: op[1], done: false };
56
+ case 5: _.label++; y = op[1]; op = [0]; continue;
57
+ case 7: op = _.ops.pop(); _.trys.pop(); continue;
58
+ default:
59
+ if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
60
+ if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
61
+ if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
62
+ if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
63
+ if (t[2]) _.ops.pop();
64
+ _.trys.pop(); continue;
65
+ }
66
+ op = body.call(thisArg, _);
67
+ } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
68
+ if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
69
+ }
70
+ };
71
+ Object.defineProperty(exports, "__esModule", { value: true });
72
+ var worker_threads_1 = require("worker_threads");
73
+ var index_1 = require("../src/index");
74
+ var fs_1 = require("fs");
75
+ var path = __importStar(require("path"));
76
+ if (!worker_threads_1.parentPort) {
77
+ throw new Error('This script must be run as a worker thread.');
78
+ }
79
+ function processFile(task) {
80
+ return __awaiter(this, void 0, void 0, function () {
81
+ var file, sourceDir, outputDir, texturesDir, modelTypeToDir, sourcePath, ext, dffBuffer, modelType, targetDirName, destPath, destPath, txdBuffer, textureDictionary, textureNames, error_1;
82
+ return __generator(this, function (_a) {
83
+ switch (_a.label) {
84
+ case 0:
85
+ file = task.file, sourceDir = task.sourceDir, outputDir = task.outputDir, texturesDir = task.texturesDir, modelTypeToDir = task.modelTypeToDir;
86
+ sourcePath = path.join(sourceDir, file);
87
+ ext = path.extname(file).toLowerCase();
88
+ _a.label = 1;
89
+ case 1:
90
+ _a.trys.push([1, 8, , 9]);
91
+ if (!(ext === '.dff')) return [3 /*break*/, 4];
92
+ return [4 /*yield*/, fs_1.promises.readFile(sourcePath)];
93
+ case 2:
94
+ dffBuffer = _a.sent();
95
+ modelType = new index_1.DffParser(dffBuffer).parse().modelType;
96
+ targetDirName = modelTypeToDir[modelType];
97
+ destPath = path.join(outputDir, targetDirName, file);
98
+ return [4 /*yield*/, fs_1.promises.copyFile(sourcePath, destPath)];
99
+ case 3:
100
+ _a.sent();
101
+ return [2 /*return*/, { type: 'dff', file: file, category: targetDirName }];
102
+ case 4:
103
+ if (!(ext === '.txd')) return [3 /*break*/, 7];
104
+ destPath = path.join(texturesDir, file);
105
+ return [4 /*yield*/, fs_1.promises.copyFile(sourcePath, destPath)];
106
+ case 5:
107
+ _a.sent();
108
+ return [4 /*yield*/, fs_1.promises.readFile(sourcePath)];
109
+ case 6:
110
+ txdBuffer = _a.sent();
111
+ textureDictionary = new index_1.TxdParser(txdBuffer).parse().textureDictionary;
112
+ textureNames = textureDictionary.textureNatives.map(function (t) { return t.textureName; });
113
+ return [2 /*return*/, { type: 'txd', file: file, textures: textureNames }];
114
+ case 7: return [3 /*break*/, 9];
115
+ case 8:
116
+ error_1 = _a.sent();
117
+ return [2 /*return*/, { type: 'error', file: file, message: error_1.message }];
118
+ case 9: return [2 /*return*/];
119
+ }
120
+ });
121
+ });
122
+ }
123
+ worker_threads_1.parentPort.on('message', function (task) { return __awaiter(void 0, void 0, void 0, function () {
124
+ var result;
125
+ return __generator(this, function (_a) {
126
+ switch (_a.label) {
127
+ case 0:
128
+ if (task === null) {
129
+ process.exit(0);
130
+ }
131
+ return [4 /*yield*/, processFile(task)];
132
+ case 1:
133
+ result = _a.sent();
134
+ if (result) {
135
+ worker_threads_1.parentPort === null || worker_threads_1.parentPort === void 0 ? void 0 : worker_threads_1.parentPort.postMessage(result);
136
+ }
137
+ return [2 /*return*/];
138
+ }
139
+ });
140
+ }); });
@@ -0,0 +1,8 @@
1
+ export { ByteStream } from './utils/ByteStream';
2
+ export { RwFile } from './renderware/RwFile';
3
+ export { RwSections } from './renderware/RwSections';
4
+ export * from './renderware/dff/DffParser';
5
+ export * from './renderware/txd/TxdParser';
6
+ export * from './renderware/ifp/IfpParser';
7
+ export * from './renderware/dff/DffModelType';
8
+ export * from './renderware/ifp/IfpData';
@@ -0,0 +1,28 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
+ };
16
+ Object.defineProperty(exports, "__esModule", { value: true });
17
+ exports.RwSections = exports.RwFile = exports.ByteStream = void 0;
18
+ var ByteStream_1 = require("./utils/ByteStream");
19
+ Object.defineProperty(exports, "ByteStream", { enumerable: true, get: function () { return ByteStream_1.ByteStream; } });
20
+ var RwFile_1 = require("./renderware/RwFile");
21
+ Object.defineProperty(exports, "RwFile", { enumerable: true, get: function () { return RwFile_1.RwFile; } });
22
+ var RwSections_1 = require("./renderware/RwSections");
23
+ Object.defineProperty(exports, "RwSections", { enumerable: true, get: function () { return RwSections_1.RwSections; } });
24
+ __exportStar(require("./renderware/dff/DffParser"), exports);
25
+ __exportStar(require("./renderware/txd/TxdParser"), exports);
26
+ __exportStar(require("./renderware/ifp/IfpParser"), exports);
27
+ __exportStar(require("./renderware/dff/DffModelType"), exports);
28
+ __exportStar(require("./renderware/ifp/IfpData"), exports);
@@ -0,0 +1,10 @@
1
+ import { ByteStream } from "../utils/ByteStream";
2
+ export interface RwSectionHeader {
3
+ sectionType: number;
4
+ sectionSize: number;
5
+ versionNumber: number;
6
+ }
7
+ export declare class RwFile extends ByteStream {
8
+ constructor(stream: Buffer);
9
+ readSectionHeader(): RwSectionHeader;
10
+ }
@@ -0,0 +1,33 @@
1
+ "use strict";
2
+ var __extends = (this && this.__extends) || (function () {
3
+ var extendStatics = function (d, b) {
4
+ extendStatics = Object.setPrototypeOf ||
5
+ ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
6
+ function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };
7
+ return extendStatics(d, b);
8
+ };
9
+ return function (d, b) {
10
+ if (typeof b !== "function" && b !== null)
11
+ throw new TypeError("Class extends value " + String(b) + " is not a constructor or null");
12
+ extendStatics(d, b);
13
+ function __() { this.constructor = d; }
14
+ d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
15
+ };
16
+ })();
17
+ Object.defineProperty(exports, "__esModule", { value: true });
18
+ exports.RwFile = void 0;
19
+ var ByteStream_1 = require("../utils/ByteStream");
20
+ var RwFile = /** @class */ (function (_super) {
21
+ __extends(RwFile, _super);
22
+ function RwFile(stream) {
23
+ return _super.call(this, stream) || this;
24
+ }
25
+ RwFile.prototype.readSectionHeader = function () {
26
+ var sectionType = this.readUint32();
27
+ var sectionSize = this.readUint32();
28
+ var versionNumber = this.readUint32();
29
+ return { sectionType: sectionType, sectionSize: sectionSize, versionNumber: versionNumber };
30
+ };
31
+ return RwFile;
32
+ }(ByteStream_1.ByteStream));
33
+ exports.RwFile = RwFile;
@@ -0,0 +1,20 @@
1
+ export declare enum RwSections {
2
+ RwStruct = 1,
3
+ RwString = 2,
4
+ RwExtension = 3,
5
+ RwTexture = 6,
6
+ RwMaterial = 7,
7
+ RwMaterialList = 8,
8
+ RwFrameList = 14,
9
+ RwGeometry = 15,
10
+ RwClump = 16,
11
+ RwAtomic = 20,
12
+ RwTextureNative = 21,
13
+ RwTextureDictionary = 22,
14
+ RwGeometryList = 26,
15
+ RwSkin = 278,
16
+ RwAnim = 286,
17
+ RwMaterialEffectsPLG = 288,
18
+ RwReflectionMaterial = 39056124,
19
+ RwNodeName = 39056126
20
+ }
@@ -0,0 +1,29 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.RwSections = void 0;
4
+ var RwSections;
5
+ (function (RwSections) {
6
+ // Core
7
+ RwSections[RwSections["RwStruct"] = 1] = "RwStruct";
8
+ RwSections[RwSections["RwString"] = 2] = "RwString";
9
+ RwSections[RwSections["RwExtension"] = 3] = "RwExtension";
10
+ RwSections[RwSections["RwTexture"] = 6] = "RwTexture";
11
+ RwSections[RwSections["RwMaterial"] = 7] = "RwMaterial";
12
+ RwSections[RwSections["RwMaterialList"] = 8] = "RwMaterialList";
13
+ RwSections[RwSections["RwFrameList"] = 14] = "RwFrameList";
14
+ RwSections[RwSections["RwGeometry"] = 15] = "RwGeometry";
15
+ RwSections[RwSections["RwClump"] = 16] = "RwClump";
16
+ RwSections[RwSections["RwAtomic"] = 20] = "RwAtomic";
17
+ RwSections[RwSections["RwTextureNative"] = 21] = "RwTextureNative";
18
+ RwSections[RwSections["RwTextureDictionary"] = 22] = "RwTextureDictionary";
19
+ RwSections[RwSections["RwGeometryList"] = 26] = "RwGeometryList";
20
+ RwSections[RwSections["RwSkin"] = 278] = "RwSkin";
21
+ RwSections[RwSections["RwAnim"] = 286] = "RwAnim";
22
+ // Toolkit
23
+ RwSections[RwSections["RwMaterialEffectsPLG"] = 288] = "RwMaterialEffectsPLG";
24
+ // R* specific RW plugins
25
+ RwSections[RwSections["RwReflectionMaterial"] = 39056124] = "RwReflectionMaterial";
26
+ // This was renamed to RwNodeName from RwFrame to prevent confusion.
27
+ // https://gtamods.com/wiki/Node_Name_(RW_Section)
28
+ RwSections[RwSections["RwNodeName"] = 39056126] = "RwNodeName";
29
+ })(RwSections || (exports.RwSections = RwSections = {}));
@@ -0,0 +1,50 @@
1
+ export interface RwVector2 {
2
+ x: number;
3
+ y: number;
4
+ }
5
+ export interface RwVector3 {
6
+ x: number;
7
+ y: number;
8
+ z: number;
9
+ }
10
+ export interface RwVector4 {
11
+ x: number;
12
+ y: number;
13
+ z: number;
14
+ t: number;
15
+ }
16
+ export interface RwQuaternion {
17
+ x: number;
18
+ y: number;
19
+ z: number;
20
+ w: number;
21
+ }
22
+ export interface RwMatrix3 {
23
+ right: RwVector3;
24
+ up: RwVector3;
25
+ at: RwVector3;
26
+ }
27
+ export interface RwMatrix4 {
28
+ right: RwVector4;
29
+ up: RwVector4;
30
+ at: RwVector4;
31
+ transform: RwVector4;
32
+ }
33
+ export interface RwColor {
34
+ r: number;
35
+ g: number;
36
+ b: number;
37
+ a: number;
38
+ }
39
+ export interface RwTextureCoordinate {
40
+ u: number;
41
+ v: number;
42
+ }
43
+ export interface RwTriangle {
44
+ vector: RwVector3;
45
+ materialId: number;
46
+ }
47
+ export interface RwSphere {
48
+ vector: RwVector3;
49
+ radius: number;
50
+ }
@@ -0,0 +1,2 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
@@ -0,0 +1,5 @@
1
+ export declare enum DffModelType {
2
+ GENERIC = 0,
3
+ SKIN = 1,
4
+ VEHICLE = 2
5
+ }
@@ -0,0 +1,9 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.DffModelType = void 0;
4
+ var DffModelType;
5
+ (function (DffModelType) {
6
+ DffModelType[DffModelType["GENERIC"] = 0] = "GENERIC";
7
+ DffModelType[DffModelType["SKIN"] = 1] = "SKIN";
8
+ DffModelType[DffModelType["VEHICLE"] = 2] = "VEHICLE";
9
+ })(DffModelType || (exports.DffModelType = DffModelType = {}));
@@ -0,0 +1,112 @@
1
+ import { RwFile } from '../RwFile';
2
+ import { DffModelType } from './DffModelType';
3
+ import { RwColor, RwMatrix3, RwMatrix4, RwSphere, RwTextureCoordinate, RwTriangle, RwVector3 } from '../common/types';
4
+ export interface RwDff {
5
+ modelType: DffModelType;
6
+ version: string;
7
+ versionNumber: number;
8
+ geometryList: RwGeometryList | null;
9
+ frameList: RwFrameList | null;
10
+ atomics: number[];
11
+ dummies: string[];
12
+ animNodes: RwAnimNode[];
13
+ }
14
+ export interface RwClump {
15
+ atomicCount: number;
16
+ lightCount?: number;
17
+ cameraCount?: number;
18
+ }
19
+ export interface RwAnimNode {
20
+ boneId: number;
21
+ bonesCount: number;
22
+ bones: RwBone[];
23
+ }
24
+ export interface RwBone {
25
+ boneId: number;
26
+ boneIndex: number;
27
+ flags: number;
28
+ }
29
+ export interface RwFrame {
30
+ rotationMatrix: RwMatrix3;
31
+ coordinatesOffset: RwVector3;
32
+ parentFrame: number;
33
+ }
34
+ export interface RwFrameList {
35
+ frameCount: number;
36
+ frames: RwFrame[];
37
+ }
38
+ export interface RwTexture {
39
+ textureFiltering: number;
40
+ uAddressing: number;
41
+ vAddressing: number;
42
+ usesMipLevels: boolean;
43
+ textureName: string;
44
+ }
45
+ export interface RwMaterial {
46
+ color: RwColor;
47
+ isTextured: boolean;
48
+ ambient?: number;
49
+ specular?: number;
50
+ diffuse?: number;
51
+ texture?: RwTexture;
52
+ }
53
+ export interface RwMaterialList {
54
+ materialInstanceCount: number;
55
+ materialData: RwMaterial[];
56
+ }
57
+ export interface RwGeometry {
58
+ vertexColorInformation: RwColor[];
59
+ textureCoordinatesCount: number;
60
+ textureMappingInformation: RwTextureCoordinate[][];
61
+ hasVertices: boolean;
62
+ hasNormals: boolean;
63
+ triangleInformation: RwTriangle[];
64
+ vertexInformation: RwVector3[];
65
+ normalInformation: RwVector3[];
66
+ boundingSphere?: RwSphere;
67
+ materialList: RwMaterialList;
68
+ binMesh: RwBinMesh;
69
+ skin?: RwSkin;
70
+ }
71
+ export interface RwGeometryList {
72
+ geometricObjectCount: number;
73
+ geometries: RwGeometry[];
74
+ }
75
+ export interface RwAtomic {
76
+ frameIndex: number;
77
+ geometryIndex: number;
78
+ flags: number;
79
+ }
80
+ export interface RwBinMesh {
81
+ meshCount: number;
82
+ meshes: RwMesh[];
83
+ }
84
+ export interface RwSkin {
85
+ boneCount: number;
86
+ usedBoneCount: number;
87
+ maxWeightsPerVertex: number;
88
+ boneVertexIndices: number[][];
89
+ vertexWeights: number[][];
90
+ inverseBoneMatrices: RwMatrix4[];
91
+ }
92
+ export interface RwMesh {
93
+ materialIndex: number;
94
+ indexCount: number;
95
+ indices: number[];
96
+ }
97
+ export declare class DffParser extends RwFile {
98
+ constructor(buffer: Buffer);
99
+ parse(): RwDff;
100
+ readClump(): RwClump;
101
+ readFrameList(): RwFrameList;
102
+ readGeometryList(): RwGeometryList;
103
+ readGeometry(versionNumber: number): RwGeometry;
104
+ readBinMesh(): RwBinMesh;
105
+ readSkin(vertexCount: number): RwSkin;
106
+ readAnimNode(): RwAnimNode;
107
+ readMesh(): RwMesh;
108
+ readMaterialList(): RwMaterialList;
109
+ readMaterial(): RwMaterial;
110
+ readTexture(): RwTexture;
111
+ readAtomic(): RwAtomic;
112
+ }