Code:
- <Animations>
- <Animation id="0">
<animID>5</animID>
<length>2000</length>
<moveSpeed>0</moveSpeed>
<flags>32</flags>
<probability>32767</probability>
<d1>0</d1>
<d2>0</d2>
<playSpeed>300</playSpeed>
<boxA>(0, 0, 0)</boxA>
<boxB>(0, 0, 0)</boxB>
<rad>15.7619</rad>
<NextAnimation>-1</NextAnimation>
<Index>0</Index>
</Animation>
- <Animation id="1">
<animID>0</animID>
<length>5333</length>
<moveSpeed>0</moveSpeed>
<flags>32</flags>
<probability>28399</probability>
<d1>0</d1>
<d2>0</d2>
<playSpeed>200</playSpeed>
<boxA>(0, 0, 0)</boxA>
<boxB>(0, 0, 0)</boxB>
<rad>15.5947</rad>
<NextAnimation>2</NextAnimation>
<Index>1</Index>
</Animation>
- <Animation id="2">
<animID>0</animID>
<length>5333</length>
<moveSpeed>0</moveSpeed>
<flags>32</flags>
<probability>2184</probability>
<d1>0</d1>
<d2>0</d2>
<playSpeed>300</playSpeed>
<boxA>(0, 0, 0)</boxA>
<boxB>(0, 0, 0)</boxB>
<rad>15.5856</rad>
<NextAnimation>3</NextAnimation>
<Index>2</Index>
</Animation>
- <Animation id="3">
<animID>0</animID>
<length>5333</length>
<moveSpeed>0</moveSpeed>
<flags>32</flags>
<probability>2184</probability>
<d1>0</d1>
<d2>0</d2>
<playSpeed>300</playSpeed>
<boxA>(0, 0, 0)</boxA>
<boxB>(0, 0, 0)</boxB>
<rad>15.9096</rad>
<NextAnimation>-1</NextAnimation>
<Index>3</Index>
</Animation>
- <Animation id="4">
<animID>55</animID>
<length>5333</length>
<moveSpeed>0</moveSpeed>
<flags>33</flags>
<probability>32766</probability>
<d1>0</d1>
<d2>0</d2>
<playSpeed>300</playSpeed>
<boxA>(0, 0, 0)</boxA>
<boxB>(0, 0, 0)</boxB>
<rad>25.0662</rad>
<NextAnimation>-1</NextAnimation>
<Index>4</Index>
</Animation>
- <Animation id="5">
<animID>4</animID>
<length>5567</length>
<moveSpeed>0</moveSpeed>
<flags>32</flags>
<probability>32767</probability>
<d1>0</d1>
<d2>0</d2>
<playSpeed>300</playSpeed>
<boxA>(0, 0, 0)</boxA>
<boxB>(0, 0, 0)</boxB>
<rad>15.6194</rad>
<NextAnimation>-1</NextAnimation>
<Index>5</Index>
</Animation>
- <Animation id="6">
<animID>25</animID>
<length>5333</length>
<moveSpeed>0</moveSpeed>
<flags>32</flags>
<probability>32767</probability>
<d1>0</d1>
<d2>0</d2>
<playSpeed>300</playSpeed>
<boxA>(0, 0, 0)</boxA>
<boxB>(0, 0, 0)</boxB>
<rad>15.3374</rad>
<NextAnimation>-1</NextAnimation>
<Index>6</Index>
It gives us more info of the strucutre of a .m2 file.
Code:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
typedef float Vec3D[3];
typedef float Vec2D[2];
#include "modelheaders.h"
FILE *Input;
char *f;
int FileSize;
ModelHeader *header;
ModelBoneDef *bones;
ModelRenderFlags *rf;
ModelTextureDef *tex;
ModelTexUnit *texunit;
ModelView *view;
ModelAnimation *animations;
ModelParticleEmitterDef *particles;
ModelRibbonEmitterDef *ribbons;
short *texUnitMapping;
bool changed=false;
void displayAnimBlock(AnimationBlock *block)
{
int *Times;
float *Keys;
printf("Interpolation Type: %d NumRange: %d NumTimestamps: %d NumValues: %d\n",block->type,block->nRanges,block->nTimes,block->nKeys);
Times=(int *)(f+block->ofsTimes);
Keys=(float *)(f+block->ofsKeys);
for(int i=0;i<block->nKeys;i++)
printf("%d(%d)- %.3f\n",i,Times[i],Keys[i]);
}
void displayAnimBlockFFF(AnimationBlock *block)
{
int *Times;
float *Keys;
printf("Interpolation Type: %d NumRange: %d NumTimestamps: %d NumValues: %d\n",block->type,block->nRanges,block->nTimes,block->nKeys);
Times=(int *)(f+block->ofsTimes);
Keys=(float *)(f+block->ofsKeys);
for(int i=0;i<block->nKeys;i++)
printf("%d(%d)- %8.3f %8.3f %8.3f\n",i,Times[i],Keys[i*3],Keys[i*3+1],Keys[i*3+2]);
}
void editAnimBlock(AnimationBlock *block)
{
int i;
float tf,*Keys;
displayAnimBlock(block);
Keys=(float *)(f+block->ofsKeys);
do{
printf("Edit which key? (-1 to return)\n");
scanf("%d",&i);
if((i>=0)&&(i<block->nKeys))
{
printf("New Value? (Cur Value %.3f)\n",Keys[i]);
scanf("%f",&tf);
Keys[i]=tf;
changed=true;
}
else if(i!=-1)
printf("Key %d isn't valid\n",i);
}while(i!=-1);
void editAnimBlockFFF(AnimationBlock *block)
{
int i;
float tf,*Keys;
displayAnimBlockFFF(block);
Keys=(float *)(f+block->ofsKeys);
do{
printf("Edit which key? (-1 to return)\n");
scanf("%d",&i);
if((i>=0)&&(i<block->nKeys))
{
for(int j=0;j<3;j++)
{
printf("New Value %d? (Cur Value %.3f)\n",j,Keys[i*3+j]);
scanf("%f",&tf);
Keys[i*3+j]=tf;
}
changed=true;
}
else if(i!=-1)
printf("Key %d isn't valid\n",i);
}while(i!=-1);
}
void editParticles()
{
do{
int i,j;
char t;
system("clear");
printf("Textures\n");
for(i=0;i<header->nParticleEmitters;i++)
{
setTextureType(tex[i].type);
printf("%d Flags: %02x Bone: %d Pos: %.2f %.2f %.2f Texture: %d Blend: %d Type: %d\n",i,particles[i].flags,particles[i].bone,particles[i].pos[0],particles[i].pos[1],particles[i].pos[2],particles[i].texture,particles[i].blend,particles[i].type);
printf("\tColors %08x %08x %08x\n",particles[i].p.colors[0],particles[i].p.colors[1],particles[i].p.colors[2]);
printf("\tSizes %.2f %.2f %.2f\n",particles[i].p.sizes[0],particles[i].p.sizes[1],particles[i].p.sizes[2]);
printf("\tSlowdown %.2f Rotation %.2f\n",particles[i].p.slowdown,particles[i].p.rotation);
}
printf("\n f - Change Flags\n n - Change Bones\n p - Change Position\n r - Change Rotation\n t - Change Texture\n c - Change Colors\n b - Change Blending\n y - Change Emitter Type\n s - Change Sizes\n a - Edit Animation Block\n q - Return to Main Menu\n");
t=getchar();
if(t=='p')
{
i=-1;
do{
printf("\nChange a postion (number of particle or -1 to quit)\n");
scanf ("%d",&i);
if((i>=0)&&(i<header->nParticleEmitters))
{
float Pos[3];
printf("New Position (format \"x y z\")\n");
scanf ("%f %f %f",&Pos[0],&Pos[1],&Pos[2]);
for(j=0;j<3;j++)
particles[i].pos[j]=Pos[j];
changed=true;
}
}while(i!=-1);
}
else if(t=='s')
{
i=-1;
do{
printf("\nChange the sizes (number of particle or -1 to quit)\n");
scanf ("%d",&i);
if((i>=0)&&(i<header->nParticleEmitters))
{
float Size[3];
printf("New Sizes (format \"b m e\")\n");
scanf ("%f %f %f",&Size[0],&Size[1],&Size[2]);
for(j=0;j<3;j++)
particles[i].p.sizes[j]=Size[j];
changed=true;
}
}while(i!=-1);
}
else if(t=='a')
{
i=-1;
printf("Animation Block Types\n");
printf("0 - Emission Speed\n");
printf("1 - Speed Variation (range 0 to 1)\n");
printf("2 - Rotation\\Tumble Spread (range 0 to pi)\n");
printf("3 - ? (range: 0 to 2pi)\n");
printf("4 - Gravity\n");
printf("5 - Lifespan\n");
printf("6 - Emission Rate\n");
printf("7 - Emission Area Length\n");
printf("8 - Emission Area Width\n");
printf("9 - Gravity? (much stronger)\n");
do{
printf("Edit Animation Block (number of particle or -1 to quit)\n");
scanf ("%d",&i);
if((i>=0)&&(i<header->nParticleEmitters))
{
float Pos[3];
printf("Which Block(0-9)\n");
scanf ("%d",&j);
editAnimBlock(&(particles[i].params[j]));
}
}while(i!=-1);
}
if(t=='b')
{
i=-1;
do{
printf("\nChange a blend mode (number of particle or -1 to quit)\n");
scanf ("%d",&i);
if((i>=0)&&(i<header->nParticleEmitters))
{
printf("New Blend Mode (0 - Opaque, 1 - Alpha testing, 2 - Alpha Blending, 3 - Additive, 4 - Additive Alpha, 5 - Modulate, 6 - Deeprun Tram Glass\n");
scanf ("%d",&j);
particles[i].blend=j;
changed=true;
}
}while(i!=-1);
}
if(t=='f')
{
i=-1;
do{
printf("\nChange flags (number of particle or -1 to quit)\n");
scanf ("%d",&i);
if((i>=0)&&(i<header->nParticleEmitters))
{
printf("New Flag\n");
scanf ("%x",&j);
particles[i].flags=j;
changed=true;
}
}while(i!=-1);
}
if(t=='r')
{
i=-1;
do{
printf("\nChange flags (number of particle or -1 to quit)\n");
scanf ("%d",&i);
if((i>=0)&&(i<header->nParticleEmitters))
{
printf("New Rotation\n");
scanf ("%f",&(particles[i].p.rotation));
changed=true;
}
}while(i!=-1);
}
if(t=='n')
{
i=-1;
do{
printf("\nChange Bones (number of particle or -1 to quit)\n");
scanf ("%d",&i);
if((i>=0)&&(i<header->nParticleEmitters))
{
printf("New Bone\n");
scanf ("%d",&j);
particles[i].bone=j;
changed=true;
}
}while(i!=-1);
}
if(t=='y')
{
i=-1;
do{
printf("\nChange a emitter type (number of particle or -1 to quit)\n");
scanf ("%d",&i);
if((i>=0)&&(i<header->nParticleEmitters))
{
printf("New Emitter Type (1 - Plane 2 - Sphere 3 - Unknown\n");
scanf ("%d",&j);
particles[i].type=j;
changed=true;
}
}while(i!=-1);
}
if(t=='t')
{
printf("Textures\n");
for(i=0;i<header->nTextures;i++)
printf(" %d - %s\n",i,(char *)(f+tex[i].nameOfs));
i=-1;
do{
printf("\nChange a texture (number of particle or -1 to quit)\n");
scanf ("%d",&i);
if((i>=0)&&(i<header->nParticleEmitters))
{
printf("New Texture\n");
scanf ("%d",&j);
particles[i].texture=j;
changed=true;
}
}while(i!=-1);
}
if(t=='c')
{
i=-1;
do{
printf("\nChange particle colors (number of particle or -1 to quit)\n");
scanf ("%d",&i);
if((i>=0)&&(i<header->nParticleEmitters))
{
printf("Current Colors %08x %08x %08x\n",particles[i].p.colors[0],particles[i].p.colors[1],particles[i].p.colors[2]);
printf("New Start Color\n");
scanf ("%x",&j);
particles[i].p.colors[0]=j;
printf("New Middle Color\n");
scanf ("%x",&j);
particles[i].p.colors[1]=j;
printf("New End Color\n");
scanf ("%x",&j);
particles[i].p.colors[2]=j;
changed=true;
}
}while(i!=-1);
}
if(t=='q')
return;
}while(1);
}
int main(int argc, char **argv)
{
char t;
int i,j;
if(argc<2)
{
printf("M2Modder V1.0 (April 7th, 2006) by John 'Cryect' Rittenhouse\n");
printf(" m2modder <filename.m2>\n");
return 0;
}
printf("M2Modder V1.0 (April 7th, 2006) by John 'Cryect' Rittenhouse\n");
printf(" Loading Model %s\n",argv[1]);
Input=fopen(argv[1],"rb+");
if(Input==NULL)
{
printf(" ERROR: Could not load file %s\n",argv[1]);
return 0;
}
fseek(Input,0,SEEK_END);
FileSize=ftell(Input);
fseek(Input,0,SEEK_SET);
f=new char[FileSize];
fread(f,FileSize,1,Input);
fclose(Input);
header=(ModelHeader *)f;
rf=(ModelRenderFlags *)(f+header->ofsTexFlags);
tex=(ModelTextureDef *)(f+header->ofsTextures);
view= (ModelView*)(f+ header->ofsViews);
texunit=(ModelTexUnit *)(f+view->ofsTex);
animations=(ModelAnimation *)(f+header->ofsAnimations);
particles=(ModelParticleEmitterDef *)(f+header->ofsParticleEmitters);
bones=(ModelBoneDef *)(f+header->ofsBones);
ribbons=(ModelRibbonEmitterDef *)(f+header->ofsRibbonEmitters);
texUnitMapping=(short *)(f+header->ofsTexUnitLookup);
do{
system("clear");
printf("M2Modder V1.0 (April 7th, 2006) by John 'Cryect' Rittenhouse\n");
printf(" Currently Editing %s ",argv[1]);
if(changed)
printf("which has changed\n");
else
printf("which has not changed\n");
printf("\n t - Edit Textures Definations\n u - Edit Texture Units\n b - Edit Bones\n a - Edit Animation IDs(a)\n p - Edit Particles\n r - Edit Ribbons\n q - Quit\n x - Quit Without Saving\n\n");
t=getchar();
if(t=='t')
editTextures();
else if(t=='u')
editTextureUnits();
else if(t=='b')
editBones();
else if(t=='a')
editAnimations();
else if(t=='p')
editParticles();
else if(t=='r')
editRibbons();
else if(t=='q')
break;
else if(t=='x')
return 0;
}while(1);
if(changed)
{
printf("Saving Changes\n");
Input=fopen(argv[1],"wb");
fwrite(f,FileSize,1,Input);
fclose(Input);
}
return 0;
}
Thanks for reading, and hope someone could help.