main.cpp
上传用户:qccn516
上传日期:2013-05-02
资源大小:3382k
文件大小:7k
源码类别:

游戏引擎

开发平台:

Visual C++

  1. /* Mesh Export plugin for Maya
  2.  *
  3.  * Copyright (C) 2003-2004, Alexander Zaprjagaev <frustum@frustum.org>
  4.  *
  5.  * This program is free software; you can redistribute it and/or modify
  6.  * it under the terms of the GNU General Public License as published by
  7.  * the Free Software Foundation; either version 2 of the License, or
  8.  * (at your option) any later version.
  9.  *
  10.  * This program is distributed in the hope that it will be useful,
  11.  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  12.  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  13.  * GNU General Public License for more details.
  14.  *
  15.  * You should have received a copy of the GNU General Public License
  16.  * along with this program; if not, write to the Free Software
  17.  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
  18.  */
  19. #include <maya/MFnPlugin.h>
  20. #include <maya/MObject.h>
  21. #include <maya/MFnMesh.h>
  22. #include <maya/MItMeshPolygon.h>
  23. #include <maya/MItMeshVertex.h>
  24. #include <maya/MPxFileTranslator.h>
  25. #include <maya/MFnDagNode.h>
  26. #include <maya/MDagPath.h>
  27. #include <maya/MItDag.h>
  28. #include <maya/MGlobal.h>
  29. #include <maya/MSelectionList.h>
  30. #include <maya/MItSelectionList.h>
  31. #define MESH_RAW_MAGIC ('m' | ('r' << 8) | ('0' << 16) | ('2' << 24))
  32. struct Vertex {
  33. float xyz[3];
  34. float normal[3];
  35. float texcoord[2];
  36. };
  37. /*****************************************************************************/
  38. /*                                                                           */
  39. /* MeshTranslator                                                            */
  40. /*                                                                           */
  41. /*****************************************************************************/
  42. class MeshTranslator : public MPxFileTranslator {
  43. public:
  44. MeshTranslator() { };
  45. virtual ~MeshTranslator() { };
  46. static void *creator() { return new MeshTranslator(); }
  47. MStatus reader(const MFileObject &name,const MString &optionsString,FileAccessMode mode) { return MS::kFailure; }
  48. MStatus writer(const MFileObject &name,const MString &optionsString,FileAccessMode mode);
  49. bool haveReadMethod() const { return false; }
  50. bool haveWriteMethod() const { return true; }
  51. MString defaultExtension() const { return "mesh"; }
  52. MFileKind identifyFile(const MFileObject& fileName,const char* buffer,short size) const;
  53. private:
  54. void exportMesh(MDagPath &path);
  55. FILE *file;
  56. int num_surfaces;
  57. };
  58. /*****************************************************************************/
  59. /*                                                                           */
  60. /*                                                                           */
  61. /*                                                                           */
  62. /*****************************************************************************/
  63. /*
  64.  */
  65. void MeshTranslator::exportMesh(MDagPath &path) {
  66. MFnMesh mesh(path);
  67. MItMeshPolygon polyIt(path);
  68. // name
  69. char name[128];
  70. memset(name,0,sizeof(name));
  71. strcpy(name,mesh.name().asChar());
  72. int l = strlen(name);
  73. if(l > 5 && !strcmp(name + l - 5,"Shape")) memset(name + l - 5,0,5);
  74. fwrite(name,sizeof(name),1,file);
  75. // number of vertexes
  76. int num_vertex = 0;
  77. for(; !polyIt.isDone(); polyIt.next()) {
  78. for(int i = 0; i < polyIt.polygonVertexCount(); i++) {
  79. if(i > 2) num_vertex += 2;
  80. num_vertex++;
  81. }
  82. }
  83. polyIt.reset();
  84. Vertex *vertex = new Vertex[num_vertex];
  85. #define EXPORT(i) { 
  86. MPoint v; 
  87. v = polyIt.point(i,MSpace::kWorld); 
  88. vertex[num_vertex].xyz[0] = v.x; 
  89. vertex[num_vertex].xyz[1] = v.z; 
  90. vertex[num_vertex].xyz[2] = v.y; 
  91. MVector n; 
  92. polyIt.getNormal(i,n,MSpace::kWorld); 
  93. vertex[num_vertex].normal[0] = n.x; 
  94. vertex[num_vertex].normal[1] = n.z; 
  95. vertex[num_vertex].normal[2] = n.y; 
  96. float2 texcoord; 
  97. polyIt.getUV(i,texcoord); 
  98. vertex[num_vertex].texcoord[0] = texcoord[0]; 
  99. vertex[num_vertex].texcoord[1] = 1.0f - texcoord[1]; 
  100. num_vertex++; 
  101. }
  102. // export
  103. num_vertex = 0;
  104. for(; !polyIt.isDone(); polyIt.next()) {
  105. for(int i = 0; i < polyIt.polygonVertexCount(); i++) {
  106. if(i > 2) {
  107. EXPORT(0)
  108. EXPORT(i - 1)
  109. }
  110. EXPORT(i)
  111. }
  112. }
  113. #undef EXPORT
  114. // flip triangles
  115. for(int i = 0; i < num_vertex; i += 3)  {
  116. Vertex v = vertex[i];
  117. vertex[i] = vertex[i + 1];
  118. vertex[i + 1] = v;
  119. }
  120. fwrite(&num_vertex,sizeof(int),1,file);
  121. fwrite(vertex,sizeof(Vertex),num_vertex,file);
  122. delete vertex;
  123. num_surfaces++;
  124. }
  125. /*
  126.  */
  127. MStatus MeshTranslator::writer(const MFileObject &name,const MString &optionsString,FileAccessMode mode) {
  128. file = fopen(name.fullName().asChar(),"wb");
  129. if(!file) {
  130. fprintf(stderr,"MeshTranslator::writer(): can`t create "%s" filen",name.fullName().asChar());
  131. return MS::kFailure;
  132. }
  133. int magic = MESH_RAW_MAGIC;
  134. fwrite(&magic,sizeof(int),1,file);
  135. num_surfaces = 0;
  136. fwrite(&num_surfaces,sizeof(int),1,file);
  137. if(mode == MPxFileTranslator::kExportAccessMode || mode == MPxFileTranslator::kSaveAccessMode) {
  138. MItDag it(MItDag::kBreadthFirst,MFn::kInvalid);
  139. for(; !it.isDone(); it.next()) {
  140. MDagPath path;
  141. it.getPath(path);
  142. MFnDagNode node(path);
  143. if(node.isIntermediateObject()) continue;
  144. if(path.hasFn(MFn::kNurbsSurface)) {
  145. fprintf(stderr,"MeshTranslator::writer(): skipping nurbs surfacen");
  146. continue;
  147. }
  148. if(path.hasFn(MFn::kMesh) && path.hasFn(MFn::kTransform)) continue;
  149. if(path.hasFn(MFn::kMesh)) exportMesh(path);
  150. }
  151. } else if(mode == MPxFileTranslator::kExportActiveAccessMode) {
  152. MSelectionList slist;
  153. MGlobal::getActiveSelectionList(slist);
  154. MItSelectionList selection(slist);
  155. if(selection.isDone()) {
  156. fprintf(stderr,"MeshTranslator::writer(): nothing is selectedn");
  157. return MS::kFailure;
  158. }
  159. MItDag it(MItDag::kDepthFirst,MFn::kInvalid);
  160. for(; !selection.isDone(); selection.next()) {
  161. MDagPath path;
  162. selection.getDagPath(path);
  163. it.reset(path.node(),MItDag::kDepthFirst,MFn::kInvalid);
  164. for(; !it.isDone(); it.next()) {
  165. MDagPath path;
  166. it.getPath(path);
  167. MFnDagNode node(path);
  168. if(node.isIntermediateObject()) continue;
  169. if(path.hasFn(MFn::kNurbsSurface)) {
  170. fprintf(stderr,"MeshTranslator::writer(): skipping nurbs surfacen");
  171. continue;
  172. }
  173. if(path.hasFn(MFn::kMesh) && path.hasFn(MFn::kTransform)) continue;
  174. if(path.hasFn(MFn::kMesh)) exportMesh(path);
  175. }
  176. }
  177. }
  178. fseek(file,sizeof(int),SEEK_SET);
  179. fwrite(&num_surfaces,sizeof(int),1,file);
  180. fclose(file);
  181. return MS::kSuccess;
  182. }
  183. /*
  184.  */
  185. MPxFileTranslator::MFileKind MeshTranslator::identifyFile(const MFileObject& fileName,const char* buffer,short size) const {
  186. const char *name = fileName.name().asChar();
  187. int length = strlen(name);
  188. if(length > 5 && !strcasecmp(name + length - 5,".mesh")) return kCouldBeMyFileType;
  189. return kNotMyFileType;
  190. }
  191. /*****************************************************************************/
  192. /*                                                                           */
  193. /* register/deregister                                                       */
  194. /*                                                                           */
  195. /*****************************************************************************/
  196. MStatus initializePlugin(MObject obj) {
  197. MFnPlugin plugin(obj,"http://frustum.org/","1.0","Any");
  198. return plugin.registerFileTranslator("MeshExport","none",MeshTranslator::creator);
  199. }
  200. MStatus uninitializePlugin(MObject obj) {
  201. MFnPlugin plugin(obj);
  202. return plugin.deregisterFileTranslator("MeshExport");
  203. }