void exportF3d::setF3dField(MFnFluid &fluidFn, const char *outputPath, const MDagPath &dagPath) { try { MStatus stat; unsigned int i, xres = 0, yres = 0, zres = 0; double xdim,ydim,zdim; // Get the resolution of the fluid container stat = fluidFn.getResolution(xres, yres, zres); stat = fluidFn.getDimensions(xdim, ydim, zdim); V3d size(xdim,ydim,zdim); const V3i res(xres, yres, zres); int psizeTot = fluidFn.gridSize(); /// get the transform and rotation MObject parentObj = fluidFn.parent(0, &stat); if (stat != MS::kSuccess) { MGlobal::displayError("Can't find fluid's parent node"); return; } MDagPath parentPath = dagPath; parentPath.pop(); MTransformationMatrix tmatFn(dagPath.inclusiveMatrix()); if (stat != MS::kSuccess) { MGlobal::displayError("Failed to get transformation matrix of fluid's parent node"); return; } MFnTransform fnXform(parentPath, &stat); if (stat != MS::kSuccess) { MGlobal::displayError("Can't create a MFnTransform from fluid's parent node"); return; } if (m_verbose) { fprintf(stderr, "cellnum: %dx%dx%d = %d\n", xres, yres, zres,psizeTot); } float *density(NULL), *temp(NULL), *fuel(NULL); float *pressure(NULL), *falloff(NULL); density = fluidFn.density( &stat ); if ( stat.error() ) m_density = false; temp = fluidFn.temperature( &stat ); if ( stat.error() ) m_temperature = false; fuel = fluidFn.fuel( &stat ); if ( stat.error() ) m_fuel = false; pressure= fluidFn.pressure( &stat ); if ( stat.error() ) m_pressure = false; falloff = fluidFn.falloff( &stat ); if ( stat.error() ) m_falloff = false; float *r,*g,*b; if (m_color) { stat = fluidFn.getColors(r,b,g); if ( stat.error() ) m_color = false; }else m_color = false; float *u,*v,*w; if (m_texture) { stat = fluidFn.getCoordinates(u,v,w); if ( stat.error() ) m_texture = false; }else m_texture = false; /// velocity info float *Xvel(NULL),*Yvel(NULL), *Zvel(NULL); if (m_vel) { stat = fluidFn.getVelocity( Xvel,Yvel,Zvel ); if ( stat.error() ) m_vel = false; } if (m_density == false && m_temperature==false && m_fuel==false && m_pressure==false && m_falloff==false && m_vel == false && m_color == false && m_texture==false) { MGlobal::displayError("No fluid attributes found for writing, please check fluids settings"); return; } /// Fields DenseFieldf::Ptr densityFld, tempFld, fuelFld, pressureFld, falloffFld; DenseField3f::Ptr CdFld, uvwFld; MACField3f::Ptr vMac; MPlug autoResizePlug = fluidFn.findPlug("autoResize", &stat); bool autoResize; autoResizePlug.getValue(autoResize); // maya's fluid transformation V3d dynamicOffset(0); M44d localToWorld; MatrixFieldMapping::Ptr mapping(new MatrixFieldMapping()); M44d fluid_mat(tmatFn.asMatrix().matrix); if(autoResize) { fluidFn.findPlug("dofx").getValue(dynamicOffset[0]); fluidFn.findPlug("dofy").getValue(dynamicOffset[1]); fluidFn.findPlug("dofz").getValue(dynamicOffset[2]); } Box3i extents; extents.max = res - V3i(1); extents.min = V3i(0); mapping->setExtents(extents); localToWorld.setScale(size); localToWorld *= M44d().setTranslation( -(size*0.5) ); localToWorld *= M44d().setTranslation( dynamicOffset ); localToWorld *= fluid_mat; mapping->setLocalToWorld(localToWorld); if (m_density){ densityFld = new DenseFieldf; densityFld->setSize(res); densityFld->setMapping(mapping); } if (m_fuel){ fuelFld = new DenseFieldf; fuelFld->setSize(res); fuelFld->setMapping(mapping); } if (m_temperature){ tempFld = new DenseFieldf; tempFld->setSize(res); tempFld->setMapping(mapping); } if (m_pressure){ pressureFld = new DenseFieldf; pressureFld->setSize(res); pressureFld->setMapping(mapping); } if (m_falloff){ falloffFld = new DenseFieldf; falloffFld->setSize(res); falloffFld->setMapping(mapping); } if (m_vel){ vMac = new MACField3f; vMac->setSize(res); vMac->setMapping(mapping); } if (m_color){ CdFld = new DenseField3f; CdFld->setSize(res); CdFld->setMapping(mapping); } if (m_texture){ uvwFld = new DenseField3f; uvwFld->setSize(res); uvwFld->setMapping(mapping); } size_t iX, iY, iZ; for( iZ = 0; iZ < zres; iZ++ ) { for( iX = 0; iX < xres; iX++ ) { for( iY = 0; iY < yres ; iY++ ) { /// data is in x major but we are writting in z major order i = fluidFn.index( iX, iY, iZ); if ( m_density ) densityFld->lvalue(iX, iY, iZ) = density[i]; if ( m_temperature ) tempFld->lvalue(iX, iY, iZ) = temp[i]; if ( m_fuel ) fuelFld->lvalue(iX, iY, iZ) = fuel[i]; if ( m_pressure ) pressureFld->lvalue(iX, iY, iZ) = pressure[i]; if ( m_falloff ) falloffFld->lvalue(iX, iY, iZ) = falloff[i]; if (m_color) CdFld->lvalue(iX, iY, iZ) = V3f(r[i], g[i], b[i]); if (m_texture) uvwFld->lvalue(iX, iY, iZ) = V3f(u[i], v[i], w[i]); } } } if (m_vel) { unsigned x,y,z; for(z=0;z<zres;++z) for(y=0;y<yres;++y) for(x=0;x<xres+1;++x) { vMac->u(x,y,z) = *Xvel++; } for(z=0;z<zres;++z) for(y=0;y<yres+1;++y) for(x=0;x<xres;++x) { vMac->v(x,y,z) = *Yvel++; } for(z=0;z<zres+1;++z) for(y=0;y<yres;++y) for(x=0;x<xres;++x) { vMac->w(x,y,z) = *Zvel++; } } Field3DOutputFile out; if (!out.create(outputPath)) { MGlobal::displayError("Couldn't create file: "+ MString(outputPath)); return; } string fieldname("maya"); if (m_density){ out.writeScalarLayer<float>(fieldname, "density", densityFld); } if (m_fuel) { out.writeScalarLayer<float>(fieldname,"fuel", fuelFld); } if (m_temperature){ out.writeScalarLayer<float>(fieldname,"temperature", tempFld); } if (m_color) { out.writeVectorLayer<float>(fieldname,"Cd", CdFld); } if (m_vel) out.writeVectorLayer<float>(fieldname,"v_mac", vMac); out.close(); } catch(const std::exception &e) { MGlobal::displayError( MString(e.what()) ); return; } }