bgfx/3rdparty/openctm/plugins/maya/openctm_translator.py

197 lines
8.9 KiB
Python
Raw Normal View History

2012-10-07 23:41:18 -04:00
"""
OpenCTM Exporter for Maya.
"""
import maya.OpenMaya as OpenMaya
import maya.OpenMayaMPx as OpenMayaMPx
import maya.cmds as mc
import sys, math
import os
import ctypes
from ctypes import *
import openctm
__author__ = "Jonas Innala"
__version__ = "0.1"
kPluginTranslatorTypeName = "OpenCTM Exporter"
class OpemCTMExporter(OpenMayaMPx.MPxFileTranslator):
def __init__(self):
OpenMayaMPx.MPxFileTranslator.__init__(self)
def haveWriteMethod(self):
return True
def haveReadMethod(self):
return False
def filter(self):
return "*.ctm"
def defaultExtension(self):
return "ctm"
def writer( self, fileObject, optionString, accessMode ):
fileName = fileObject.fullName()
selection = OpenMaya.MSelectionList()
all = (accessMode == self.kExportAccessMode or accessMode == self.kSaveAccessMode)
dagIterator = None
if(all):
dagIterator = OpenMaya.MItDag(OpenMaya.MItDag.kBreadthFirst, OpenMaya.MFn.kGeometric)
else:
OpenMaya.MGlobal.getActiveSelectionList( selection )
dagIterator = OpenMaya.MItSelectionList ( selection, OpenMaya.MFn.kGeometric )
ctmindices = []
ctmvertices = []
ctmnormals = []
ctmtexcoords = []
indicesOffset = 0
while not dagIterator.isDone():
dagPath = OpenMaya.MDagPath()
if (all):
dagIterator.getPath(dagPath)
else:
dagIterator.getDagPath(dagPath)
fnMesh = None
try:
fnMesh = OpenMaya.MFnMesh( dagPath )
except:
dagIterator.next()
continue
meshPoints = OpenMaya.MPointArray()
fnMesh.getPoints( meshPoints,OpenMaya.MSpace.kWorld )
meshNormals = OpenMaya.MFloatVectorArray()
fnMesh.getNormals(meshNormals)
UVSets = []
fnMesh.getUVSetNames( UVSets )
u = OpenMaya.MFloatArray()
v = OpenMaya.MFloatArray()
fnMesh.getUVs( u, v, UVSets[0] )
iterPolys = OpenMaya.MItMeshPolygon( dagPath )
offset = 0
maxPoints = 0
normals = {}
uvs = {}
while not iterPolys.isDone():
if not iterPolys.hasValidTriangulation():
return OpenMaya.MStatus.kFailiure
uvSet = []
iterPolys.getUVSetNames(uvSet)
polygonVertices = OpenMaya.MIntArray()
iterPolys.getVertices( polygonVertices )
numTrianglesPx = OpenMaya.MScriptUtil()
numTrianglesPx.createFromInt(0)
numTrianglesPtr = numTrianglesPx.asIntPtr()
iterPolys.numTriangles(numTrianglesPtr)
numTriangles = OpenMaya.MScriptUtil(numTrianglesPtr).asInt()
offset = len(ctmvertices)
localindices = []
for i in range( numTriangles ):
points = OpenMaya.MPointArray()
indices = OpenMaya.MIntArray()
iterPolys.getTriangle( i, points,indices)
ctmindices.append (indicesOffset)
indicesOffset += 1
ctmindices.append (indicesOffset)
indicesOffset += 1
ctmindices.append (indicesOffset)
indicesOffset += 1
localindices.append(int(indices[0]))
localindices.append(int(indices[1]))
localindices.append(int(indices[2]))
localIndex = []
for gt in range(indices.length()) :
for gv in range( polygonVertices.length() ):
if indices[gt] == polygonVertices[gv]:
localIndex.append( gv )
break
normals[int(indices[0])] = (float(meshNormals[iterPolys.normalIndex(localIndex[0])].x),float(meshNormals[iterPolys.normalIndex(localIndex[0])].y),float(meshNormals[iterPolys.normalIndex(localIndex[0])].z))
normals[int(indices[1])] = (float(meshNormals[iterPolys.normalIndex(localIndex[1])].x),float(meshNormals[iterPolys.normalIndex(localIndex[1])].y),float(meshNormals[iterPolys.normalIndex(localIndex[1])].z))
normals[int(indices[2])] = (float(meshNormals[iterPolys.normalIndex(localIndex[2])].x),float(meshNormals[iterPolys.normalIndex(localIndex[2])].y),float(meshNormals[iterPolys.normalIndex(localIndex[2])].z))
uvID = [0,0,0]
for vtxInPolygon in range(3):
uvIDPx = OpenMaya.MScriptUtil()
uvIDPx.createFromInt(0)
uvIDPtr = numTrianglesPx.asIntPtr()
iterPolys.getUVIndex( localIndex[vtxInPolygon], uvIDPtr, UVSets[0] )
uvID[vtxInPolygon] = OpenMaya.MScriptUtil(uvIDPtr).asInt()
if (iterPolys.hasUVs()):
uvs[int(indices[0])] = (u[uvID[0]], v[uvID[0]])
uvs[int(indices[1])] = (u[uvID[1]], v[uvID[1]])
uvs[int(indices[2])] = (u[uvID[2]], v[uvID[2]])
for i in localindices:
ctmvertices.append (float(meshPoints[i].x))
ctmvertices.append (float(meshPoints[i].y))
ctmvertices.append (float(meshPoints[i].z))
ctmnormals.append(normals[i][0])
ctmnormals.append(normals[i][1])
ctmnormals.append(normals[i][2])
if (iterPolys.hasUVs()):
ctmtexcoords.append(uvs[i][0])
ctmtexcoords.append(uvs[i][1])
iterPolys.next()
dagIterator.next()
pindices = cast((openctm.CTMuint * len(ctmindices))(), POINTER(openctm.CTMuint))
pvertices = cast((openctm.CTMfloat * len(ctmvertices))(), POINTER(openctm.CTMfloat))
pnormals = cast((openctm.CTMfloat * len(ctmnormals))(), POINTER(openctm.CTMfloat))
ptexcoords = cast((openctm.CTMfloat * len(ctmtexcoords))(), POINTER(openctm.CTMfloat))
for i in range(len(ctmindices)):
pindices[i] = openctm.CTMuint(ctmindices[i])
for i in range(len(ctmvertices)):
pvertices[i] = openctm.CTMfloat(ctmvertices[i])
pnormals[i] = openctm.CTMfloat(ctmnormals[i])
for i in range(len(ctmtexcoords)):
ptexcoords[i] = openctm.CTMfloat(ctmtexcoords[i])
context = openctm.ctmNewContext(openctm.CTM_EXPORT)
comment = "Exported with OpenCTM exporter using Maya " + OpenMaya.MGlobal.mayaVersion()
openctm.ctmFileComment(context, c_char_p(comment))
openctm.ctmDefineMesh(context, pvertices, openctm.CTMuint(len(ctmvertices)/3), pindices, openctm.CTMuint(len(ctmindices)/3), pnormals)
openctm.ctmAddUVMap (context, ptexcoords,c_char_p() , c_char_p())
openctm.ctmSave(context, c_char_p(fileName))
openctm.ctmFreeContext(context)
e = openctm.ctmGetError(context)
if e != 0:
s = openctm.ctmErrorString(e)
print s
return OpenMaya.MStatus.kFailiure
else:
return OpenMaya.MStatus.kSuccess
def reader( self, fileObject, optionString, accessMode ):
return OpenMaya.MStatus.kFailiure
def translatorCreator():
return OpenMayaMPx.asMPxPtr( OpemCTMExporter() )
def initializePlugin(mobject):
mplugin = OpenMayaMPx.MFnPlugin(mobject, "Autodesk", "10.0", "Any")
try:
mplugin.registerFileTranslator( kPluginTranslatorTypeName, None, translatorCreator )
except:
sys.stderr.write( "Failed to register command: %s\n" % kPluginTranslatorTypeName )
raise
def uninitializePlugin(mobject):
mplugin = OpenMayaMPx.MFnPlugin(mobject)
print "Plug-in OpenCTM Exporter uninitialized"
try:
mplugin.deregisterFileTranslator( kPluginTranslatorTypeName )
except:
sys.stderr.write( "Failed to unregister command: %s\n" % kPluginCmdName )
raise