Advertisement
Guest User

Untitled

a guest
Apr 7th, 2018
135
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.02 KB | None | 0 0
  1. "use strict";
  2.  
  3. const fs = require("fs");
  4. const util = require("util");
  5. const buffer = fs.readFileSync("ST0F00.BIN");
  6.  
  7. var ofs = 0x30;
  8. var nb_models = buffer.readUInt32LE(ofs);
  9. console.log("Number of models: %d", nb_models);
  10.  
  11. ofs = 0x34;
  12. var models = new Array();
  13. for(var i = 0; i < nb_models; i++) {
  14.  
  15. var model = {
  16. "flag" : buffer.readUInt32LE(ofs + 0x00),
  17. "mesh" : buffer.readUInt32LE(ofs + 0x04),
  18. "bone" : buffer.readUInt32LE(ofs + 0x08),
  19. "anim" : buffer.readUInt32LE(ofs + 0x0c)
  20. };
  21.  
  22. if(model.mesh) {
  23. model.mesh += 0x30;
  24. }
  25.  
  26. if(model.bone) {
  27. model.mesh += 0x30;
  28. }
  29.  
  30. if(model.anim) {
  31. model.mesh += 0x30;
  32. }
  33.  
  34. ofs += 0x10;
  35. models.push(model);
  36.  
  37. }
  38.  
  39. console.log(models);
  40.  
  41. for(var i = 0; i < 5; i++) {
  42. var index = i;
  43. read_model(models[index].mesh, index);
  44. }
  45.  
  46. function read_model(mesh_ofs, index) {
  47.  
  48. var dword = buffer.readUInt32LE(mesh_ofs);
  49. var header_ptr = buffer.readUInt32LE(mesh_ofs + 4) + 0x30;
  50.  
  51. console.log("Index: %d, %s", index, dword.toString(16));
  52. console.log("Header Pointer: %s", header_ptr.toString(16));
  53.  
  54. var header = {
  55. "nb_tri" : buffer.readUInt8(header_ptr + 0x00),
  56. "nb_quad" : buffer.readUInt8(header_ptr + 0x01),
  57. "nb_vert" : buffer.readUInt8(header_ptr + 0x02),
  58. "tri_ofs" : buffer.readUInt32LE(header_ptr + 0x04) + 0x30,
  59. "quad_ofs" : buffer.readUInt32LE(header_ptr + 0x08) + 0x30,
  60. "vert_ofs" : buffer.readUInt32LE(header_ptr + 0x0c) + 0x30
  61. };
  62.  
  63. var vertices = [];
  64. var faces = [];
  65.  
  66. var mask = 0b1111111;
  67.  
  68. var ofs = header.tri_ofs;
  69. for(var i = 0; i < header.nb_tri; i++) {
  70. var dword = buffer.readUInt32LE(ofs + 8);
  71. var a = dword & mask;
  72. var b = (dword >> 7) & mask;
  73. var c = (dword >> 14) & mask;
  74. ofs += 0x0c;
  75. faces.push({
  76. "a" : a,
  77. "b" : b,
  78. "c" : c
  79. });
  80. }
  81.  
  82. var ofs = header.quad_ofs;
  83. for(var i = 0; i < header.nb_quad; i++) {
  84. var dword = buffer.readUInt32LE(ofs + 8);
  85. var a = dword & mask;
  86. var b = (dword >> 7) & mask;
  87. var c = (dword >> 14) & mask;
  88. var d = (dword >> 21) & mask;
  89. ofs += 0x0c;
  90.  
  91. faces.push({
  92. "a" : a,
  93. "b" : b,
  94. "c" : c
  95. });
  96.  
  97. faces.push({
  98. "a" : b,
  99. "b" : d,
  100. "c" : c
  101. });
  102.  
  103. }
  104.  
  105. mask = 0b1111111111;
  106. var msb = 0b1000000000;
  107. var lsb = 0b0111111111;
  108. var ofs = header.vert_ofs;
  109.  
  110. for(var i = 0; i < header.nb_vert; i++) {
  111.  
  112. var dword = buffer.readUInt32LE(ofs);
  113. ofs += 4;
  114.  
  115. var x = dword & mask;
  116. var y = (dword >> 10) & mask;
  117. var z = (dword >> 20) & mask;
  118.  
  119. if(x & msb) {
  120. x = (msb - (x & lsb)) * -1;
  121. }
  122.  
  123. if(y & msb) {
  124. y = (msb - (y & lsb)) * -1;
  125. }
  126.  
  127. if(z & msb) {
  128. z = (msb - (z & lsb)) * -1;
  129. }
  130.  
  131. vertices.push({
  132. "x" : x,
  133. "y" : y,
  134. "z" : z
  135. });
  136.  
  137. }
  138.  
  139. var out = "";
  140. vertices.forEach(function(v) {
  141. out += util.format("v %s %s %s\n", v.x.toFixed(2), v.y.toFixed(2), v.z.toFixed(2));
  142. });
  143.  
  144. faces.forEach(function(f) {
  145. out += util.format("f %d %d %d\n", f.a+1, f.b+1, f.c+1);
  146. });
  147.  
  148. fs.writeFileSync("mesh_" + index + ".obj", out);
  149.  
  150. console.log(vertices);
  151. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement