Beispiel #1
0
bool Cocos2dExporter::Export(QByteArray& out) {
    QString res = "info ";
    res += QString("face=\"") + fontConfig()->family() +  QString("\" ");
    res += QString("size=") + QString().number(fontConfig()->size()) + QString(" bold=0 italic=0 charset="" unicode=0 stretchH=100 smooth=1 aa=1 padding=0,0,0,0 spacing=2,2\n");
    res += QString("common lineHeight=") + QString().number(metrics().height) + QString(" base=29 scaleW=") + QString().number(texWidth()) + QString(" scaleH=") + QString().number(texWidth()) + QString(" pages=1 packed=0\n");
    res += QString("page id=0 file=\"") + texFilename() + QString("\"\n");
    res += QString("chars count=") + QString().number(symbols().size()) + QString("\n");

    foreach(const Symbol& c , symbols())
    {
        res += QString("char id=") + QString().number(c.id) + QString(" x=") + QString().number(c.placeX) + QString(" y=") + QString().number(c.placeY);
        res += QString(" width=") + QString().number(c.placeW) + QString(" height=") + QString().number(c.placeH);
        res += QString(" xoffset=") + QString().number(c.offsetX) + QString(" yoffset=") + QString().number(fontConfig()->size() - c.offsetY);
        res += QString(" xadvance=") + QString().number(c.advance) + QString(" page=0 chnl=0 ");

        if(c.id==32)
        {
            res += QString("letter=\"space\"");
        }
        else
        {
            res += QString("letter=\"" + QString().append(c.id) + "\"");
        }

        res += QString("\n");
    }
bool LuaExporter::Export(QByteArray& out) {
    QString res;
    if (m_write_function)
        res+="return {\n";
    const QString p(m_write_function ? "\t":"");
    res+=p+QString("file=\"")+texFilename()+QString(m_write_function ? "\",\n" : "\"\n");
    res+=p+QString("height=")+QString().number(metrics().height)+QString(m_write_function?",\n":"\n");
    res+=p+QString("description={\n");
    res+=p+QString("\tfamily=\"")+fontConfig()->family()+QString("\",\n");
    res+=p+QString("\tstyle=\"")+fontConfig()->style()+QString("\",\n");
    res+=p+QString("\tsize=")+QString().number(fontConfig()->size())+QString("\n");
    res+=p+QString(m_write_function?"},\n":"}\n");

    res+=p+QString("metrics={\n");
    res+=p+QString("\tascender=")+QString().number(metrics().ascender)+QString(",\n");
    res+=p+QString("\tdescender=")+QString().number(metrics().descender)+QString(",\n");
    res+=p+QString("\theight=")+QString().number(metrics().height)+QString("\n");
    res+=p+QString(m_write_function?"},\n":"}\n");

    res+=p+QString("texture={\n");
    res+=p+QString("\tfile=\"")+texFilename()+QString("\",\n");
    res+=p+QString("\twidth=")+QString().number(texWidth())+QString(",\n");
    res+=p+QString("\theight=")+QString().number(texHeight())+QString("\n");
    res+=p+QString(m_write_function?"},\n":"}\n");

    res+=p+QString("chars={\n");
    foreach (const Symbol& c , symbols()) {
        QString charDef="{char=";
        charDef+=charCode(c.id);
        charDef+=QString(",");
        charDef+=QString("width=")+QString().number(c.advance)+QString(",");
        charDef+=QString("x=")+QString().number(c.placeX)+QString(",");
        charDef+=QString("y=")+QString().number(c.placeY)+QString(",");
        charDef+=QString("w=")+QString().number(c.placeW)+QString(",");
        charDef+=QString("h=")+QString().number(c.placeH)+QString(",");

        charDef+=QString("ox=")+QString().number(c.offsetX)+QString(",");
        charDef+=QString("oy=")+QString().number(c.offsetY)+QString("}");

        res+=p+QString("\t")+charDef+QString(",\n");
    }
Beispiel #3
0
bool JsExporter::Export(QByteArray& out) {
    QString res = "var font = {\n";

    res+=QString("\t\"file\":\"")+texFilename()+QString("\",\n");
    res+=QString("\t\"height\":")+QString().number(metrics().height)+QString(",\n");
    res+=QString("\t\"description\":{\n");
    res+=QString("\t\t\"family\":\"")+fontConfig()->family()+QString("\",\n");
    res+=QString("\t\t\"style\":\"")+fontConfig()->style()+QString("\",\n");
    res+=QString("\t\t\"size\":")+QString().number(fontConfig()->size())+QString("\n");
    res+=QString("\t},\n");

    res+=QString("\t\"metrics\":{\n");
    res+=QString("\t\t\"ascender\":")+QString().number(metrics().ascender)+QString(",\n");
    res+=QString("\t\t\"descender\":")+QString().number(metrics().descender)+QString(",\n");
    res+=QString("\t\t\"height\":")+QString().number(metrics().height)+QString("\n");
    res+=QString("\t},\n");

    res+=QString("\t\"texture\":{\n");
    res+=QString("\t\t\"file\":\"")+texFilename()+QString("\",\n");
    res+=QString("\t\t\"width\":")+QString().number(texWidth())+QString(",\n");
    res+=QString("\t\t\"height\":")+QString().number(texHeight())+QString("\n");
    res+=QString("\t},\n");

    res+=QString("\t\"chars\":{\n");
    foreach (const Symbol& c , symbols()) {
        QString charDef=charCode(c.id);
        charDef+=QString(":{");
        charDef+=QString("\"width\":")+QString().number(c.advance)+QString(",");
        charDef+=QString("\"x\":")+QString().number(c.placeX)+QString(",");
        charDef+=QString("\"y\":")+QString().number(c.placeY)+QString(",");
        charDef+=QString("\"w\":")+QString().number(c.placeW)+QString(",");
        charDef+=QString("\"h\":")+QString().number(c.placeH)+QString(",");

        charDef+=QString("\"ox\":")+QString().number(c.offsetX)+QString(",");
        charDef+=QString("\"oy\":")+QString().number(c.offsetY)+QString("}");

        res+=QString("\t\t")+charDef+QString(",\n");
    }
bool SparrowExporter::Export(QByteArray& out) {
    QDomDocument doc;
    QDomElement root = doc.createElement("font");
    doc.appendChild(root);
    QDomElement info = doc.createElement("info");
    root.appendChild(info);
    info.setAttribute("face", fontConfig()->family());
    info.setAttribute("size", fontConfig()->size());
    QDomElement common = doc.createElement("common");
    root.appendChild(common);
    int height = metrics().height;
    common.setAttribute("lineHeight", height);
    QDomElement pages = doc.createElement("pages");
    root.appendChild(pages);
    QDomElement page = doc.createElement("page");
    pages.appendChild(page);
    page.setAttribute("id", "0");
    page.setAttribute("file", texFilename());
    QDomElement chars = doc.createElement("chars");
    root.appendChild(chars);
    chars.setAttribute("count", symbols().size());
    QDomElement kernings = doc.createElement("kernings");
    int kernNumber = 0;
    foreach(const Symbol& c , symbols()) {
        QDomElement ch = doc.createElement("char");
        ch.setAttribute("id", QString::number(c.id));
        ch.setAttribute("x", QString::number(c.placeX));
        ch.setAttribute("y", QString::number(c.placeY));
        ch.setAttribute("width", QString::number(c.placeW));
        ch.setAttribute("height", QString::number(c.placeH));
        ch.setAttribute("xoffset", QString::number(c.offsetX));
        ch.setAttribute("yoffset", QString::number(height - c.offsetY));
        ch.setAttribute("xadvance", QString::number(c.advance));
        ch.setAttribute("page", "0");
        ch.setAttribute("chnl", "0");
        ch.setAttribute("letter", c.id==32 ? "space" : QString().append(c.id));
        chars.appendChild(ch);
        typedef QMap<uint,int>::ConstIterator Kerning;
        for ( Kerning k = c.kerning.begin();k!=c.kerning.end();k++) {
            QDomElement ker = doc.createElement("kerning");
            ker.setAttribute("first", QString::number(c.id));
            ker.setAttribute("second", QString::number(k.key()));
            ker.setAttribute("amount", k.value());
            kernings.appendChild(ker);
            kernNumber ++;
        }
    }
void M2toX3D(tabbed_ostream s, Model *m, bool init, const char* fn, bool xhtml)
{
	LogExportData(wxT("X3D"),m->modelname,wxString(fn, wxConvUTF8));
    s << "<!-- Exported with WoWModelViewer -->" << std::endl;

    s.tab();
    s << "<Scene>" << std::endl;
    
    s.tab();

    // define background
    s   << "<Background skyColor='" 
        << 70.f/256.f << " " 
        << 94.f/256.f << " "
        << 121.f/256.f << " "
        << "'/>" << std::endl;

    // define all textures
    typedef std::map<int, wxString> texMap;
    texMap textures;

    if (!fn)
        fn = "texture";

    size_t num_rot = 0;
    if (modelExport_X3D_CenterModel)
    {
        // move viewpoint back
        s << "<Viewpoint position='0 0 " << m->pos.z << "'/>" << std::endl;

        // create rotation transforms only if there is an actual rotation
        float rot[3] = { m->rot.x, m->rot.y, m->rot.z };
        for (size_t n=0; n < 3; ++n)
            if (rot[n] != 0.f)
            {   
                s << "<Transform rotation='" << (n == 0) << " " << (n == 1) << " " << (n == 2) << " " 
                  << PIOVER180d*rot[n] << "'>" << std::endl;
                num_rot++;
                s.tab();
            }

        // translate object to center
        Vec3D p = calcCenteringTransform(m, init);
        s << "<Transform translation='" << p.x << " " << p.y << " " << p.z << "'>" << std::endl;
        s.tab();
    }

    for (size_t i=0; i<m->passes.size(); i++) 
    {
        ModelRenderPass &p = m->passes[i];
        if (p.init(m)) 
        {
            s << "<Shape>"  << std::endl;

            size_t counter;

            // write material, color etc.

            s.tab();
            s << "<Appearance>" << std::endl;

            s.tab();

#ifdef NONSTANDARDBLENDMODE
            if (!xhtml)
            {
                writeBlendMode(s, p.blendmode);
                if (p.noZWrite)
                    s << "<DepthMode readOnly='TRUE' />" << std::endl;
            }
#endif
            
            s   << "<Material diffuseColor='"
                << p.ocol.x << " " 
                << p.ocol.y << " " 
                << p.ocol.z << "' ";

            s.toggle();

            if (p.useEnvMap)
                s << "shininess='18.0' ";

#ifndef NONSTANDARDBLENDMODE
            if (!xhtml) 
            {
                s   << "emissiveColor='" 
                    << p.ecol.x << " " 
                    << p.ecol.y << " " 
                    << p.ecol.z << "' "

                    << "transparency='" << 1.f - p.ocol.w << "' ";
            }
#endif
            s << "/>" << std::endl;
            s.toggle();

            // has the texture been used before?
            // no : save texture, create a map entry and define it
            // yes: reuse the previously defined texture
            if (!textures.count(p.tex))
            {
                wxString texName(fn, wxConvUTF8);
                texName = texName.AfterLast(SLASH).BeforeLast('.');
                texName << wxT("_") << p.tex;

                wxString texFilename(fn, wxConvUTF8);
                texFilename = texFilename.BeforeLast(SLASH);
                texFilename += SLASH;
                texFilename += texName;
                texFilename += wxString(wxT(".png"));
                SaveTexture(texFilename);

                textures[p.tex] = texName;

                s << "<ImageTexture DEF='" << textures[p.tex] << "' url='"
                  << texFilename.AfterLast(SLASH).c_str() << "' />" << std::endl;
            }
            else
                s << "<ImageTexture USE='" << textures[p.tex] << "'/>" << std::endl;

            s.rtab();
            s << "</Appearance>" << std::endl;

            // ---------------- write all indices here -----------------

            s << "<IndexedFaceSet solid='false' ";
            s.toggle();

            // write normals
            counter = 0;
            s << "coordIndex='" << std::endl;
            for (size_t k=0; k<p.indexCount; k+=3)
            {
                s << counter+1 << " " << counter+2 << " " << counter+0 << " -1 ";
                counter += 3;
            }
            s << "'>" << std::endl;
            s.toggle();

            // ----------------- write all data here -----------------

            // write vertices
            s.tab();
            s << "<Coordinate DEF='pl_" << i << "' point='" << std::endl;
            s.tab();
            for (size_t k = 0, b=p.indexStart; k<p.indexCount; k++,b++) 
            {
                uint16 a = m->indices[b];
                Vec3D v;

                if (m->vertices == NULL || init == true) 
                    v = m->origVertices[a].pos;
                else
                    v = m->vertices[a];

                s << v.x << " " << v.y << " " << v.z << std::endl;
            }
            s.rtab();
            s << "' />" << std::endl;

            // write normals
            s << "<Normal vector='" << std::endl;
            s.tab();
            for (size_t k = 0, b=p.indexStart; k<p.indexCount; k++,b++) 
            {
                uint16 a = m->indices[b];
                Vec3D v = m->origVertices[a].normal;

                s << v.x << " " << v.y << " " << v.z << std::endl;
            }
            s.rtab();
            s << "' />" << std::endl;

            // write texcoords
            s << "<TextureCoordinate point='" << std::endl;
            s.tab();
            for (size_t k = 0, b=p.indexStart; k<p.indexCount; k++,b++)
            {
                uint16 a = m->indices[b];
                Vec2D v = m->origVertices[a].texcoords;
                s << v.x << " " << 1-v.y << std::endl;
            }
            s.rtab();
            s << "' />" << std::endl;

            s.rtab();
            s << "</IndexedFaceSet>" << std::endl;

            s.rtab();
            s << "</Shape>" << std::endl << std::endl;
        }
    }

    if (m->animated && modelExport_X3D_ExportAnimation)
        M2toX3DAnim(s, m);

    if (modelExport_X3D_CenterModel)
    {
        // close translation
        s.rtab();
        s << "</Transform>" << std::endl;

        // close all rotations
        for (size_t n = 0; n < num_rot; ++n)
        {
            s.rtab();
            s << "</Transform>" << std::endl;
        }
    }

    s.rtab();
    s << "</Scene>" << std::endl;

    s.rtab();
}
// MilkShape 3D
void ExportMS3D_M2(Attachment *att, Model *m, const char *fn, bool init)
{
	wxFFileOutputStream f(wxString(fn, wxConvUTF8), wxT("w+b"));

	if (!f.IsOk()) {
		wxLogMessage(wxT("Error: Unable to open file '%s'. Could not export model."), fn);
		return;
	}
	LogExportData(wxT("MS3D"),m->modelname,wxString(fn, wxConvUTF8));
	unsigned short numVerts = 0;
	unsigned short numFaces = 0;
	unsigned short numGroups = 0;
	ModelData *verts = NULL;
	GroupData *groups = NULL;

	//we need the initial position anyway
	InitCommon(att, true, verts, groups, numVerts, numGroups, numFaces);
	//wxLogMessage(wxT("Num Verts: %i, Num Faces: %i, Num Groups: %i"), numVerts, numFaces, numGroups);
	//wxLogMessage(wxT("Vert[0] BoneID: %i, Group[0].m.name = %s"),verts[0].boneid, groups[0].m->name);
	wxLogMessage(wxT("Init Common Complete."));

	// Write the header
	ms3d_header_t header;
	strncpy(header.id, "MS3D000000", sizeof(header.id));
	header.version = 4;

	// Header
	f.Write(reinterpret_cast<char *>(&header), sizeof(ms3d_header_t));
	wxLogMessage(wxT("Header Data Written."));
	// Vertex Count
	f.Write(reinterpret_cast<char *>(&numVerts), sizeof(numVerts));
	//wxLogMessage(wxT("NumVerts: %i"),numVerts);
	
	// Write Vertex data?
	for (size_t i=0; i<numVerts; i++) {
		ms3d_vertex_t vert;
		vert.boneId = verts[i].boneid;
		vert.flags = 0; //SELECTED;
		vert.referenceCount = 0; // what the?
		vert.vertex[0] = verts[i].vertex.x;
		vert.vertex[1] = verts[i].vertex.y;
		vert.vertex[2] = verts[i].vertex.z;
		f.Write(reinterpret_cast<char *>(&vert), sizeof(ms3d_vertex_t));
	}
	wxLogMessage(wxT("Vertex Data Written."));
	// ---------------------------

	// Triangle Count
	f.Write(reinterpret_cast<char *>(&numFaces), sizeof(numFaces));
	//wxLogMessage(wxT("NumFaces: %i"),numFaces);

	// Write Triangle Data?
	for (size_t i=0; i<(unsigned int)numVerts; i+=3) {
		ms3d_triangle_t tri;
		tri.flags = 0; //SELECTED;
		tri.groupIndex = (unsigned char)verts[i].groupIndex;
		tri.smoothingGroup = 1; // 1 - 32

		for (ssize_t j=0; j<3; j++) {
			tri.vertexIndices[j] = (word)i+j;
			tri.s[j] = verts[i+j].tu;
			tri.t[j] = verts[i+j].tv;
			
			tri.vertexNormals[j][0] = verts[i+j].normal.x;
			tri.vertexNormals[j][1] = verts[i+j].normal.y;
			tri.vertexNormals[j][2] = verts[i+j].normal.z;
		}

		f.Write(reinterpret_cast<char *>(&tri), sizeof(ms3d_triangle_t));
	}
	wxLogMessage(wxT("Triangle Data Written."));
	// ---------------------------

	// Number of groups
	f.Write(reinterpret_cast<char *>(&numGroups), sizeof(numGroups));
	//wxLogMessage(wxT("NumGroups: %i"),numGroups);

	unsigned short indiceCount = 0;
	for (unsigned short i=0; i<(unsigned int)numGroups; i++) {
		wxString groupName(wxString::Format(wxT("Geoset_%i"), i));

		const char flags = 0; // SELECTED
		f.Write(&flags, sizeof(flags));

		char name[32];
		strncpy(name, groupName.mb_str(), sizeof(name));
		f.Write(name, sizeof(name));

		unsigned short faceCount = groups[i].p.indexCount / 3;
		f.Write(reinterpret_cast<char *>(&faceCount), sizeof(faceCount));
		
		for (ssize_t k=0; k<faceCount; k++) {
			//triIndices[k] = indiceCount;
			f.Write(reinterpret_cast<char *>(&indiceCount), sizeof(indiceCount));
			indiceCount++;
		}

		unsigned char gIndex = (char)i;
		f.Write(reinterpret_cast<char *>(&gIndex), sizeof(gIndex));
	}
	wxLogMessage(wxT("Group Data Written."));

	// Number of materials (pretty much identical to groups, each group has its own material)
	f.Write(reinterpret_cast<char *>(&numGroups), sizeof(numGroups));
	
	for (unsigned short i=0; i<(unsigned int)numGroups; i++) {
		wxString matName(wxString::Format(wxT("Material_%i"), i));

		ModelRenderPass p = groups[i].p;
		if (p.init(groups[i].m)) {
			ms3d_material_t mat;
			memset(mat.alphamap, '\0', sizeof(mat.alphamap));

			strncpy(mat.name, matName.mb_str(), sizeof(mat.name));
			mat.ambient[0] = 0.7f;
			mat.ambient[1] = 0.7f;
			mat.ambient[2] = 0.7f;
			mat.ambient[3] = 1.0f;
			mat.diffuse[0] = p.ocol.x;
			mat.diffuse[1] = p.ocol.y;
			mat.diffuse[2] = p.ocol.z;
			mat.diffuse[3] = p.ocol.w;
			mat.specular[0] = 0.0f;
			mat.specular[1] = 0.0f;
			mat.specular[2] = 0.0f;
			mat.specular[3] = 1.0f;
			mat.emissive[0] = p.ecol.x;
			mat.emissive[1] = p.ecol.y;
			mat.emissive[2] = p.ecol.z;
			mat.emissive[3] = p.ecol.w;
			mat.transparency = p.ocol.w;

			if (p.useEnvMap) {
				mat.shininess = 30.0f;
				mat.mode = 1;
			} else {
				mat.shininess = 0.0f;
				mat.mode = 0;
			}
/*
			unsigned int bindtex = 0;
			if (groups[i].m->specialTextures[p.tex]==-1) 
				bindtex = groups[i].m->textures[p.tex];
			else 
				bindtex = groups[i].m->replaceTextures[groups[i].m->specialTextures[p.tex]];
*/
			wxString texName = GetM2TextureName(m,p,i);
			texName << wxT(".tga");
			strncpy(mat.texture, texName.mb_str(), sizeof(mat.texture));

			f.Write(reinterpret_cast<char *>(&mat), sizeof(ms3d_material_t));

			wxString texFilename(fn, wxConvUTF8);
			texFilename = texFilename.BeforeLast(SLASH);
			texFilename += SLASH;
			texFilename += texName;
			wxLogMessage(wxT("Exporting Image: %s"),texFilename.c_str());
			SaveTexture(texFilename);
		}
	}
	wxLogMessage(wxT("Material Data Written."));

	if (init)
	{
		float fps = 1.0f;
		float fCurTime = 0.0f;
		int totalFrames = 0;

		f.Write(reinterpret_cast<char *>(&fps), sizeof(fps));
		f.Write(reinterpret_cast<char *>(&fCurTime), sizeof(fCurTime));
		f.Write(reinterpret_cast<char *>(&totalFrames), sizeof(totalFrames));
		
		// number of joints
		unsigned short numJoints = 0;

		f.Write(reinterpret_cast<char *>(&numJoints), sizeof(numJoints));
	}
	else
	{
		float fps = 25.0f;
		float fCurTime = 0.0f;
		int totalFrames = ceil((m->anims[m->anim].timeEnd - m->anims[m->anim].timeStart) / 1000.0f * fps);

		f.Write(reinterpret_cast<char *>(&fps), sizeof(fps));
		f.Write(reinterpret_cast<char *>(&fCurTime), sizeof(fCurTime));
		f.Write(reinterpret_cast<char *>(&totalFrames), sizeof(totalFrames));
		
		// number of joints
		unsigned short numJoints = (unsigned short)m->header.nBones;

		f.Write(reinterpret_cast<char *>(&numJoints), sizeof(numJoints));

		for (size_t i=0; i<numJoints; i++)
		{
			ms3d_joint_t joint;

			int parent = m->bones[i].parent;

			joint.flags = 0; // SELECTED
			memset(joint.name, '\0', sizeof(joint.name));
			snprintf(joint.name, sizeof(joint.name), "Bone_%i", i);
			memset(joint.parentName, '\0', sizeof(joint.parentName));
			if (parent != -1) snprintf(joint.parentName, sizeof(joint.parentName), "Bone_%i", parent);

			joint.rotation[0] = 0;
			joint.rotation[1] = 0;
			joint.rotation[2] = 0;

			Vec3D p = FixPivot(m, (int)i, m->bones[i].pivot);
			joint.position[0] = p.x;
			joint.position[1] = p.y;
			joint.position[2] = p.z;

			joint.numKeyFramesRot = (unsigned short)m->bones[i].rot.data[m->anim].size();
			joint.numKeyFramesTrans = (unsigned short)m->bones[i].trans.data[m->anim].size();

			f.Write(reinterpret_cast<char *>(&joint), sizeof(ms3d_joint_t));

			if (joint.numKeyFramesRot > 0)
			{
				ms3d_keyframe_rot_t *keyFramesRot = new ms3d_keyframe_rot_t[joint.numKeyFramesRot];
				for (size_t j=0; j<joint.numKeyFramesRot; j++)
				{
					keyFramesRot[j].time = m->bones[i].rot.times[m->anim][j] / 1000.0f;
					Vec3D euler = QuatToEuler(m->bones[i].rot.data[m->anim][j]);
					keyFramesRot[j].rotation[0] = euler.x;
					keyFramesRot[j].rotation[1] = euler.y;
					keyFramesRot[j].rotation[2] = euler.z;
				}

				f.Write(reinterpret_cast<char *>(keyFramesRot), sizeof(ms3d_keyframe_rot_t) * joint.numKeyFramesRot);
				wxDELETEA(keyFramesRot);
			}

			if (joint.numKeyFramesTrans > 0)
			{
				ms3d_keyframe_pos_t *keyFramesTrans = new ms3d_keyframe_pos_t[joint.numKeyFramesTrans];
				for (size_t j=0; j<joint.numKeyFramesTrans; j++)
				{
					keyFramesTrans[j].time = m->bones[i].trans.times[m->anim][j] / 1000.0f;
					keyFramesTrans[j].position[0] = m->bones[i].trans.data[m->anim][j].x;
					keyFramesTrans[j].position[1] = m->bones[i].trans.data[m->anim][j].y;
					keyFramesTrans[j].position[2] = m->bones[i].trans.data[m->anim][j].z;
				}

				f.Write(reinterpret_cast<char *>(keyFramesTrans), sizeof(ms3d_keyframe_pos_t) * joint.numKeyFramesTrans);
				wxDELETEA(keyFramesTrans);
			}
		}
	}
	f.Close();
	wxLogMessage(wxT("Finished Milkshape Export."));

	if (verts){
		//wxLogMessage("verts found. Deleting...");
		wxDELETEA(verts);
	}
	if (groups){
		//wxLogMessage("groups found. Deleting...");
		wxDELETEA(groups);
	}

	//wxLogMessage(wxT("Finished Milkshape Cleanup.\n"));
}