Make MD2_2_NEA build

Also, rename to md2_to_nea.
This commit is contained in:
Antonio Niño Díaz 2019-05-30 18:22:33 +01:00
parent dfb8537589
commit f76185bbd1
8 changed files with 123 additions and 77 deletions

2
Tools/Windows/md2_to_nea/.gitignore vendored Normal file
View File

@ -0,0 +1,2 @@
*.o
md2_2_nea

View File

@ -0,0 +1,28 @@
# SPDX-License-Identifier: GPL-3.0-or-later
#
# Copyright (c) 2008-2011, 2019, Antonio Niño Díaz
# Variables
VERSION_STRING := `git describe --tags --dirty --always 2>/dev/null`
CFLAGS := -g -Wall -DBUILD_VERSION_STRING=\"$(VERSION_STRING)\"
RM := rm -rf
# Rules to build the binary
all: md2_2_nea
md2_2_nea_obj := md2_2_nea.o dynamic_list.o framemaker.o
md2_2_nea: $(md2_2_nea_obj)
$(CC) $(CFLAGS) -o $@ $(md2_2_nea_obj)
# Rules to process files
.c.o:
$(CC) $(CFLAGS) -c -o $@ $<
# Target used to remove all files generated by other Makefile targets
clean:
$(RM) md2_2_nea md2_2_nea.exe $(md2_2_nea_obj)

View File

@ -1,5 +1,9 @@
// SPDX-License-Identifier: GPL-3.0-or-later
//
// Copyright (c) 2008-2011, 2019, Antonio Niño Díaz
#include <stdlib.h>
#include <malloc.h>
#include "dynamic_list.h"
void DynamicListNew(DinamicList ** list)

View File

@ -1,3 +1,6 @@
// SPDX-License-Identifier: GPL-3.0-or-later
//
// Copyright (c) 2008-2011, 2019, Antonio Niño Díaz
#ifndef _DYNAMICLIST_H_
#define _DYNAMICLIST_H_

View File

@ -1,7 +1,12 @@
// SPDX-License-Identifier: GPL-3.0-or-later
//
// Copyright (c) 2008-2011, 2019, Antonio Niño Díaz
#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
#include "framemaker.h"
#include "dynamic_list.h"
#include "framemaker.h"
DinamicList *vertices_list;
DinamicList *normal_list;
@ -9,11 +14,11 @@ DinamicList *texcoords_list;
unsigned int FrameSize[1024];
unsigned short *FramePointer[1024];
int framecount = -1; // -----.
// |
void NewFrame(void) // |
{ // |
framecount++; // <------------' For first frame
int framecount = -1; // ------.
// |
void NewFrame(void) // |
{ // |
framecount++; // <----' For first frame
FramePointer[framecount] = (unsigned short *)malloc(DEFAULT_FRAME_SIZE);
if (FramePointer[framecount] == NULL) {

View File

@ -1,8 +1,11 @@
// SPDX-License-Identifier: GPL-3.0-or-later
//
// Copyright (c) 2008-2011, 2019, Antonio Niño Díaz
#ifndef _FRAMEMAKER_H_
#define _FRAMEMAKER_H_
#ifndef FRAMEMAKER_H__
#define FRAMEMAKER_H__
#define DEFAULT_FRAME_SIZE (512*1024)
#define DEFAULT_FRAME_SIZE (512 * 1024)
void NewFrame(void);
void NewFrameData(unsigned short data);
@ -27,4 +30,4 @@ void GetNormal(int index, unsigned short *x, unsigned short *y,
unsigned short *z);
void GetTexCoord(int index, unsigned short *u, unsigned short *v);
#endif
#endif // FRAMEMAKER_H__

View File

@ -1,19 +1,19 @@
// MD2_2_NEA.cpp : Defines the entry point for the console application.
// SPDX-License-Identifier: GPL-3.0-or-later
//
// Copyright (c) 2008-2011, 2019, Antonio Niño Díaz
//I used the information in this web to make the converter:
//http://tfc.duke.free.fr/coding/md2-specs-en.html
//Thanks.
// I used the information in this web to make the converter:
// http://tfc.duke.free.fr/coding/md2-specs-en.html
#include <string.h>
#include <stdlib.h>
#include <stdint.h>
#include <stdio.h>
#include <malloc.h>
#include <stdlib.h>
#include <string.h>
#include "framemaker.h"
#include "dynamic_list.h"
#include "framemaker.h"
#define MAX_PATHLEN 1024
#define MAX_PATHLEN 1024
typedef signed int s32;
typedef unsigned int u32;
@ -22,17 +22,17 @@ typedef unsigned short u16;
typedef signed char s8;
typedef unsigned char u8;
inline s32 floattof32(float n)
static inline s32 floattof32(float n)
{
return (s32) (n * (1 << 12));
}
inline s16 floattov16(float n)
static inline s16 floattov16(float n)
{
return (s16) (n * (1 << 12));
}
inline s16 floattov10(float n)
static inline s16 floattov10(float n)
{
if (n > 0.998)
return 0x7FFF;
@ -130,52 +130,64 @@ typedef s16 ds_st_t[2];
void PrintUse(void)
{
printf("\n\nInstructions:\n\n");
printf(" MD2_2_NEA [input.md2] [output.nea] ([float scale])\n");
printf("\n\n");
printf("Instructions:\n");
printf(" md2_2_nea [input.md2] [output.nea] ([float scale])\n");
printf
(" ([float translate x] [float translate x] [float translate x])\n\n");
}
int IsValidSize(int size)
{
return (size == 8 || size == 16 || size == 32 || size == 64 ||
size == 128 || size == 256 || size == 512 || size == 1024);
}
int main(int argc, char *argv[])
{
printf("\n\n ########################################\n");
printf(" #/ \\#\n");
printf(" # -- -- MD2 2 NEA -- -- #\n");
printf(" #\\ V2.0 /#\n");
printf("\n\n");
printf(" ########################################\n");
printf(" # #\n");
printf(" # -- -- MD2 2 NEA -- -- #\n");
printf(" # v2.0 #\n");
printf(" ########################################\n");
printf("\n");
printf("Copyright (c) 2008-2011, 2019 Antonio Nino Diaz\n");
printf("All rights reserved.\n\n");
printf
("\nCopyright (C) 2008 Antonio Ni%co D%caz\nAll rights reserved.\n\n",
164, 161);
printf(" -- -- -- -- -- -- -- -- -- --\n");
float general_scale = 1; //DEFAULT VALUES
// DEFAULT VALUES
float general_scale = 1;
float general_trans[3] = { 0, 0, 0 };
switch (argc) {
case 0:
case 1:
case 2: //Not enough
case 2:
// Not enough
PrintUse();
return -1;
case 3: //Use default modifications
case 3:
// Use default modifications
break;
case 4: //Use default translation and custom scale
case 4:
// Use default translation and custom scale
general_scale = atof(argv[3]);
break;
case 5:
case 6: //Custom translation, not enough
case 6:
// Custom translation, not enough
printf("You must set 3 coordinates for translation, not less.");
PrintUse();
return -1;
case 7: //Custom translation + scale
case 7:
// Custom translation + scale
general_scale = atof(argv[3]);
general_trans[0] = atof(argv[4]);
general_trans[1] = atof(argv[5]);
general_trans[2] = atof(argv[6]);
break;
default: //The rest...
default:
// The rest...
PrintUse();
return -1;
}
@ -229,32 +241,20 @@ int main(int argc, char *argv[])
return -1;
}
if (!
(t_w == 8 || t_w == 16 || t_w == 32 || t_w == 64 || t_w == 128
|| t_w == 256 || t_w == 512 || t_w == 1024) || !(t_h == 8
|| t_h == 16
|| t_h == 32
|| t_h == 64
|| t_h == 128
|| t_h == 256
|| t_h == 512
|| t_h == 1024)) {
if (!IsValidSize(t_w) || !IsValidSize(t_h)) {
printf("\nWrong texture size. Must be power of 2.\n");
printf
("\nAlthough the model uses an invalid texture size, it will be converted.\n");
printf("\nResize the texture to nearest valid size.\n\n");
//return -1;
}
while (1) {
if (t_w == 8 || t_w == 16 || t_w == 32 || t_w == 64
|| t_w == 128 || t_w == 256 || t_w == 512 || t_w == 1024)
if (IsValidSize(t_w))
break;
t_w++;
}
while (1) {
if (t_h == 8 || t_h == 16 || t_h == 32 || t_h == 64
|| t_h == 128 || t_h == 256 || t_h == 512 || t_h == 1024)
if (IsValidSize(t_h))
break;
t_h++;
}
@ -263,11 +263,12 @@ int main(int argc, char *argv[])
md2_frame_t *frame = NULL;
md2_texCoord_t *texcoord =
(md2_texCoord_t *) ((int)header->offset_st + (int)header);
(md2_texCoord_t *) ((uintptr_t)header->offset_st + (uintptr_t)header);
md2_triangle_t *triangle =
(md2_triangle_t *) ((int)header->offset_tris + (int)header);
(md2_triangle_t *) ((uintptr_t)header->offset_tris + (uintptr_t)header);
md2_vertex_t *vtx; //Current vertex
// Current vertex
md2_vertex_t *vtx;
printf
("\nMD2 Information:\n\n Number of frames: %d\n Texture size: %dx%d",
@ -280,11 +281,11 @@ int main(int argc, char *argv[])
InitDynamicLists();
//Everything ready, let's "draw" all frames
// Everything ready, let's "draw" all frames
int n;
for (n = 0; n < header->num_frames; n++) {
frame =
(md2_frame_t *) ((int)header->offset_frames + (int)header +
(md2_frame_t *) ((uintptr_t)header->offset_frames + (uintptr_t)header +
(header->framesize * n));
NewFrame();
@ -294,21 +295,21 @@ int main(int argc, char *argv[])
int t = 0, v = 0;
for (t = 0; t < num_tris; t++)
for (v = 0; v < 3; v++) {
vtx = (md2_vertex_t *) ((int)(&(frame->verts)));
vtx = (md2_vertex_t *) ((uintptr_t)(&(frame->verts)));
vtx = &vtx[triangle[t].vertex[v]];
//Texture
// Texture
short s_ = texcoord[triangle[t].st[v]].s;
short t_ = texcoord[triangle[t].st[v]].t;
//This is used to change UVs if using a texture size unsupported by DS
// This is used to change UVs if using a texture size unsupported by DS
s_ = (int)((float)(s_ * t_w) /
(float)header->skinwidth);
t_ = (int)((float)(t_ * t_h) /
(float)header->skinheight);
NewFrameData(AddTexCoord(s_ << 4, t_ << 4)); //(t_h-t_)<<4));
NewFrameData(AddTexCoord(s_ << 4, t_ << 4)); // (t_h-t_)<<4));
//Normal
// Normal
unsigned short norm[3];
int b;
for (b = 0; b < 3; b++)
@ -318,7 +319,7 @@ int main(int argc, char *argv[])
NewFrameData(AddNormal
(norm[0], norm[1], norm[2]));
//Vertex
// Vertex
vtxcount++;
float _v[3];
int a = 0;
@ -361,7 +362,7 @@ int main(int argc, char *argv[])
printf("\nCreating NEA file...\n");
//Now, let's save them into a NEA file.
// Now, let's save them into a NEA file.
FILE *file = fopen(outputfilepath, "wb+");
if (file == NULL) {
printf("\nCouldn't create %s file!", outputfilepath);
@ -370,7 +371,7 @@ int main(int argc, char *argv[])
}
ds_header_t temp_header;
temp_header.magic = 1296123214; // 'NEAM'
temp_header.magic = 1296123214; // 'NEAM'
temp_header.version = 2;
temp_header.num_frames = header->num_frames;
temp_header.num_vertices = num_tris * 3;
@ -388,7 +389,7 @@ int main(int argc, char *argv[])
temp_header.offset_vtx + (sizeof(ds_vec3_t) * GetVerticesNumber());
fwrite(&temp_header, sizeof(ds_header_t), 1, file);
//Normals...
// Normals...
ds_vec3_t temp_vector;
int number = GetNormalNumber();
int i_;
@ -398,7 +399,7 @@ int main(int argc, char *argv[])
fwrite(&temp_vector, sizeof(ds_vec3_t), 1, file);
}
//Texcoords
// Texcoords
ds_st_t temp_texcoord;
number = GetTexcoordsNumber();
for (i_ = 0; i_ < number; i_++) {
@ -407,7 +408,7 @@ int main(int argc, char *argv[])
fwrite(&temp_texcoord, sizeof(ds_st_t), 1, file);
}
//Vertices
// Vertices
number = GetVerticesNumber();
for (i_ = 0; i_ < number; i_++) {
GetVertex(i_, (u16 *) & temp_vector[0],
@ -415,10 +416,10 @@ int main(int argc, char *argv[])
fwrite(&temp_vector, sizeof(ds_vec3_t), 1, file);
}
printf("\nSize of a frame: %d\n",
printf("\nSize of a frame: %ld\n",
GetFrameSize(0) * sizeof(unsigned short));
//Frames
// Frames
for (i_ = 0; i_ < header->num_frames; i_++) {
fwrite((int *)GetFramePointer(i_), 1,
GetFrameSize(i_) * sizeof(unsigned short), file);
@ -431,7 +432,7 @@ int main(int argc, char *argv[])
long int size = ftell(test);
fclose(test);
printf("\nNEA file size: %d bytes", size);
printf("\nNEA file size: %ld bytes", size);
if (size > 1 * 1024 * 1024)
printf(" -- Quite big, isn't it?");