home *** CD-ROM | disk | FTP | other *** search
/ Qu-ake / Qu-ake.iso / qu_ke / utils / grafikto / 006 / MDL.C < prev    next >
Encoding:
C/C++ Source or Header  |  1996-08-19  |  5.7 KB  |  179 lines

  1. #include "mdl.h"
  2. #include "3ds.h"
  3.  
  4. word frame_info ( frame *frame_ptr, mdl_header *head ) {
  5. dword index;
  6.    
  7.    printf("name: %s\n",frame_ptr->name);
  8.    printf("min: x:%8.2f y:%8.2f z:%8.2f\n",
  9.       frame_ptr->min.x * head->scale.x + head->origin.x + head->eye_pos.x,
  10.       frame_ptr->min.y * head->scale.y + head->origin.y + head->eye_pos.y,
  11.       frame_ptr->min.z * head->scale.z + head->origin.z + head->eye_pos.z );
  12.    printf("min: x:%8.2f y:%8.2f z:%8.2f\n",
  13.       frame_ptr->max.x * head->scale.x + head->origin.x + head->eye_pos.x,
  14.       frame_ptr->max.y * head->scale.y + head->origin.y + head->eye_pos.y,
  15.       frame_ptr->max.z * head->scale.z + head->origin.z + head->eye_pos.z );
  16.    for ( index=0; index < head->vert_num; index++ ) {
  17.  
  18.    printf("vert %lu: x:%8.2f y:%8.2f z:%8.2f light: %u\n", index,
  19.       frame_ptr->vert_ptr[index].x * head->scale.x + head->origin.x + head->eye_pos.x,
  20.       frame_ptr->vert_ptr[index].y * head->scale.y + head->origin.y + head->eye_pos.y,
  21.       frame_ptr->vert_ptr[index].z * head->scale.z + head->origin.z + head->eye_pos.z,
  22.       frame_ptr->vert_ptr[index].normal );
  23.    }
  24.  
  25. return 0; }
  26.  
  27.  
  28.  
  29.  
  30.  
  31. word load_mdl ( byte *filename, mdl_object *obj ) {
  32. FILE *fp;
  33. dword c0; // general counter
  34.  
  35. fp = fopen ( filename, "rb" );
  36. if ( !fp ) {
  37.    printf("unable to open mdl \"%s\"\n",filename);
  38.    exit(1);
  39. }
  40. fread(&obj->head,sizeof(mdl_header),1,fp);
  41.  
  42. if ( obj->head.id != IDPO ) {
  43.    printf("this is not a quake .mdl\n");
  44.    exit(1);
  45. }
  46.  
  47. /*
  48. printf("id: %c%c%c%c\n",
  49.           ((byte *)&obj->head.id)[0],
  50.           ((byte *)&obj->head.id)[1],
  51.           ((byte *)&obj->head.id)[2],
  52.           ((byte *)&obj->head.id)[3] );
  53. printf("version: %lu\n",obj->head.version);
  54. printf("scale: x:%8.2f y:%8.2f z:%8.2f\n",
  55.                     obj->head.scale.x,obj->head.scale.y,obj->head.scale.z );
  56. printf("origin: x:%8.2f y:%8.2f z:%8.2f\n",
  57.                     obj->head.origin.x,obj->head.origin.y,obj->head.origin.z );
  58. printf("radius: %8.2f\n",obj->head.radius);
  59. printf("eye pos: %8.2f %8.2f %8.2f\n",
  60.                     obj->head.eye_pos.x,obj->head.eye_pos.y,obj->head.eye_pos.z );
  61. printf("number of skins: %lu\n",obj->head.skin_num );
  62. printf("skin width:  %lu\n",obj->head.skin_width );
  63. printf("skin height: %lu\n",obj->head.skin_height );
  64.  
  65. printf("number of verts: %lu\n",obj->head.vert_num );
  66. printf("number of triangles: %lu\n",obj->head.tri_num );
  67. printf("number of frames: %lu\n",obj->head.frame_num );
  68. printf("synctype: %lu\n",obj->head.sync_type);
  69. printf("flags: %lu\n",obj->head.flags);
  70. printf("size: %8.2f\n",obj->head.size);
  71. */
  72.  
  73. obj->rimg = ( raw_image * ) malloc ( obj->head.skin_num * sizeof(raw_image) );
  74.  if ( !obj->rimg ) {
  75.     printf("could not allocate skin ptrs\n");
  76.     exit(1);
  77.  }
  78.  
  79. for ( c0=0; c0< obj->head.skin_num; c0++ ) {
  80.   fread(&obj->rimg[c0].unknown,4,1,fp);
  81.  // printf("texture unknown: %lu\n",obj->rimg[c0].unknown);
  82.   obj->rimg[c0].width  = obj->head.skin_width;
  83.   obj->rimg[c0].height = obj->head.skin_height;
  84.   obj->rimg[c0].data = ( byte * ) malloc ( obj->rimg[c0].width*obj->rimg[c0].height );
  85.   if ( !obj->rimg[c0].data ) {
  86.        printf("could not allocate mem for skin %lu bitmap\n",c0);
  87.        exit(1);
  88.   } // end if
  89.   fread ( obj->rimg[c0].data, 1, obj->rimg[c0].width*obj->rimg[c0].height, fp );
  90. } // end c0
  91.  
  92. obj->tvert_ptr = ( tvert * ) malloc ( obj->head.vert_num * sizeof(tvert) );
  93. if ( !obj->tvert_ptr ) {
  94.    printf("could not allocate mem for texture verts\n");
  95.    exit(1);
  96. }
  97. fread( obj->tvert_ptr, sizeof(tvert), obj->head.vert_num, fp );
  98. /*
  99. for ( c0=0; c0< obj->head.vert_num; c0++ ) {
  100.   printf("tvert %lu: \n",c0);
  101.   printf("  onseam: %lu\n",obj->tvert_ptr[c0].onseam);
  102.   printf("  s: %lu \n",obj->tvert_ptr[c0].s);
  103.   printf("  t: %lu \n",obj->tvert_ptr[c0].t);
  104. } // end f0
  105. */
  106.  
  107. obj->tri_ptr = ( tri * ) malloc ( obj->head.tri_num * sizeof(tri) );
  108. if ( !obj->tri_ptr ) {
  109.    printf("unable to allocate triangle mem\n");
  110.    exit(1);
  111. }
  112.  
  113. fread( obj->tri_ptr, sizeof(tri), obj->head.tri_num, fp );
  114. /*
  115. for ( c0=0; c0< obj->head.tri_num; c0++ ) {
  116.   printf("triangle %lu:\n",c0);
  117.   printf("   front: %lu\n",obj->tri_ptr[c0].front);
  118.   printf("   verts: %lu %lu %lu\n",
  119.                      obj->tri_ptr[c0].vert[0],
  120.                      obj->tri_ptr[c0].vert[1],
  121.                      obj->tri_ptr[c0].vert[2] );
  122. } // end c0
  123. */
  124.  
  125. obj->frame_ptr = ( frame * ) malloc ( obj->head.frame_num*sizeof(frame) );
  126. if ( !obj->frame_ptr ) {
  127.    printf("could not allocate mem for frame pointers\n");
  128.    exit(1);
  129. }
  130.  
  131. c0 = 0;
  132. for ( c0=0; c0< obj->head.frame_num; c0++ ) {
  133.    fread(&obj->frame_ptr[c0].unknown,4,1,fp);
  134.    fread(&obj->frame_ptr[c0].min,sizeof(vert),1,fp);
  135.    fread(&obj->frame_ptr[c0].max,sizeof(vert),1,fp);
  136.    fread(&obj->frame_ptr[c0].name,1,16,fp);
  137.  
  138.    obj->frame_ptr[c0].vert_ptr = (vert *) malloc ( obj->head.vert_num * sizeof(vert));
  139.    if ( !obj->frame_ptr[c0].vert_ptr ) {
  140.       printf("unable to allocate vert mem for frame %lu\n",c0);
  141.       exit(1);
  142.    }
  143.    fread( obj->frame_ptr[c0].vert_ptr, sizeof(vert), obj->head.vert_num, fp );
  144.  
  145. } // end c0
  146.  
  147. fclose(fp);
  148. return 0; }
  149.  
  150.  
  151.  
  152.  
  153. word free_mdl ( mdl_object *obj ) {
  154. dword c0;
  155.   for ( c0=0; c0< obj->head.skin_num; c0++ )
  156.     free( obj->rimg[c0].data );
  157.   free(obj->tvert_ptr);
  158.   free(obj->tri_ptr);
  159.   for ( c0=0; c0< obj->head.frame_num; c0++ )
  160.     free ( obj->frame_ptr[c0].vert_ptr );
  161.   free(obj->frame_ptr);
  162. return 0; }
  163.  
  164.  
  165.  
  166.  
  167. word main ( word argc, byte **argv ) {
  168. mdl_object trimesh;
  169.  
  170. if ( argc < 3 ) {
  171.    printf("usage: mdl <mdlfile> <3dsfile> \n");
  172.    return 1;
  173. }
  174. load_mdl ( argv[1], &trimesh );
  175. //frame_info ( &trimesh.frame_ptr[0], &trimesh.head );
  176. write_3ds ( &trimesh, argv[2] );
  177. free_mdl ( &trimesh );
  178. return 0; }
  179.