Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- "use strict";
- const fs = require("fs");
- const util = require("util");
- const buffer = fs.readFileSync("ST0F00.BIN");
- var ofs = 0x30;
- var nb_models = buffer.readUInt32LE(ofs);
- console.log("Number of models: %d", nb_models);
- ofs = 0x34;
- var models = new Array();
- for(var i = 0; i < nb_models; i++) {
- var model = {
- "flag" : buffer.readUInt32LE(ofs + 0x00),
- "mesh" : buffer.readUInt32LE(ofs + 0x04),
- "bone" : buffer.readUInt32LE(ofs + 0x08),
- "anim" : buffer.readUInt32LE(ofs + 0x0c)
- };
- if(model.mesh) {
- model.mesh += 0x30;
- }
- if(model.bone) {
- model.mesh += 0x30;
- }
- if(model.anim) {
- model.mesh += 0x30;
- }
- ofs += 0x10;
- models.push(model);
- }
- console.log(models);
- for(var i = 0; i < 5; i++) {
- var index = i;
- read_model(models[index].mesh, index);
- }
- function read_model(mesh_ofs, index) {
- var dword = buffer.readUInt32LE(mesh_ofs);
- var header_ptr = buffer.readUInt32LE(mesh_ofs + 4) + 0x30;
- console.log("Index: %d, %s", index, dword.toString(16));
- console.log("Header Pointer: %s", header_ptr.toString(16));
- var header = {
- "nb_tri" : buffer.readUInt8(header_ptr + 0x00),
- "nb_quad" : buffer.readUInt8(header_ptr + 0x01),
- "nb_vert" : buffer.readUInt8(header_ptr + 0x02),
- "tri_ofs" : buffer.readUInt32LE(header_ptr + 0x04) + 0x30,
- "quad_ofs" : buffer.readUInt32LE(header_ptr + 0x08) + 0x30,
- "vert_ofs" : buffer.readUInt32LE(header_ptr + 0x0c) + 0x30
- };
- var vertices = [];
- var faces = [];
- var mask = 0b1111111;
- var ofs = header.tri_ofs;
- for(var i = 0; i < header.nb_tri; i++) {
- var dword = buffer.readUInt32LE(ofs + 8);
- var a = dword & mask;
- var b = (dword >> 7) & mask;
- var c = (dword >> 14) & mask;
- ofs += 0x0c;
- faces.push({
- "a" : a,
- "b" : b,
- "c" : c
- });
- }
- var ofs = header.quad_ofs;
- for(var i = 0; i < header.nb_quad; i++) {
- var dword = buffer.readUInt32LE(ofs + 8);
- var a = dword & mask;
- var b = (dword >> 7) & mask;
- var c = (dword >> 14) & mask;
- var d = (dword >> 21) & mask;
- ofs += 0x0c;
- faces.push({
- "a" : a,
- "b" : b,
- "c" : c
- });
- faces.push({
- "a" : b,
- "b" : d,
- "c" : c
- });
- }
- mask = 0b1111111111;
- var msb = 0b1000000000;
- var lsb = 0b0111111111;
- var ofs = header.vert_ofs;
- for(var i = 0; i < header.nb_vert; i++) {
- var dword = buffer.readUInt32LE(ofs);
- ofs += 4;
- var x = dword & mask;
- var y = (dword >> 10) & mask;
- var z = (dword >> 20) & mask;
- if(x & msb) {
- x = (msb - (x & lsb)) * -1;
- }
- if(y & msb) {
- y = (msb - (y & lsb)) * -1;
- }
- if(z & msb) {
- z = (msb - (z & lsb)) * -1;
- }
- vertices.push({
- "x" : x,
- "y" : y,
- "z" : z
- });
- }
- var out = "";
- vertices.forEach(function(v) {
- out += util.format("v %s %s %s\n", v.x.toFixed(2), v.y.toFixed(2), v.z.toFixed(2));
- });
- faces.forEach(function(f) {
- out += util.format("f %d %d %d\n", f.a+1, f.b+1, f.c+1);
- });
- fs.writeFileSync("mesh_" + index + ".obj", out);
- console.log(vertices);
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement