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"); }
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")); }