Author Topic: Heres a relatively stupid question:  (Read 9978 times)

Darkness

  • *
  • Posts: 2181
    • View Profile
    • http://www.x0r.net
Heres a relatively stupid question:
« on: 2002-09-03 03:44:21 »
Once again, im interested in writing a program to convert a file format. Heres the question. How do I read from hex/binary in C?

mirex

  • *
  • Posts: 1645
    • View Profile
    • http://mirex.mypage.sk
Heres a relatively stupid question:
« Reply #1 on: 2002-09-03 11:50:51 »
Hmm i think it was discussed before but anyhow, here is some basic code to read few data from file:

Code: [Select]
#include <stdio.h>                     //library with file utils

void main( void )                      //program starts here
{
  FILE *f;                             //file handle
  long l;                              // vv  i define few variables here  vv
  float f;
  char ch;
  char name[20];

  f = fopen( "file.dat", "rb" );       //rb = open file for reading in binary mode
  if ( f == NULL )                     //if could not open => exit
    return;

  fread( &l, 4, 1, f );                //lets read one long from file. it is 4 bytes long
  fread( name, 1, 20, f );             //now string 20 bytes long
  fread( &f, sizeof( float ), 1, f );  //and float which is 4 bytes long
  fread( &ch, 1, 1, f );               //and char is 1 byte long

  fclose( f );                         //close file
}


But before doing something like file converter, you should play around with c trying it ...
Hmm, and btw what file format do you want to convert ?

Darkness

  • *
  • Posts: 2181
    • View Profile
    • http://www.x0r.net
Heres a relatively stupid question:
« Reply #2 on: 2002-09-03 20:57:02 »
warcraft 3 unit animation files. thanks, mirex. this will also help me learn the stdio header. i am currently only familiar with ones such as fstream/iostream.

Sephiroth 3D

  • *
  • Posts: 1679
    • View Profile
    • ModCitizen 42
Heres a relatively stupid question:
« Reply #3 on: 2002-09-03 23:30:45 »
Gehh! *Points to the edit button.* USE IT!

Sephiroth 3D

"Macintoshs are to Computers as Spam is to Food." - Greg Higgins

Sephiroth 3D.com
[email protected]

Darkness

  • *
  • Posts: 2181
    • View Profile
    • http://www.x0r.net
Heres a relatively stupid question:
« Reply #4 on: 2002-09-03 23:40:03 »
yet ANOTHER edit:

Code: [Select]
void main()                      //program starts here
{
  FILE *fr;//file handle
  FILE *fw;
  unsigned long l, interval_1, interval_2, end, numverts, startpoint;                              // vv  i define few variables here  vv
  char ch;
  char name[80];
  char vrtx[4];
  float x, y, z;
  startpoint = 0;
  fr = fopen( "File.mdx", "rb" );       //rb = open file for reading in binary mode
  fw = fopen( "File2.obj", "w" ); //w = write?
  if ( fr == NULL )                     //if could not open => exit
    return;
  fseek( fr, 0L, SEEK_END);
  end = ftell (fr);
  do {
  for (; startpoint < end; startpoint++) {
fseek( fr, startpoint, SEEK_SET);

fread( &vrtx, 1, 4, fr );
if((vrtx[0] == 'V') && (vrtx[1] == 'R') && (vrtx[2] == 'T') && (vrtx[3] == 'X')) {
 startpoint++;
break;
if(startpoint > end) {
goto a;
}
  }
  }
  fread( &numverts, 4, 1, fr );
  for (int counter = 0; counter < numverts; counter++) {
  fread( &x, 4, 1, fr );
  fread( &y, 4, 1, fr );
  fread( &z, 4, 1, fr );
 
  fprintf( fw, "v %f %f %f\n", x, y, z);
  }
  } while (ftell(fr) < end);
 
a:
 
fclose( fw );
  fclose( fr );                         //close file



there has to be something wrong with one of the loops..... it produces about 10 k or so too many verteces.

Darkness

  • *
  • Posts: 2181
    • View Profile
    • http://www.x0r.net
Heres a relatively stupid question:
« Reply #5 on: 2002-09-04 03:42:29 »
ok... maybe a bit less then 10k.... but it repeats the last vert several times:

v 87.254501 -0.272330 5.281180
v 78.815498 -6.367190 11.685000
v 79.081001 0.845960 6.541410
v 73.868202 -0.900610 4.069060
v 73.868202 -0.900610 4.069060
v 73.868202 -0.900610 4.069060
v 73.868202 -0.900610 4.069060
v 73.868202 -0.900610 4.069060
v 73.868202 -0.900610 4.069060
v 73.868202 -0.900610 4.069060
v 73.868202 -0.900610 4.069060
v 73.868202 -0.900610 4.069060
v 73.868202 -0.900610 4.069060
v 73.868202 -0.900610 4.069060
v 73.868202 -0.900610 4.069060
v 73.868202 -0.900610 4.069060
v 73.868202 -0.900610 4.069060
v 73.868202 -0.900610 4.069060
v 73.868202 -0.900610 4.069060
v 73.868202 -0.900610 4.069060
v 73.868202 -0.900610 4.069060
v 73.868202 -0.900610 4.069060
v 73.868202 -0.900610 4.069060
v 73.868202 -0.900610 4.069060
v 73.868202 -0.900610 4.069060
v 73.868202 -0.900610 4.069060
v 73.868202 -0.900610 4.069060
v 73.868202 -0.900610 4.069060
v 73.868202 -0.900610 4.069060
v 73.868202 -0.900610 4.069060
v 73.868202 -0.900610 4.069060
v 73.868202 -0.900610 4.069060
v 73.868202 -0.900610 4.069060
v 73.868202 -0.900610 4.069060
v 73.868202 -0.900610 4.069060
v 73.868202 -0.900610 4.069060
v 73.868202 -0.900610 4.069060
v 73.868202 -0.900610 4.069060
v 73.868202 -0.900610 4.069060
v 73.868202 -0.900610 4.069060
v 73.868202 -0.900610 4.069060
v 73.868202 -0.900610 4.069060
v 73.868202 -0.900610 4.069060
v 73.868202 -0.900610 4.069060
v 73.868202 -0.900610 4.069060
v 73.868202 -0.900610 4.069060
v 73.868202 -0.900610 4.069060
v 73.868202 -0.900610 4.069060
v 73.868202 -0.900610 4.069060

EDIT: The last set of Vertices has 45. there are 46 repeated verticies. 1 at the end of the last set, and 45 of the fake set.

mirex

  • *
  • Posts: 1645
    • View Profile
    • http://mirex.mypage.sk
Heres a relatively stupid question:
« Reply #6 on: 2002-09-04 11:46:20 »
What a coincidence! Im working on war3 format too. I saw a request here, I think it was from you darkness, but i could not find that topic.

I've included it into my Conv. At present i can read geometry, objects & texture coords. Also i can read War 3 *.blp textures, both uncompressed & compressed. Right now im working on texturing & materials.

I'll try to upload Conv with these changes ASAP. Probably tomorow.

So lets look at the code:

Code: [Select]
;
  fr = fopen( "File.mdx", "rb" );      

  // >!< we should move check directly after trying-to-open
  if ( fr == NULL )                     //if could not open => exit
    return;

  // >!< "w" should work too, but "wt" means write in text mode
  fw = fopen( "File2.obj", "wt" ); //w = write?

  fseek( fr, 0L, SEEK_END);
  end = ftell (fr);
  do {

  // >!< for loops are usually done like this
  for ( startpoint = 0; startpoint < end; startpoint++) {
   fseek( fr, startpoint, SEEK_SET);
   
   fread( &vrtx, 1, 4, fr );

   // >!< easier compare
   if ( memcmp( vrtx, "VRTX", 4 ) == 0 ) {
     break;
     / >!< not sure, but i think that this won't execute, because of break
     if(startpoint > end) {
      goto a;
     }
    }
  }

  fread( &numverts, 4, 1, fr );
  for (int counter = 0; counter < numverts; counter++) {
   fread( &x, 4, 1, fr );
   fread( &y, 4, 1, fr );
   fread( &z, 4, 1, fr );
   
   fprintf( fw, "v %f %f %f\n", x, y, z);
  }
 } while (ftell(fr) < end);

a:
 
fclose( fw );
  fclose( fr );                         //close file


Btw, what tool do you use to unpack MPQ's ? I have a few but all of them crash often, of can't unpack compressed files.
-edit-
Here is beta of Conv, it is good only for previewing... and sample

atzn

  • *
  • Posts: 548
    • View Profile
Heres a relatively stupid question:
« Reply #7 on: 2002-09-04 16:13:19 »
Hey good job Mirex.. I used your program to convert my War3 screenies (TGA format) to BMP and it worked... exact resolution as well (crappy Apple Viewer doesn't convert correctly)... But the screenshot became inverted after I convert them. (Easily fixed by using MS Paint  :) )

Anyway, no more further comments. I'm not really into 3D modelling and stuff yet... so I can't really give too much feedback. The only 'feedback' I can give is that everytime I convert the War3 screenies they end up inverted.... nothing big deal considering that your program is only a Beta version one........

Darkness

  • *
  • Posts: 2181
    • View Profile
    • http://www.x0r.net
Heres a relatively stupid question:
« Reply #8 on: 2002-09-04 16:37:32 »
i use MPQ View for extraction, and MPQ2k to add files.

also: have you looked at the animations? i dont quite understand them. They dont seem to refer to any bones.

mirex

  • *
  • Posts: 1645
    • View Profile
    • http://mirex.mypage.sk
Heres a relatively stupid question:
« Reply #9 on: 2002-09-04 17:40:39 »
FFTactic_Boy: could you please send me an example files (input and output) that do that ? they should not .... And also an program version number please ... i'll try to fix it asap.

Darkness: anims ... i will work on that later. I've seen some BONE chunk inthere, but understanding it will be hard. First i would like to do that texturing.

Darkness

  • *
  • Posts: 2181
    • View Profile
    • http://www.x0r.net
Heres a relatively stupid question:
« Reply #10 on: 2002-09-04 20:58:42 »
Quote
for ( startpoint = 0; startpoint < end; startpoint++) {
   fseek( fr, startpoint, SEEK_SET);


unfortunately, i cant do this. this part of the code is intended to begin searching after that set of vertecies.

atzn

  • *
  • Posts: 548
    • View Profile
Heres a relatively stupid question:
« Reply #11 on: 2002-09-04 21:12:41 »
Quote from: mirex
FFTactic_Boy: could you please send me an example files (input and output) that do that ? they should not .... And also an program version number please ... i'll try to fix it asap.


Program v0.821
Input File: Targa file (*.tga), <if you capture screenshots in Warcraft3 (i.e. Print Screen while in game) the file generated will be in that Targe format>
Output File: Bitmap file (*.bmp)

Darkness

  • *
  • Posts: 2181
    • View Profile
    • http://www.x0r.net
Heres a relatively stupid question:
« Reply #12 on: 2002-09-05 03:26:42 »
ok.... it makes a model now :)

Code: [Select]
#include <stdio.h>                     //library with file utils
#include <iostream.h>
#include <string.h>
void main()                      //program starts here
{
  FILE *fr;//file handle
  FILE *fw;
  unsigned long end, numverts, startpoint, currentpos, numnorm, numtvert, numtri;              
  unsigned short a, b, c;
  char vrtx[4], norm[4], tvert[4], face[4];
  char inname[20];
  char outname[20];
  cout << "Enter MDX Filename: ";
  cin.get(inname, 20);
  cin.ignore(80,'\n');
  cout << "Enter OBJ Filename: ";
  cin.get(outname, 20);
  cin.ignore(80,'\n');
  float x, y, z;
  startpoint = 0;
  currentpos = 0;
  fr = fopen( inname, "rb" );       //rb = open file for reading in binary mode
  if ( fr == NULL )                     //if could not open => exit
    return;
  fw = fopen( outname, "wt" ); //w = write text mode

  fseek( fr, 0L, SEEK_END);
  end = ftell (fr);
  while (startpoint < end) {
  for (; startpoint < end; startpoint++) {
fseek( fr, startpoint, SEEK_SET);

fread( &vrtx, 1, 4, fr );
if(memcmp( vrtx, "VRTX", 4 ) == 0) {
cout << "Geoset Found!\n";
break;
}
if(ftell( fr) >= end) {
return;
}

  }
  fread( &numverts, 4, 1, fr );
  cout << "Vertices: " << numverts << endl;
  for (int counter = 0; counter < numverts; counter++) {
  fread( &x, 4, 1, fr );
  fread( &y, 4, 1, fr );
  fread( &z, 4, 1, fr );
  fprintf( fw, "v %f %f %f\n", x, y, z);

  }
  fseek( fr, 4L, SEEK_CUR);
  fread( &numnorm, 4, 1, fr );
  cout << "Normals: " << numnorm << endl;
  for (counter = 0; counter < numnorm; counter++) {
  fread( &x, 4, 1, fr );
  fread( &y, 4, 1, fr );
  fread( &z, 4, 1, fr );
  fprintf( fw, "vn %f %f %f\n", x, y, z);
  }

    //faces
  for (startpoint = ftell(fr); startpoint < end; startpoint++) {
fseek( fr, startpoint, SEEK_SET);
fread( &face, 1, 4, fr );
if(memcmp( face, "PVTX", 4 ) == 0) {
fread( &numtri, 4, 1, fr );
cout << "Faces: " << numtri << endl;
cout << ftell(fr) << endl;
for (counter = 0; counter < (numtri / 3); counter++) {
fread( &a, 2, 1, fr );
a++;
fread( &b, 2, 1, fr );
b++;
fread( &c, 2, 1, fr );
c++;
fprintf( fw, "f %i/%i/%i %i/%i/%i %i/%i/%i\n", a, a, a, b, b, b, c, c, c);
}
break;
}
  }
  //end faces

    //tvert
  for (startpoint = ftell(fr); startpoint < end; startpoint++) {
fseek( fr, startpoint, SEEK_SET);
fread( &tvert, 1, 4, fr );
if(memcmp( tvert, "UVBS", 4 ) == 0) {
fread( &numtvert, 4, 1, fr );
cout << "TVerts: " << numtvert << endl;
cout << ftell(fr) << endl;
for (counter = 0; counter < numtvert; counter++) {
fread( &x, 4, 1, fr );
fread( &y, 4, 1, fr );
fprintf( fw, "vt %f %f\n", x, y);
}
break;
}
  }
  //end tvert

  startpoint++;
  }







fclose( fw );
  fclose( fr );                         //close file
}


the models overall look normal, but some things are off. for example, you can only see shadris' cape from the front, and none of the flat spell-ish planes appear. i know the code is sloppy, but do you have any ideas?

mirex

  • *
  • Posts: 1645
    • View Profile
    • http://mirex.mypage.sk
Heres a relatively stupid question:
« Reply #13 on: 2002-09-05 11:15:10 »
Yes. There are more objects in file. Hint: try searching for another VRTX.

Darkness

  • *
  • Posts: 2181
    • View Profile
    • http://www.x0r.net
Heres a relatively stupid question:
« Reply #14 on: 2002-09-05 20:56:40 »
all of those are in a giant "while" loop. anyway, i think all of the vertices are there.... but the faces are somehow wrong.

Darkness

  • *
  • Posts: 2181
    • View Profile
    • http://www.x0r.net
Heres a relatively stupid question:
« Reply #15 on: 2002-09-05 21:48:34 »
alright. i got it ^^

Goku7

  • *
  • Posts: 1301
    • View Profile
Heres a relatively stupid question:
« Reply #16 on: 2002-09-06 01:39:12 »
Hey, isn't there supposed to be some 3D models of SC units hidden somewhere in WC3?  Or was that just screenshots that are hidden in there?

Anyway, if the case is the former, you oughta see if you can get those.  They might be of use to modding comminties out there for FPS games.

mirex

  • *
  • Posts: 1645
    • View Profile
    • http://mirex.mypage.sk
Heres a relatively stupid question:
« Reply #17 on: 2002-09-06 11:13:29 »
Yes there are a few. I know there is a Hydralisk, Marine & Zergling there. But zergling looks pretty strange. I'll try to get some screenshots
--edit--
So here is that zergling(15kb).
And here is another beta conw which can save too. It can view w3 model with textures, but textures have to be in same dir as model. And it is no good, textures arent shown as should. All objects are mapped with 1st texture in the list. Its a beta you know. :)

FFTactic_Boy:
Oh and it has that TGA loading fixed too (i think). But for TGA conversion i would recommend other programs, for example PaintShopPro.

atzn

  • *
  • Posts: 548
    • View Profile
Heres a relatively stupid question:
« Reply #18 on: 2002-09-06 16:18:03 »
Yep it worked properly now  :D

I don't have Paint Shop Pro... I have this silly Apple Viewer, which didn't really convert the screenshots properly. At least your small program does.  :) Thanks.

Darkness

  • *
  • Posts: 2181
    • View Profile
    • http://www.x0r.net
Heres a relatively stupid question:
« Reply #19 on: 2002-09-06 20:47:32 »
the zergling has always looked like a modified felhound to me.

and theres a chaotic space orc (name is obviosly from wh 40k)

Goku7

  • *
  • Posts: 1301
    • View Profile
Heres a relatively stupid question:
« Reply #20 on: 2002-09-06 22:47:51 »
Heh....this reminds me of what Artanus says when you select him too many times in a row:

"This is not warcraft in Space!!!"

Darkness

  • *
  • Posts: 2181
    • View Profile
    • http://www.x0r.net
Heres a relatively stupid question:
« Reply #21 on: 2002-09-07 02:40:57 »
mirex-> you can find my program at www.infoceptor.com in the War3 files section. I go by the name of darky there.

next: bones

Darkness

  • *
  • Posts: 2181
    • View Profile
    • http://www.x0r.net
Heres a relatively stupid question:
« Reply #22 on: 2002-09-08 15:23:14 »
Taken From Frostmourne Pedistal MDL
Code: [Select]
Bone "Mesh18" {
ObjectId 9,
Parent 13, // "StandDummy"
BillboardedLockZ,
GeosetId 1,
GeosetAnimId 0,
Scaling 3 {
Bezier,
GlobalSeqId 1,
0: { 1, 1, 1 },
InTan { 0, 0, 0 },
OutTan { 1.1574, 1.1574, 1.1574 },
533: { 0.909091, 0.909091, 0.909091 },
InTan { 0.909091, 0.909091, 0.909091 },
OutTan { 0.909091, 0.909091, 0.909091 },
1067: { 1, 1, 1 },
InTan { 1.1574, 1.1574, 1.1574 },
OutTan { 0, 0, 0 },
}
}
I understand the parent an stuff, but why does a bone need to be so complex. shouldn't it just have x, y , and z values relative to the parent?

mirex

  • *
  • Posts: 1645
    • View Profile
    • http://mirex.mypage.sk
Heres a relatively stupid question:
« Reply #23 on: 2002-09-09 11:25:31 »
Darkness: I've tried your program and it works just fine. And I think that I should send them my proggie as well.

I have no idea about bones, havent looked at them so far, sorry...