// Copyright 2013 Autodesk, Inc. All rights reserved. // // Use of this software is subject to the terms of the Autodesk // license agreement provided at the time of installation or download, // or which otherwise accompanies this software in either electronic // or hard copy form. #define DLLEXPORT #include #include #include #include "XgMtoaExtension.h" #include #ifdef _WIN32 #define PATH_SEPARATOR "\\" #else #define PATH_SEPARATOR "/" #endif //#define DEBUG_MTOA using namespace std; extern "C" { DLLEXPORT void initializeExtension(CExtension& extension) { MStatus status; extension.Requires("xgenToolkit"); status = extension.RegisterTranslator("xgmDescription", "", CXgDescriptionTranslator::creator, CXgDescriptionTranslator::NodeInitializer); } DLLEXPORT void deinitializeExtension(CExtension& extension) { } } AtNode* CXgDescriptionTranslator::CreateArnoldNodes() { //AiMsgInfo("[CXgDescriptionTranslator] CreateArnoldNodes()"); return AddArnoldNode("ginstance"); } void CXgDescriptionTranslator::Export(AtNode* instance) { //AiMsgInfo("[CXgDescriptionTranslator] Exporting %s", GetMayaNodeName().asChar()); Update(instance); } struct DescInfo { string strScene; string strPalette; string strDescription; vector vecPatches; float fFrame; bool bCameraOrtho; float fCameraPos[3]; float fCameraFOV; float fCameraInvMat[16]; float fCamRatio; float fBoundingBox[6]; void setBoundingBox( float xmin, float ymin, float zmin, float xmax, float ymax, float zmax ) { fBoundingBox[0] = xmin; fBoundingBox[1] = ymin; fBoundingBox[2] = zmin; fBoundingBox[3] = xmax; fBoundingBox[4] = ymax; fBoundingBox[5] = zmax; } void setCameraPos( float x, float y, float z ) { fCameraPos[0] = x; fCameraPos[1] = y; fCameraPos[2] = z; } void setCameraInvMat( float m00, float m01, float m02, float m03, float m10, float m11, float m12, float m13, float m20, float m21, float m22, float m23, float m30, float m31, float m32, float m33 ) { fCameraInvMat[ 0] = m00; fCameraInvMat[ 1] = m01; fCameraInvMat[ 2] = m02; fCameraInvMat[ 3] = m03; fCameraInvMat[ 4] = m10; fCameraInvMat[ 5] = m11; fCameraInvMat[ 6] = m12; fCameraInvMat[ 7] = m13; fCameraInvMat[ 8] = m20; fCameraInvMat[ 9] = m21; fCameraInvMat[10] = m22; fCameraInvMat[11] = m23; fCameraInvMat[12] = m30; fCameraInvMat[13] = m31; fCameraInvMat[14] = m32; fCameraInvMat[15] = m33; } }; void CXgDescriptionTranslator::Update(AtNode* instance) { //AiMsgInfo("[CXgDescriptionTranslator] Update()"); // Export the transform matrix ExportMatrix(instance, 0); // Get the visibiliy and render flags set. ProcessRenderFlags(instance); // Build the path to the procedural dso static string strDSO = string(getenv("MTOA_PATH")) + string("/procedurals/libXgArnoldProcedural.so"); // Get strings based on the current scene name. string strScenePath; // The path to the directory containing the scene. string strSceneFile; // The filename of the scene with the extension. string strSceneName; // The filename of the scene without the extension. { MString mstrCurrentScene; MGlobal::executeCommand("file -q -sn", mstrCurrentScene); #ifdef DEBUG_MTOA printf("mstrCurrentScene=%s\n",mstrCurrentScene.asChar() ); #endif MFileObject fo; fo.setRawFullName( mstrCurrentScene ); strScenePath = fo.resolvedPath().asChar(); strSceneFile = fo.resolvedName().asChar(); strSceneName = strSceneFile.substr( 0, strSceneFile.size()-3 ); } #ifdef DEBUG_MTOA printf("strDSO=%s\n",strDSO.c_str() ); printf("strScenePath=%s\n",strScenePath.c_str() ); printf("strSceneFile=%s\n",strSceneFile.c_str() ); printf("strSceneName=%s\n",strSceneName.c_str() ); #endif // Get current units string strUnitConvMat; float fUnitConvFactor = 1.f; { string strCurrentUnits; { MString mstrCurrentUnits; MGlobal::executeCommand("currentUnit -q -linear", mstrCurrentUnits); strCurrentUnits = mstrCurrentUnits.asChar(); } static map > s_mapUnitsConv; if( s_mapUnitsConv.empty() ) { s_mapUnitsConv["in"] = pair( "2.54", 2.54 ); s_mapUnitsConv["ft"] = pair( "30.48", 30.48 ); s_mapUnitsConv["yd"] = pair( "91.44", 91.44 ); s_mapUnitsConv["mi"] = pair( "160934.4", 160934.4 ); s_mapUnitsConv["mm"] = pair( "0.1", 0.1f ); s_mapUnitsConv["km"] = pair( "100000.0", 100000. ); s_mapUnitsConv["m"] = pair( "100.0", 100. ); s_mapUnitsConv["dm"] = pair( "10.0", 10. ); } string factor = "1"; map >::const_iterator it = s_mapUnitsConv.find( strCurrentUnits ); if( it!=s_mapUnitsConv.end() ) { factor = it->second.first; fUnitConvFactor = it->second.second; } strUnitConvMat = " -world "+factor+";0;0;0;0;"+factor+";0;0;0;0;"+factor+";0;0;0;0;1"; } // Extract description info from the current maya shape node. DescInfo info; { // Get Description and Palette from the dag paths. // The current dag path points to the desciption. // We get the parent to get the palette name. { MDagPath palDagPath = m_dagPath; palDagPath.pop(); palDagPath.pop(); info.strPalette = palDagPath.fullPathName().asChar(); info.strPalette = info.strPalette.substr( 1 ); #ifdef DEBUG_MTOA printf("strPalette=%s\n",info.strPalette.c_str() ); #endif MDagPath descDagPath = m_dagPath; descDagPath.pop(); info.strDescription = descDagPath.fullPathName().asChar(); info.strDescription = info.strDescription.substr( 1 + info.strPalette.size() + 1 ); #ifdef DEBUG_MTOA printf("strDescription=%s\n",info.strDescription.c_str() ); #endif unsigned int c = descDagPath.childCount(); for( unsigned int i=0; i