mirror of
https://github.com/scratchfoundation/bgfx.git
synced 2024-11-26 01:28:22 -05:00
197 lines
8.9 KiB
Python
197 lines
8.9 KiB
Python
|
"""
|
||
|
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
|