ROP_RENDER_CODE ROP_DopField::renderFrame(fpreal time, UT_Interrupt *) { OP_Node *op; DOP_Parent *dopparent; UT_String doppath, savepath; UT_String dopobject, dopdata; if( !executePreFrameScript(time) ) return ROP_ABORT_RENDER; DOPPATH(doppath, time); if( !doppath.isstring() ) { addError(ROP_MESSAGE, "Invalid DOP path"); return ROP_ABORT_RENDER; } op = findNode(doppath); if (!op) { addError(ROP_COOK_ERROR, (const char *)doppath); return ROP_ABORT_RENDER; } dopparent = op ? op->castToDOPParent() : 0; if( !dopparent ) { addError(ROP_COOK_ERROR, (const char *)doppath); return ROP_ABORT_RENDER; } DOPOBJECT(dopobject, time); DOPDATA(dopdata, time); OUTPUT(savepath, time); time = DOPsetBestTime(dopparent, time); OP_Context context(time); const SIM_Object *object; object = dopparent->findObjectFromString(dopobject, 0, 0, time); if (!object) { addError(ROP_COOK_ERROR, (const char *)dopobject); return ROP_ABORT_RENDER; } const SIM_Data *data; data = object->getConstNamedSubData(dopdata); if (!data) { addError(ROP_COOK_ERROR, (const char *) dopdata); return ROP_ABORT_RENDER; } // Create our GDP. GU_Detail *gdp = new GU_Detail(); const SIM_ScalarField *scalarfield = SIM_DATA_CASTCONST(data, SIM_ScalarField); if (scalarfield) { addField(gdp, scalarfield->getField()); } const SIM_VectorField *vectorfield = SIM_DATA_CASTCONST(data, SIM_VectorField); if (vectorfield) { for (int i = 0; i < 3; i++) { addField(gdp, vectorfield->getField(i)); } } const SIM_MatrixField *matrixfield = SIM_DATA_CASTCONST(data, SIM_MatrixField); if (matrixfield) { for (int i = 0; i < 3; i++) for (int j = 0; j < 3; j++) { addField(gdp, matrixfield->getField(i, j)); } } if (!gdp->save((const char *)savepath, 0, 0).success()) { addError(ROP_SAVE_ERROR, (const char *)savepath); return ROP_ABORT_RENDER; } // DO NOT delete gdp if we are stealing the voxels! // delete gdp; if (ALFPROGRESS() && (myEndTime != myStartTime)) { fpreal fpercent = (time - myStartTime) / (myEndTime - myStartTime); int percent = (int)SYSrint(fpercent * 100); percent = SYSclamp(percent, 0, 100); fprintf(stdout, "ALF_PROGRESS %d%%\n", percent); fflush(stdout); } if (error() < UT_ERROR_ABORT) { if( !executePostFrameScript(time) ) return ROP_ABORT_RENDER; } return ROP_CONTINUE_RENDER; }