/* Prints a fatal error message and adds file and line number, then terminates. */ int ErrorAt(const char *filename, long line, unsigned long offset, const char *format, ...) { va_list marker; POVMSObject msg; char localvsbuffer[1024]; sprintf(localvsbuffer, "%s Error: ", Stage_Names[STAGE_PARSING].stage_name); va_start(marker, format); vsnprintf(localvsbuffer + strlen(localvsbuffer), 1023 - strlen(localvsbuffer), format, marker); va_end(marker); CleanupString(localvsbuffer); (void)POVMSObject_New(&msg, kPOVObjectClass_FileLoc); (void)POVMSUtil_SetString(&msg, kPOVAttrib_FileName, filename); (void)POVMSUtil_SetInt(&msg, kPOVAttrib_Line, line); (void)POVMSUtil_SetInt(&msg, kPOVAttrib_Column, 0); (void)POVMSUtil_SetLong(&msg, kPOVAttrib_FilePosition, offset); (void)POVMSUtil_SetString(&msg, kPOVAttrib_EnglishText, localvsbuffer); (void)POVMSUtil_SetInt(&msg, kPOVAttrib_Error, 0); (void)POVMSMsg_SetupMessage(&msg, kPOVMsgClass_RenderOutput, kPOVMsgIdent_FatalError); (void)POVMSMsg_SetDestinationAddress(&msg, FRONTEND_ADDRESS); (void)POVMS_Send(POVMS_Render_Context, &msg, NULL, kPOVMSSendMode_NoReply); Terminate_Tokenizer(); /* Closes scene file */ POV_SHELLOUT(FATAL_SHL); povray_exit(1); return 0; }
/* Prints a fatal error message and adds file and line number if parsing, then terminates. */ int Error(const char *format,...) { va_list marker; POVMSObject msg; char localvsbuffer[1024]; sprintf(localvsbuffer, "%s Error: ", Stage_Names[Stage].stage_name); va_start(marker, format); vsnprintf(localvsbuffer + strlen(localvsbuffer), 1023 - strlen(localvsbuffer), format, marker); va_end(marker); CleanupString(localvsbuffer); if((Stage == STAGE_PARSING) || (Stage == STAGE_INCLUDE_ERR) || (Stage == STAGE_FOUND_INSTEAD)) { (void)POVMSObject_New(&msg, kPOVObjectClass_FileLoc); Where_Error(&msg); (void)POVMSUtil_SetString(&msg, kPOVAttrib_EnglishText, localvsbuffer); (void)POVMSUtil_SetInt(&msg, kPOVAttrib_Error, 0); (void)POVMSMsg_SetupMessage(&msg, kPOVMsgClass_RenderOutput, kPOVMsgIdent_FatalError); (void)POVMSMsg_SetDestinationAddress(&msg, FRONTEND_ADDRESS); (void)POVMS_Send(POVMS_Render_Context, &msg, NULL, kPOVMSSendMode_NoReply); } else { (void)POVMSObject_New(&msg, kPOVObjectClass_FileLoc); (void)POVMSUtil_SetString(&msg, kPOVAttrib_EnglishText, localvsbuffer); (void)POVMSUtil_SetInt(&msg, kPOVAttrib_Error, 0); (void)POVMSMsg_SetupMessage(&msg, kPOVMsgClass_RenderOutput, kPOVMsgIdent_FatalError); (void)POVMSMsg_SetDestinationAddress(&msg, FRONTEND_ADDRESS); (void)POVMS_Send(POVMS_Render_Context, &msg, NULL, kPOVMSSendMode_NoReply); } /* This could be just an "if" but we may add special messages later */ if(Stage == STAGE_INCLUDE_ERR) { Warning(0, "Check that the file is in a directory specifed with a +L switch\n" "or 'Library_Path=' .INI item. Standard include files are in the\n" "include directory or folder. Please read your documentation carefully."); } Terminate_Tokenizer(); /* Closes scene file */ POV_SHELLOUT(FATAL_SHL); povray_exit(1); return 0; }
int BuildParseStatistics(POVMSObjectPtr msg) { int err = kNoErr; if(err == kNoErr) err = POVMSUtil_SetInt(msg, kPOVAttrib_FiniteObjects, numberOfFiniteObjects); if(err == kNoErr) err = POVMSUtil_SetInt(msg, kPOVAttrib_InfiniteObjects, numberOfInfiniteObjects); if(err == kNoErr) err = POVMSUtil_SetInt(msg, kPOVAttrib_LightSources, numberOfLightSources); return err; }
int ProcessOptions::Process_Switch(Cmd_Parser_Table *option, char *param, POVMSObjectPtr obj, bool is_on) { double floatval = 0.0; int intval = 0; int intval2 = 0; int err = 0; char chr = 0; if(option->is_switch != kPOVMSType_Null) { err = POVMSUtil_SetBool(obj, option->is_switch, is_on); if(err != kNoErr) return err; } switch(option->type) { case kPOVMSType_Int: if(sscanf(param, "%d", &intval) == 1) err = POVMSUtil_SetInt(obj, option->key, intval); else { ParseError("Integer parameter expected for switch '%s', found '%s'.", option->command, param); err = kParseErr; } break; case kPOVMSType_Float: if(sscanf(param, "%lf", &floatval) == 1) err = POVMSUtil_SetFloat(obj, option->key, floatval); else { ParseError("Floating-point parameter expected for switch '%s', found '%s'.", option->command, param); err = kParseErr; } break; case kPOVMSType_Bool: err = POVMSUtil_SetBool(obj, option->key, IsTrue(param)); break; case kPOVObjectClass_File: // make the file object if(err == kNoErr) err = POVMSUtil_SetString(obj, option->key, param); else { ParseError("File name or path parameter expected for switch '%s', found '%s'.", option->command, param); err = kParseErr; } break; case kPOVMSType_WildCard: err = ReadSpecialSwitchHandler(option, param, obj, is_on); break; case kPOVMSType_Null: break; default: err = kParseErr; break; } return err; }
void POVMS_Object::SetInt(POVMSType key, POVMSInt value) { int err; err = POVMSUtil_SetInt(&data, key, value); if(err != pov_base::kNoErr) throw POV_EXCEPTION_CODE(err); }
/* * Use this routine to display non-fatal warning message if * opts.Language_Version is greater than level parameter. */ int Warning(unsigned int level, const char *format,...) { va_list marker; POVMSObject msg; char localvsbuffer[1024]; sprintf(localvsbuffer, "%s Warning: ", Stage_Names[Stage].stage_name); va_start(marker, format); vsnprintf(localvsbuffer + strlen(localvsbuffer), 1023 - strlen(localvsbuffer), format, marker); va_end(marker); CleanupString(localvsbuffer); if((opts.Warning_Level < 5) || ((opts.Warning_Level < 10) && (level == 0))) return 0; if(level >= opts.Language_Version) return 0; if((Stage == STAGE_PARSING) || (Stage == STAGE_INCLUDE_ERR) || (Stage == STAGE_FOUND_INSTEAD)) { (void)POVMSObject_New(&msg, kPOVObjectClass_FileLoc); Where_Warning(&msg); (void)POVMSUtil_SetString(&msg, kPOVAttrib_EnglishText, localvsbuffer); (void)POVMSUtil_SetInt(&msg, kPOVAttrib_Warning, 0); (void)POVMSMsg_SetupMessage(&msg, kPOVMsgClass_RenderOutput, kPOVMsgIdent_Warning); (void)POVMSMsg_SetDestinationAddress(&msg, FRONTEND_ADDRESS); (void)POVMS_Send(POVMS_Render_Context, &msg, NULL, kPOVMSSendMode_NoReply); } else { (void)POVMSObject_New(&msg, kPOVObjectClass_FileLoc); (void)POVMSUtil_SetString(&msg, kPOVAttrib_EnglishText, localvsbuffer); (void)POVMSUtil_SetInt(&msg, kPOVAttrib_Warning, 0); (void)POVMSMsg_SetupMessage(&msg, kPOVMsgClass_RenderOutput, kPOVMsgIdent_Warning); (void)POVMSMsg_SetDestinationAddress(&msg, FRONTEND_ADDRESS); (void)POVMS_Send(POVMS_Render_Context, &msg, NULL, kPOVMSSendMode_NoReply); } Do_Cooperate(0); return 0; }
void POVMS_Object::SetInt(POVMSType key, POVMSInt value) { int err; err = POVMSUtil_SetInt(&data, key, value); if(err != kNoErr) throw err; }
void MessageFactory::WarningAt(unsigned int level, const UCS2 *filename, POV_LONG line, POV_LONG column, POV_LONG offset, const char *format, ...) { va_list marker; POVMSObject msg; char localvsbuffer[1024]; sprintf(localvsbuffer, "%s Warning: ", stageName); va_start(marker, format); vsnprintf(localvsbuffer + strlen(localvsbuffer), 1023 - strlen(localvsbuffer), format, marker); va_end(marker); CleanupString(localvsbuffer); if((warningLevel < 5) || ((warningLevel < 10) && (level == 0))) return; if(level >= languageVersion) return; (void)POVMSObject_New(&msg, kPOVObjectClass_ControlData); (void)POVMSUtil_SetUCS2String(&msg, kPOVAttrib_FileName, filename); (void)POVMSUtil_SetLong(&msg, kPOVAttrib_Line, line); (void)POVMSUtil_SetLong(&msg, kPOVAttrib_Column, column); (void)POVMSUtil_SetLong(&msg, kPOVAttrib_FilePosition, offset); (void)POVMSUtil_SetString(&msg, kPOVAttrib_EnglishText, localvsbuffer); (void)POVMSUtil_SetInt(&msg, kPOVAttrib_Warning, 0); if(viewId != 0) (void)POVMSUtil_SetInt(&msg, kPOVAttrib_ViewId, viewId); else (void)POVMSUtil_SetInt(&msg, kPOVAttrib_SceneId, sceneId); if(viewId != 0) (void)POVMSMsg_SetupMessage(&msg, kPOVMsgClass_ViewOutput, kPOVMsgIdent_Warning); else (void)POVMSMsg_SetupMessage(&msg, kPOVMsgClass_SceneOutput, kPOVMsgIdent_Warning); (void)POVMSMsg_SetSourceAddress(&msg, sourceAddress); (void)POVMSMsg_SetDestinationAddress(&msg, destinationAddress); (void)POVMS_Send(NULL, &msg, NULL, kPOVMSSendMode_NoReply); }
int BuildRenderTime(POVMSObjectPtr msg, POVMSType key, int parse, int photon, int render, int total) { POVMSObject obj; int err; err = POVMSObject_New(&obj, kPOVObjectClass_RTime); if(err == 0) err = POVMSUtil_SetInt(&obj, kPOVAttrib_ParseTime, parse); if(err == 0) err = POVMSUtil_SetInt(&obj, kPOVAttrib_PhotonTime, photon); if(err == 0) err = POVMSUtil_SetInt(&obj, kPOVAttrib_TraceTime, render); if(err == 0) err = POVMSUtil_SetInt(&obj, kPOVAttrib_TotalTime, total); if(err == 0) err = POVMSObject_Set(msg, &obj, key); return err; }
// filename defaults to NULL, and line, column, and offset default to -1 std::string MessageFactory::SendError(const char *format, va_list arglist, const UCS2 *filename, POV_LONG line, POV_LONG column, POV_LONG offset) { POVMSObject msg; char localvsbuffer[1024]; sprintf(localvsbuffer, "%s Error: ", stageName); vsnprintf(localvsbuffer + strlen(localvsbuffer), 1023 - strlen(localvsbuffer), format, arglist); CleanupString(localvsbuffer); (void)POVMSObject_New(&msg, kPOVObjectClass_ControlData); if (filename != NULL) (void)POVMSUtil_SetUCS2String(&msg, kPOVAttrib_FileName, filename); if (line != -1) (void)POVMSUtil_SetLong(&msg, kPOVAttrib_Line, line); if (column != -1) (void)POVMSUtil_SetLong(&msg, kPOVAttrib_Column, column); if (offset != -1) (void)POVMSUtil_SetLong(&msg, kPOVAttrib_FilePosition, offset); (void)POVMSUtil_SetString(&msg, kPOVAttrib_EnglishText, localvsbuffer); (void)POVMSUtil_SetInt(&msg, kPOVAttrib_Error, 0); if(viewId != 0) { (void)POVMSUtil_SetInt(&msg, kPOVAttrib_ViewId, viewId); (void)POVMSMsg_SetupMessage(&msg, kPOVMsgClass_ViewOutput, kPOVMsgIdent_FatalError); } else { (void)POVMSUtil_SetInt(&msg, kPOVAttrib_SceneId, sceneId); (void)POVMSMsg_SetupMessage(&msg, kPOVMsgClass_SceneOutput, kPOVMsgIdent_FatalError); } (void)POVMSMsg_SetSourceAddress(&msg, sourceAddress); (void)POVMSMsg_SetDestinationAddress(&msg, destinationAddress); (void)POVMS_Send(NULL, &msg, NULL, kPOVMSSendMode_NoReply); return std::string(localvsbuffer); }
int ProcessOptions::Process_INI_Option(INI_Parser_Table *option, char *param, POVMSObjectPtr obj) { double floatval = 0.0; int intval = 0; int intval2 = 0; int err = kNoErr; switch(option->type) { case kPOVMSType_Int: if(sscanf(param, "%d", &intval) == 1) err = POVMSUtil_SetInt(obj, option->key, intval); else { ParseError("Integer parameter expected for option '%s', found '%s'.", option->keyword, param); err = kParseErr; } break; case kPOVMSType_Float: if(sscanf(param, "%lf", &floatval) == 1) err = POVMSUtil_SetFloat(obj, option->key, floatval); else { ParseError("Floating-point parameter expected for option '%s', found '%s'.", option->keyword, param); err = kParseErr; } break; case kPOVMSType_Bool: err = POVMSUtil_SetBool(obj, option->key, IsTrue(param)); break; case kPOVObjectClass_File: // make the file object if(err == kNoErr) err = POVMSUtil_SetString(obj, option->key, param); else { ParseError("File name or path parameter expected for option '%s', found '%s'.", option->keyword, param); err = kParseErr; } break; case kPOVMSType_WildCard: err = ReadSpecialOptionHandler(option, param, obj); break; default: err = kParseErr; break; } return err; }
void MessageFactory::PossibleError(const char *format,...) { va_list marker; POVMSObject msg; char localvsbuffer[1024]; sprintf(localvsbuffer, "Possible %s Error: ", stageName); va_start(marker, format); vsnprintf(localvsbuffer + strlen(localvsbuffer), 1023 - strlen(localvsbuffer), format, marker); va_end(marker); CleanupString(localvsbuffer); if(warningLevel == 0) return; (void)POVMSObject_New(&msg, kPOVObjectClass_ControlData); (void)POVMSUtil_SetString(&msg, kPOVAttrib_EnglishText, localvsbuffer); (void)POVMSUtil_SetInt(&msg, kPOVAttrib_Error, 0); if(viewId != 0) (void)POVMSUtil_SetInt(&msg, kPOVAttrib_ViewId, viewId); else (void)POVMSUtil_SetInt(&msg, kPOVAttrib_SceneId, sceneId); if(viewId != 0) (void)POVMSMsg_SetupMessage(&msg, kPOVMsgClass_ViewOutput, kPOVMsgIdent_Error); else (void)POVMSMsg_SetupMessage(&msg, kPOVMsgClass_SceneOutput, kPOVMsgIdent_Error); (void)POVMSMsg_SetSourceAddress(&msg, sourceAddress); (void)POVMSMsg_SetDestinationAddress(&msg, destinationAddress); (void)POVMS_Send(NULL, &msg, NULL, kPOVMSSendMode_NoReply); }
/* Prints a non-fatal error message and adds file and line number */ int WarningAt(unsigned int level, const char *filename, long line, unsigned long offset, const char *format, ...) { va_list marker; POVMSObject msg; char localvsbuffer[1024]; sprintf(localvsbuffer, "%s Warning: ", Stage_Names[Stage].stage_name); va_start(marker, format); vsnprintf(localvsbuffer + strlen(localvsbuffer), 1023 - strlen(localvsbuffer), format, marker); va_end(marker); CleanupString(localvsbuffer); if((opts.Warning_Level < 5) || ((opts.Warning_Level < 10) && (level == 0))) return 0; if(level >= opts.Language_Version) return 0; (void)POVMSObject_New(&msg, kPOVObjectClass_FileLoc); (void)POVMSUtil_SetString(&msg, kPOVAttrib_FileName, filename); (void)POVMSUtil_SetInt(&msg, kPOVAttrib_Line, line); (void)POVMSUtil_SetInt(&msg, kPOVAttrib_Column, 0); (void)POVMSUtil_SetLong(&msg, kPOVAttrib_FilePosition, offset); (void)POVMSUtil_SetString(&msg, kPOVAttrib_EnglishText, localvsbuffer); (void)POVMSUtil_SetInt(&msg, kPOVAttrib_Warning, 0); (void)POVMSMsg_SetupMessage(&msg, kPOVMsgClass_RenderOutput, kPOVMsgIdent_FatalError); (void)POVMSMsg_SetDestinationAddress(&msg, FRONTEND_ADDRESS); (void)POVMS_Send(POVMS_Render_Context, &msg, NULL, kPOVMSSendMode_NoReply); Do_Cooperate(0); return 0; }
int BuildCommand(POVMSObjectPtr msg, POVMSType key, SHELLDATA *data) { POVMSObject obj; int err; err = POVMSObject_New(&obj, kPOVObjectClass_Command); if(err == 0) err = POVMSUtil_SetString(&obj, kPOVAttrib_CommandString, data->Command); if(err == 0) { int i; switch(data->Ret) { case IGNORE_RET: i = 'I'; break; case QUIT_RET: i = 'Q'; break; case USER_RET: i = 'U'; break; case FATAL_RET: i = 'F'; break; case SKIP_ONCE_RET: i = 'S'; break; case ALL_SKIP_RET: i = 'A'; break; } if(data->Inverse == true) i = -i; err = POVMSUtil_SetInt(&obj, kPOVAttrib_ReturnAction, i); } if(err == 0) err = POVMSObject_Set(msg, &obj, key); return err; }
int AddOIStatistic(POVMSAttributeListPtr list, int index, COUNTER *pstats) { POVMSObject obj; int err; err = POVMSObject_New(&obj, kPOVObjectClass_OIStat); if(err == kNoErr) err = POVMSUtil_SetString(&obj, kPOVAttrib_ObjectName, intersection_stats[index].infotext); if(err == kNoErr) err = POVMSUtil_SetInt(&obj, kPOVAttrib_ObjectID, intersection_stats[index].povms_id); if(err == kNoErr) err = POVMSUtil_SetLong(&obj, kPOVAttrib_ISectsTests, pstats[intersection_stats[index].stat_test_id]); if(err == kNoErr) err = POVMSUtil_SetLong(&obj, kPOVAttrib_ISectsSucceeded, pstats[intersection_stats[index].stat_suc_id]); if(err == kNoErr) err = POVMSAttrList_Append(list, &obj); return err; }
int ProcessRenderOptions::ReadSpecialOptionHandler(INI_Parser_Table *option, char *param, POVMSObjectPtr obj) { POVMSAttributeList list; double floatval = 0.0; int intval = 0; int intval2 = 0; int err = kNoErr; switch(option->key) { case kPOVAttrib_HistogramGridSizeX: if(sscanf(param, "%d.%d", &intval, &intval2) == 2) { err = POVMSUtil_SetInt(obj, kPOVAttrib_HistogramGridSizeX, intval); if(err == kNoErr) err = POVMSUtil_SetInt(obj, kPOVAttrib_HistogramGridSizeY, intval2); } else { ParseError("Invalid histogram grid size '%s'.", param); err = kParseErr; } break; case kPOVAttrib_Palette: case kPOVAttrib_VideoMode: while(isspace(*param)) param++; err = POVMSUtil_SetInt(obj, option->key, tolower(*param)); break; case kPOVAttrib_HistogramFileType: case kPOVAttrib_OutputFileType: while(isspace(*param)) param++; if(strchr(Output_File_Types, *param) == NULL) ParseError("Unrecognized output file format %c.", *param); err = POVMSUtil_SetInt(obj, option->key, tolower(*param)); break; case kPOVAttrib_IncludeIni: case kPOVAttrib_LibraryPath: POVMSAttribute attr; if(err == kNoErr) { // parse INI file (recursive) if(option->key == kPOVAttrib_IncludeIni) err = ParseFile(param, obj); // create list if it isn't there if(err == kNoErr) { if(POVMSObject_Exist(obj, option->key) == kFalseErr) err = POVMSAttrList_New(&list); else if(POVMSObject_Exist(obj, option->key) != kNoErr) err = kObjectAccessErr; else err = POVMSObject_Get(obj, &list, option->key); } } else { ParseError("File name or path parameter expected for option '%s', found '%s'.", option->keyword, param); err = kParseErr; } // add path or file to list if(err == kNoErr) err = POVMSAttr_New(&attr); if(err == kNoErr) { err = POVMSAttr_Set(&attr, kPOVMSType_CString, (void *)param, strlen(param) + 1); if(err == kNoErr) err = POVMSAttrList_Append(&list, &attr); else err = POVMSAttr_Delete(&attr); } if(err == kNoErr) err = POVMSObject_Set(obj, &list, option->key); break; case kPOVAttrib_Declare: POVMSObject decobj; // create list if it isn't there if(POVMSObject_Exist(obj, option->key) == kFalseErr) err = POVMSAttrList_New(&list); else if(POVMSObject_Exist(obj, option->key) != kNoErr) err = kObjectAccessErr; else err = POVMSObject_Get(obj, &list, option->key); // add value to list if(err == kNoErr) err = POVMSObject_New(&decobj, kPOVMSType_WildCard); if(err == kNoErr) { char *ptr = NULL; err = POVMSUtil_SetString(&decobj, kPOVAttrib_Identifier, strtok(param, "=")); if(err == kNoErr) { ptr = strtok(NULL, ""); if(ptr == NULL) err = kParseErr; } if(err == kNoErr) { if(strchr(ptr, '"') != NULL) { ptr = strchr(ptr, '"') + 1; strtok(ptr, "\""); err = POVMSUtil_SetString(&decobj, kPOVAttrib_Value, ptr); } else err = POVMSUtil_SetFloat(&decobj, kPOVAttrib_Value, atof(ptr)); } if(err == kNoErr) err = POVMSAttrList_Append(&list, &decobj); else err = POVMSObject_Delete(&decobj); } if(err == kNoErr) err = POVMSObject_Set(obj, &list, option->key); break; case kPOVAttrib_FatalErrorCommand: case kPOVAttrib_PostFrameCommand: case kPOVAttrib_PostSceneCommand: case kPOVAttrib_PreFrameCommand: case kPOVAttrib_PreSceneCommand: case kPOVAttrib_UserAbortCommand: POVMSObject cmdobj; if(POVMSObject_Exist(obj, option->key) == kNoErr) err = POVMSObject_Get(obj, &cmdobj, option->key); else err = POVMSObject_New(&cmdobj, kPOVMSType_WildCard); if(toupper(*(option->keyword + strlen(option->keyword) - 1)) == 'D') { if(err == kNoErr) err = POVMSUtil_SetString(&cmdobj, kPOVAttrib_CommandString, param); } else { if(err == kNoErr) { int i = 0; if((*param == '-') || (*param == '!')) i = tolower(*(param + 1)); else i = tolower(*param); err = POVMSUtil_SetInt(&cmdobj, kPOVAttrib_ReturnAction, i); } } if(err == kNoErr) err = POVMSObject_Set(obj, &cmdobj, option->key); break; } return err; }
int BuildRenderOptions(POVMSObjectPtr msg) { POVMSAttribute attr; int err = kNoErr; if(msg == NULL) return kParamErr; if(err == kNoErr) err = POVMSAttr_New(&attr); if(err == kNoErr) { err = POVMSAttr_Set(&attr, kPOVMSType_WildCard, (void *)(&opts.Preview_RefCon), sizeof(unsigned long)); if(err == kNoErr) err = POVMSObject_Set(msg, &attr, kPOVAttrib_PreviewRefCon); } if(err == kNoErr) err = POVMSUtil_SetInt(msg, kPOVAttrib_Height, Frame.Screen_Height); if(err == kNoErr) err = POVMSUtil_SetInt(msg, kPOVAttrib_Width, Frame.Screen_Width); if(err == kNoErr) { if (opts.First_Column == -1) err = POVMSUtil_SetFloat(msg, kPOVAttrib_StartColumn, opts.First_Column_Percent); else err = POVMSUtil_SetFloat(msg, kPOVAttrib_StartColumn, opts.First_Column); } if(err == kNoErr) { if (opts.Last_Column == -1) err = POVMSUtil_SetFloat(msg, kPOVAttrib_EndColumn, opts.Last_Column_Percent); else err = POVMSUtil_SetFloat(msg, kPOVAttrib_EndColumn, opts.Last_Column); } if(err == kNoErr) { if (opts.First_Line == -1) err = POVMSUtil_SetFloat(msg, kPOVAttrib_StartRow, opts.First_Line_Percent); else err = POVMSUtil_SetFloat(msg, kPOVAttrib_StartRow, opts.First_Line); } if(err == kNoErr) { if (opts.Last_Line == -1) err = POVMSUtil_SetFloat(msg, kPOVAttrib_EndRow, opts.Last_Line_Percent); else err = POVMSUtil_SetFloat(msg, kPOVAttrib_EndRow, opts.Last_Line); } if(err == kNoErr) err = POVMSUtil_SetBool(msg, kPOVAttrib_TestAbort, (opts.Options & EXITENABLE) != 0); if(err == kNoErr) err = POVMSUtil_SetInt(msg, kPOVAttrib_TestAbortCount, opts.Abort_Test_Counter); if(err == kNoErr) err = POVMSUtil_SetBool(msg, kPOVAttrib_ContinueTrace, (opts.Options & CONTINUE_TRACE) != 0); if(err == kNoErr) err = POVMSUtil_SetString(msg, kPOVAttrib_CreateIni, opts.Ini_Output_File_Name); if(err == kNoErr) err = POVMSUtil_SetFloat(msg, kPOVAttrib_Clock, opts.FrameSeq.Clock_Value); if(err == kNoErr) err = POVMSUtil_SetInt(msg, kPOVAttrib_InitialFrame, max(opts.FrameSeq.InitialFrame, 1)); if(err == kNoErr) err = POVMSUtil_SetInt(msg, kPOVAttrib_FinalFrame, max(opts.FrameSeq.FinalFrame, 1)); if(err == kNoErr) err = POVMSUtil_SetFloat(msg, kPOVAttrib_InitialClock, opts.FrameSeq.InitialClock); if(err == kNoErr) { if(opts.FrameSeq.FinalFrame <= 1) err = POVMSUtil_SetFloat(msg, kPOVAttrib_FinalClock, 1.0); else err = POVMSUtil_SetFloat(msg, kPOVAttrib_FinalClock, opts.FrameSeq.FinalClock); } if(err == kNoErr) err = POVMSUtil_SetInt(msg, kPOVAttrib_SubsetStartFrame, max(opts.FrameSeq.SubsetStartFrame, 1)); if(err == kNoErr) err = POVMSUtil_SetInt(msg, kPOVAttrib_SubsetEndFrame, max(opts.FrameSeq.SubsetEndFrame, 1)); if(err == kNoErr) err = POVMSUtil_SetBool(msg, kPOVAttrib_CyclicAnimation, (opts.Options & CYCLIC_ANIMATION) != 0); if(err == kNoErr) err = POVMSUtil_SetBool(msg, kPOVAttrib_FieldRender, opts.FrameSeq.Field_Render_Flag); if(err == kNoErr) err = POVMSUtil_SetBool(msg, kPOVAttrib_OddField, opts.FrameSeq.Odd_Field_Flag); if(err == kNoErr) err = POVMSUtil_SetBool(msg, kPOVAttrib_PauseWhenDone, (opts.Options & PROMPTEXIT) != 0); if(err == kNoErr) err = POVMSUtil_SetBool(msg, kPOVAttrib_Verbose, (opts.Options & VERBOSE) != 0); if(err == kNoErr) err = POVMSUtil_SetBool(msg, kPOVAttrib_DrawVistas, (opts.Options & USE_VISTA_DRAW) != 0); if(err == kNoErr) err = POVMSUtil_SetBool(msg, kPOVAttrib_Display, (opts.Options & DISPLAY) != 0); if(err == kNoErr) err = POVMSUtil_SetInt(msg, kPOVAttrib_VideoMode, opts.DisplayFormat); if(err == kNoErr) err = POVMSUtil_SetInt(msg, kPOVAttrib_Palette, opts.PaletteOption); if(err == kNoErr) err = POVMSUtil_SetFloat(msg, kPOVAttrib_DisplayGamma, opts.DisplayGamma); if(err == kNoErr) err = POVMSUtil_SetInt(msg, kPOVAttrib_PreviewStartSize, opts.PreviewGridSize_Start); if(err == kNoErr) err = POVMSUtil_SetInt(msg, kPOVAttrib_PreviewEndSize, opts.PreviewGridSize_End); if(err == kNoErr) err = POVMSUtil_SetBool(msg, kPOVAttrib_OutputToFile, (opts.Options & DISKWRITE) != 0); if(err == kNoErr) err = POVMSUtil_SetInt(msg, kPOVAttrib_OutputFileType, opts.OutputFormat); if(err == kNoErr) err = POVMSUtil_SetInt(msg, kPOVAttrib_Compression, opts.OutputQuality); if(err == kNoErr) err = POVMSUtil_SetBool(msg, kPOVAttrib_OutputAlpha, (opts.Options & OUTPUT_ALPHA) != 0); if(err == kNoErr) err = POVMSUtil_SetInt(msg, kPOVAttrib_BitsPerColor, opts.OutputQuality); if(err == kNoErr) err = POVMSUtil_SetString(msg, kPOVAttrib_OutputFile, opts.Output_File_Name); if(err == kNoErr) err = POVMSUtil_SetString(msg, kPOVAttrib_OutputPath, opts.Output_Path); #if PRECISION_TIMER_AVAILABLE if(err == kNoErr) err = POVMSUtil_SetBool(msg, kPOVAttrib_CreateHistogram, opts.histogram_on != 0); if(err == kNoErr) err = POVMSUtil_SetInt(msg, kPOVAttrib_HistogramFileType, opts.histogram_type); if(err == kNoErr) err = POVMSUtil_SetString(msg, kPOVAttrib_HistogramFile, opts.Histogram_File_Name); if(err == kNoErr) err = POVMSUtil_SetInt(msg, kPOVAttrib_HistogramGridSizeX, opts.histogram_x); if(err == kNoErr) err = POVMSUtil_SetInt(msg, kPOVAttrib_HistogramGridSizeY, opts.histogram_y); #endif /* PRECISION_TIMER_AVAILABLE */ if(err == kNoErr) err = BuildCommand(msg, kPOVAttrib_PreSceneCommand, &opts.Shellouts[PRE_SCENE_SHL]); if(err == kNoErr) err = BuildCommand(msg, kPOVAttrib_PreFrameCommand, &opts.Shellouts[PRE_FRAME_SHL]); if(err == kNoErr) err = BuildCommand(msg, kPOVAttrib_PostSceneCommand, &opts.Shellouts[POST_SCENE_SHL]); if(err == kNoErr) err = BuildCommand(msg, kPOVAttrib_PostFrameCommand, &opts.Shellouts[POST_FRAME_SHL]); if(err == kNoErr) err = BuildCommand(msg, kPOVAttrib_UserAbortCommand, &opts.Shellouts[USER_ABORT_SHL]); if(err == kNoErr) err = BuildCommand(msg, kPOVAttrib_FatalErrorCommand, &opts.Shellouts[FATAL_SHL]); if(err == kNoErr) err = POVMSUtil_SetString(msg, kPOVAttrib_InputFile, opts.Input_File_Name); if(err == kNoErr) { POVMSAttributeList list; err = POVMSAttrList_New(&list); if(err == kNoErr) { int ii; for(ii = 0; ii < opts.Library_Path_Index; ii++) { err = POVMSAttr_New(&attr); if(err == kNoErr) { err = POVMSAttr_Set(&attr, kPOVMSType_CString, opts.Library_Paths[ii], strlen(opts.Library_Paths[ii]) + 1); if(err == kNoErr) err = POVMSAttrList_Append(&list, &attr); else err = POVMSAttr_Delete(&attr); } } if(err == kNoErr) err = POVMSObject_Set(msg, &list, kPOVAttrib_LibraryPath); } } if(err == kNoErr) { POVMSFloat f = opts.Language_Version / 100.0; err = POVMSUtil_SetFloat(msg, kPOVAttrib_Version, f); } /* FIXME if(err == kNoErr) err = POVMSUtil_SetBool(msg, kPOVAttrib_DebugConsole, Stream_Info[DEBUG_STREAM]->console != NULL); if(err == kNoErr) err = POVMSUtil_SetBool(msg, kPOVAttrib_FatalConsole, Stream_Info[FATAL_STREAM]->console != NULL); if(err == kNoErr) err = POVMSUtil_SetBool(msg, kPOVAttrib_RenderConsole, Stream_Info[RENDER_STREAM]->console != NULL); if(err == kNoErr) err = POVMSUtil_SetBool(msg, kPOVAttrib_StatisticsConsole, Stream_Info[STATISTIC_STREAM]->console != NULL); if(err == kNoErr) err = POVMSUtil_SetBool(msg, kPOVAttrib_WarningConsole, Stream_Info[WARNING_STREAM]->console != NULL); if(err == kNoErr) err = POVMSUtil_SetBool(msg, kPOVAttrib_AllConsole, Stream_Info[ALL_STREAM]->console != NULL); if((err == kNoErr) && (Stream_Info[DEBUG_STREAM]->name != NULL)) err = POVMSUtil_SetString(msg, kPOVAttrib_DebugFile, Stream_Info[DEBUG_STREAM]->name); if((err == kNoErr) && (Stream_Info[FATAL_STREAM]->name != NULL)) err = POVMSUtil_SetString(msg, kPOVAttrib_FatalFile, Stream_Info[FATAL_STREAM]->name); if((err == kNoErr) && (Stream_Info[RENDER_STREAM]->name != NULL)) err = POVMSUtil_SetString(msg, kPOVAttrib_RenderFile, Stream_Info[RENDER_STREAM]->name); if((err == kNoErr) && (Stream_Info[STATISTIC_STREAM]->name != NULL)) err = POVMSUtil_SetString(msg, kPOVAttrib_StatisticsFile, Stream_Info[STATISTIC_STREAM]->name); if((err == kNoErr) && (Stream_Info[WARNING_STREAM]->name != NULL)) err = POVMSUtil_SetString(msg, kPOVAttrib_WarningFile, Stream_Info[WARNING_STREAM]->name); if((err == kNoErr) && (Stream_Info[ALL_STREAM]->name != NULL)) err = POVMSUtil_SetString(msg, kPOVAttrib_AllFile, Stream_Info[ALL_STREAM]->name); */ if(err == kNoErr) err = POVMSUtil_SetInt(msg, kPOVAttrib_Quality, opts.Quality); if(err == kNoErr) err = POVMSUtil_SetBool(msg, kPOVAttrib_Bounding, opts.Use_Slabs); if(err == kNoErr) err = POVMSUtil_SetInt(msg, kPOVAttrib_BoundingThreshold, opts.BBox_Threshold); if(err == kNoErr) err = POVMSUtil_SetBool(msg, kPOVAttrib_LightBuffer, (opts.Options & USE_LIGHT_BUFFER) != 0); if(err == kNoErr) err = POVMSUtil_SetBool(msg, kPOVAttrib_VistaBuffer, (opts.Options & USE_VISTA_BUFFER) != 0); if(err == kNoErr) err = POVMSUtil_SetBool(msg, kPOVAttrib_RemoveBounds, (opts.Options & REMOVE_BOUNDS) != 0); if(err == kNoErr) err = POVMSUtil_SetBool(msg, kPOVAttrib_SplitUnions, (opts.Options & SPLIT_UNION) != 0); if(err == kNoErr) err = POVMSUtil_SetBool(msg, kPOVAttrib_Antialias, (opts.Options & ANTIALIAS) != 0); if(err == kNoErr) err = POVMSUtil_SetInt(msg, kPOVAttrib_SamplingMethod, opts.Tracing_Method); if(err == kNoErr) err = POVMSUtil_SetFloat(msg, kPOVAttrib_AntialiasThreshold, opts.Antialias_Threshold); if(err == kNoErr) err = POVMSUtil_SetInt(msg, kPOVAttrib_AntialiasDepth, opts.AntialiasDepth); if(err == kNoErr) err = POVMSUtil_SetBool(msg, kPOVAttrib_Jitter, (opts.Options & JITTER) != 0); if(err == kNoErr) err = POVMSUtil_SetFloat(msg, kPOVAttrib_JitterAmount, opts.JitterScale); if(err == kNoErr) err = POVMSUtil_SetString(msg, kPOVAttrib_IncludeHeader, opts.Header_File_Name); return err; }
int BuildRenderStatistics(POVMSObjectPtr msg, COUNTER *pstats) { POVMSAttributeList list; int err = kNoErr; if(err == kNoErr) err = POVMSUtil_SetInt(msg, kPOVAttrib_Height, Frame.Screen_Height); if(err == kNoErr) err = POVMSUtil_SetInt(msg, kPOVAttrib_Width, Frame.Screen_Width); if(err == kNoErr) err = AddStatistic(msg, kPOVAttrib_Pixels, &pstats[Number_Of_Pixels]); if(err == kNoErr) err = AddStatistic(msg, kPOVAttrib_PixelSamples, &pstats[Number_Of_Samples]); if(err == kNoErr) err = AddStatistic(msg, kPOVAttrib_Rays, &pstats[Number_Of_Rays]); if(err == kNoErr) err = AddStatistic(msg, kPOVAttrib_RaysSaved, &pstats[ADC_Saves]); if(err == kNoErr) err = POVMSAttrList_New(&list); if(err == kNoErr) { int i; for(i = 0; intersection_stats[i].infotext != NULL; i++) { err = AddOIStatistic(&list, i, pstats); if(err != kNoErr) break; } } if(err == kNoErr) err = POVMSObject_Set(msg, &list, kPOVAttrib_ObjectIStats); if(err == kNoErr) err = AddStatistic(msg, kPOVAttrib_ShadowTest, &pstats[Shadow_Ray_Tests]); if(err == kNoErr) err = AddStatistic(msg, kPOVAttrib_ShadowTestSuc, &pstats[Shadow_Rays_Succeeded]); if(err == kNoErr) err = AddStatistic(msg, kPOVAttrib_IsoFindRoot, &pstats[Ray_IsoSurface_Find_Root]); if(err == kNoErr) err = AddStatistic(msg, kPOVAttrib_FunctionVMCalls, &pstats[Ray_Function_VM_Calls]); if(err == kNoErr) err = AddStatistic(msg, kPOVAttrib_FunctionVMInstrEst, &pstats[Ray_Function_VM_Instruction_Est]); if(err == kNoErr) err = AddStatistic(msg, kPOVAttrib_PolynomTest, &pstats[Polynomials_Tested]); if(err == kNoErr) err = AddStatistic(msg, kPOVAttrib_RootsEliminated, &pstats[Roots_Eliminated]); if(err == kNoErr) err = AddStatistic(msg, kPOVAttrib_CallsToNoise, &pstats[Calls_To_Noise]); if(err == kNoErr) err = AddStatistic(msg, kPOVAttrib_CallsToDNoise, &pstats[Calls_To_DNoise]); if(err == kNoErr) err = AddStatistic(msg, kPOVAttrib_MediaSamples, &pstats[Media_Samples]); if(err == kNoErr) err = AddStatistic(msg, kPOVAttrib_MediaIntervals, &pstats[Media_Intervals]); if(err == kNoErr) err = AddStatistic(msg, kPOVAttrib_ReflectedRays, &pstats[Reflected_Rays_Traced]); if(err == kNoErr) err = AddStatistic(msg, kPOVAttrib_InnerReflectedRays, &pstats[Internal_Reflected_Rays_Traced]); if(err == kNoErr) err = AddStatistic(msg, kPOVAttrib_RefractedRays, &pstats[Refracted_Rays_Traced]); if(err == kNoErr) err = AddStatistic(msg, kPOVAttrib_TransmittedRays, &pstats[Transmitted_Rays_Traced]); if(err == kNoErr) err = AddStatistic(msg, kPOVAttrib_IStackOverflow, &pstats[Istack_overflows]); #if defined(MEM_STATS) Long_To_Counter(mem_stats_smallest_alloc(), pstats[MemStat_Smallest_Alloc]); Long_To_Counter(mem_stats_largest_alloc(), pstats[MemStat_Largest_Alloc]); if(err == kNoErr) err = AddStatistic(msg, kPOVAttrib_MinAlloc, &pstats[MemStat_Smallest_Alloc]); if(err == kNoErr) err = AddStatistic(msg, kPOVAttrib_MaxAlloc, &pstats[MemStat_Largest_Alloc]); #if (MEM_STATS>=2) Long_To_Counter(mem_stats_total_allocs(), pstats[MemStat_Total_Allocs]); Long_To_Counter(mem_stats_total_frees(), pstats[MemStat_Total_Frees]); if(err == kNoErr) err = AddStatistic(msg, kPOVAttrib_CallsToAlloc, &pstats[MemStat_Total_Allocs]); if(err == kNoErr) err = AddStatistic(msg, kPOVAttrib_CallsToFree, &pstats[MemStat_Total_Frees]); #endif Long_To_Counter(mem_stats_largest_mem_usage(), pstats[MemStat_Largest_Mem_Usage]); if(err == kNoErr) err = AddStatistic(msg, kPOVAttrib_PeakMemoryUsage, &pstats[MemStat_Largest_Mem_Usage]); #endif if(err == kNoErr) err = POVMSUtil_SetInt(msg, kPOVAttrib_TraceLevel, Highest_Trace_Level); if(err == kNoErr) err = POVMSUtil_SetInt(msg, kPOVAttrib_MaxTraceLevel, Max_Trace_Level); if(err == kNoErr) err = POVMSUtil_SetInt(msg, kPOVAttrib_RadGatherCount, ra_gather_count); if(err == kNoErr) err = POVMSUtil_SetInt(msg, kPOVAttrib_RadReuseCount, ra_reuse_count); if(err == kNoErr) err = AddStatistic(msg, kPOVAttrib_PhotonsShot, &pstats[Number_Of_Photons_Shot]); if(err == kNoErr) err = AddStatistic(msg, kPOVAttrib_PhotonsStored, &pstats[Number_Of_Photons_Stored]); if(err == kNoErr) err = AddStatistic(msg, kPOVAttrib_GlobalPhotonsStored, &pstats[Number_Of_Global_Photons_Stored]); if(err == kNoErr) err = AddStatistic(msg, kPOVAttrib_MediaPhotonsStored, &pstats[Number_Of_Media_Photons_Stored]); if(err == kNoErr) err = AddStatistic(msg, kPOVAttrib_PhotonsPriQInsert, &pstats[Priority_Queue_Add]); if(err == kNoErr) err = AddStatistic(msg, kPOVAttrib_PhotonsPriQRemove, &pstats[Priority_Queue_Remove]); if(err == kNoErr) err = AddStatistic(msg, kPOVAttrib_GatherPerformedCnt, &pstats[Gather_Performed_Count]); if(err == kNoErr) err = AddStatistic(msg, kPOVAttrib_GatherExpandedCnt, &pstats[Gather_Expanded_Count]); return 0; }
int BuildProgress(POVMSObjectPtr msg, int progress) { int ret = kNoErr; DBL time_dif; STOP_TIME time_dif = TIME_ELAPSED ret = POVMSUtil_SetInt(msg, kPOVAttrib_TotalTime, int(time_dif)); switch(progress) { case kPOVList_Prog_CreatingBoundingSlabs: break; case kPOVList_Prog_CreatingVistaBuffer: break; case kPOVList_Prog_CreatingLightBuffers: break; case kPOVList_Prog_BuildingPhotonMaps: (void)POVMSUtil_SetInt(msg, kPOVAttrib_TotalPhotonCount, GetPhotonStat(kPOVAttrib_TotalPhotonCount)); (void)POVMSUtil_SetInt(msg, kPOVAttrib_ObjectPhotonCount, GetPhotonStat(kPOVAttrib_ObjectPhotonCount)); (void)POVMSUtil_SetInt(msg, kPOVAttrib_MediaPhotonCount, GetPhotonStat(kPOVAttrib_MediaPhotonCount)); (void)POVMSUtil_SetInt(msg, kPOVAttrib_PhotonXSamples, GetPhotonStat(kPOVAttrib_PhotonXSamples)); (void)POVMSUtil_SetInt(msg, kPOVAttrib_PhotonYSamples, GetPhotonStat(kPOVAttrib_PhotonYSamples)); break; case kPOVList_Prog_LoadingPhotonMaps: break; case kPOVList_Prog_SavingPhotonMaps: break; case kPOVList_Prog_SortingPhotons: (void)POVMSUtil_SetInt(msg, kPOVAttrib_CurrentPhotonCount, GetPhotonStat(kPOVAttrib_CurrentPhotonCount)); (void)POVMSUtil_SetInt(msg, kPOVAttrib_TotalPhotonCount, GetPhotonStat(kPOVAttrib_TotalPhotonCount)); break; case kPOVList_Prog_ReclaimingMemory: break; case kPOVList_Prog_WritingINIFile: break; case kPOVList_Prog_WritingHistogramFile: break; case kPOVList_Prog_PerformingShelloutCommand: break; case kPOVList_Prog_ResumingInterruptedTrace: break; case kPOVList_Prog_ProcessingFrame: (void)POVMSUtil_SetInt(msg, kPOVAttrib_CurrentFrame, opts.FrameSeq.FrameNumber - opts.FrameSeq.InitialFrame + 1); (void)POVMSUtil_SetInt(msg, kPOVAttrib_FrameCount, opts.FrameSeq.FinalFrame - opts.FrameSeq.InitialFrame + 1); (void)POVMSUtil_SetInt(msg, kPOVAttrib_AbsoluteCurFrame, opts.FrameSeq.FrameNumber); (void)POVMSUtil_SetFloat(msg, kPOVAttrib_FirstClock, opts.FrameSeq.InitialClock); (void)POVMSUtil_SetFloat(msg, kPOVAttrib_CurrentClock, opts.FrameSeq.Clock_Value); (void)POVMSUtil_SetFloat(msg, kPOVAttrib_LastClock, opts.FrameSeq.FinalClock); break; case kPOVList_Prog_Parsing: (void)POVMSUtil_SetLong(msg, kPOVAttrib_CurrentToken, Current_Token_Count); break; case kPOVList_Prog_Displaying: break; case kPOVList_Prog_Rendering: (void)POVMSUtil_SetInt(msg, kPOVAttrib_CurrentLine, Current_Line_Number - opts.First_Line + 1); (void)POVMSUtil_SetInt(msg, kPOVAttrib_AbsoluteCurrentLine, Current_Line_Number); (void)POVMSUtil_SetInt(msg, kPOVAttrib_LineCount, opts.Last_Line - opts.First_Line); if(MosaicPreviewSize > 1) (void)POVMSUtil_SetInt(msg, kPOVAttrib_MosaicPreviewSize, MosaicPreviewSize); else { if(opts.Options & ANTIALIAS) (void)POVMSUtil_SetInt(msg, kPOVAttrib_SuperSampleCount, SuperSampleCount); if(opts.Radiosity_Enabled) (void)POVMSUtil_SetInt(msg, kPOVAttrib_RadGatherCount, ra_gather_count - RadiosityCount); } break; case kPOVList_Prog_DoneTracing: break; case kPOVList_Prog_AbortingRender: break; case kPOVList_Prog_UserAbort: break; } return ret; }
int ProcessRenderOptions::ReadSpecialSwitchHandler(Cmd_Parser_Table *option, char *param, POVMSObjectPtr obj, bool) { int intval = 0; int intval2 = 0; int err = 0; char chr = 0; switch(option->key) { case kPOVAttrib_Display: if(param[0] != '\0') { err = POVMSUtil_SetInt(obj, kPOVAttrib_VideoMode, (int)toupper(param[0])); if((param[1] != '\0') && (err == 0)) err = POVMSUtil_SetInt(obj, kPOVAttrib_Palette, (int)toupper(param[1])); } break; case kPOVAttrib_HistogramGridSizeX: if(sscanf(param, "%d.%d", &intval, &intval2) == 2) { err = POVMSUtil_SetInt(obj, kPOVAttrib_HistogramGridSizeX, intval); if(err == kNoErr) err = POVMSUtil_SetInt(obj, kPOVAttrib_HistogramGridSizeY, intval2); } else { ParseError("Invalid histogram grid size '%s'.", param); err = kParseErr; } break; case kPOVAttrib_OutputFileType: if(strchr(Output_File_Types, *param) == NULL) ParseError("Unrecognized output file format %c.", *param); err = POVMSUtil_SetInt(obj, option->key, tolower(*param)); param++; if((err == kNoErr) && (*param > ' ')) { if(isdigit(*param) != 0) { if(sscanf(param, "%d", &intval) == 1) err = POVMSUtil_SetInt(obj, kPOVAttrib_BitsPerColor, intval); else { ParseError("Invalid bits per color '%s'.", param); err = kParseErr; } } else { ParseError("Missing bits per color, '%s' found instead.", param); err = kParseErr; } } break; case kPOVAttrib_HistogramFileType: if(strchr(Output_File_Types, *param) == NULL) { ParseError("Unrecognized output file format %c.", *param); err = kParseErr; } else { chr = tolower(*param); err = POVMSUtil_SetInt(obj, option->key, chr); } break; case kPOVAttrib_LibraryPath: POVMSAttributeList list; POVMSAttribute attr; if(err == kNoErr) { // create list if it isn't there if(POVMSObject_Exist(obj, option->key) == kFalseErr) err = POVMSAttrList_New(&list); else if(POVMSObject_Exist(obj, option->key) != kNoErr) err = kObjectAccessErr; else err = POVMSObject_Get(obj, &list, option->key); } else { ParseError("File name or path parameter expected for switch '%s', found '%s'.", option->command, param); err = kParseErr; } // add path or file to list if(err == kNoErr) err = POVMSAttr_New(&attr); if(err == kNoErr) { err = POVMSAttr_Set(&attr, kPOVMSType_CString, (void *)param, strlen(param) + 1); if(err == kNoErr) err = POVMSAttrList_Append(&list, &attr); else err = POVMSAttr_Delete(&attr); } if(err == kNoErr) err = POVMSObject_Set(obj, &list, option->key); break; case kPOVAttrib_TestAbortCount: if((*param) == 0) break; if(sscanf(param, "%d", &intval) == 1) err = POVMSUtil_SetInt(obj, option->key, intval); else { ParseError("No or integer parameter expected for switch '%s', found '%s'.", option->command, param); err = kParseErr; } break; } return err; }
// Sets the options to be used on the next render. Accepts a vfeRenderOptions // instance as its only parameter, and returns any one of a number of possible // error codes (and sets m_LastError), as documented below: // // vfeFailedToInitObject - this is an internal error // vfeFailedToSetMaxThreads - self-explanatory // vfeFailedToParseINI - an INI file specified could not be parsed // vfeFailedToSetSource - the source file specified could not be set // vfeFailedToParseCommand - a command-line option was invalid // vfeNoInputFile - no input file specified either directly or via INI // vfeRenderBlockSizeTooSmall - self-explanatory // vfeFailedToWriteINI - a request to write the render options to an INI file failed // vfeUnsupportedOptionCombination - unsupported option combination // // If vfeRenderOptions explicitly specifies a source file, it will override // any set via a parsed INI file. Furthermore, any source file set via a // command-line option overrides both of the above. // // Note that it is your responsibility to add any default INI files that should // be processed to the INI file list; neither SetOptions() nor any other part // of the VFE or POV-Ray code will do that for you. This includes non-platform // specific files such as a potential povray.ini in the CWD. int vfeSession::SetOptions (vfeRenderOptions& opts) { int err; UCS2 str [MAX_PATH]; POVMSObject obj; vfeProcessRenderOptions options(this); m_OutputToFileSet = false; m_UsingAlpha = false; m_RenderingAnimation = false; m_RealTimeRaytracing = false; m_ClocklessAnimation = false; m_RenderWidth = m_RenderHeight = 0; ClearOptions(); if ((err = POVMSObject_New (&obj, kPOVObjectClass_RenderOptions)) != kNoErr) return (m_LastError = vfeFailedToInitObject) ; if ((err = POVMSUtil_SetInt (&obj, kPOVAttrib_MaxRenderThreads, opts.m_ThreadCount)) != kNoErr) return (m_LastError = vfeFailedToSetMaxThreads) ; // we set this here for potential use by the IO permissions path checking code m_InputFilename = opts.m_SourceFile; // most likely povray.ini will be the first INI file processed here (as it's included by default) for (vector<UCS2String>::iterator i = opts.m_IniFiles.begin(); i != opts.m_IniFiles.end(); i++) { // we call TestAccessAllowed() here, even though ParseFile() will do it also, since if // access is denied, the reason will not be obvious (ParseFile() just returns kCannotOpenFileErr). if (!TestAccessAllowed (Path(*i), false)) return (m_LastError = vfeIORestrictionDeny); if ((err = options.ParseFile (UCS2toASCIIString(*i).c_str(), &obj)) != kNoErr) return (m_LastError = vfeFailedToParseINI) ; // we keep this up to date since the IO permissions feature will use the current input // filename to determine the path for default read/write permission in the scene dir. int n = sizeof (str) ; if ((err = POVMSUtil_GetUCS2String (&obj, kPOVAttrib_InputFile, str, &n)) == kNoErr) if (m_InputFilename != str) m_InputFilename = str; } // m_SourceFile overrides any source file set by the INI files if (opts.m_SourceFile.empty() == false) { m_InputFilename = opts.m_SourceFile; if ((err = POVMSUtil_SetUCS2String (&obj, kPOVAttrib_InputFile, opts.m_SourceFile.c_str())) != kNoErr) return (m_LastError = vfeFailedToSetSource); } // any source file set on the command-line overrides a source file set another way for (vector<string>::iterator i = opts.m_Commands.begin(); i != opts.m_Commands.end(); i++) { if ((err = options.ParseString (i->c_str(), &obj)) != kNoErr) return (m_LastError = vfeFailedToParseCommand) ; int n = sizeof (str) ; if ((err = POVMSUtil_GetUCS2String (&obj, kPOVAttrib_InputFile, str, &n)) == kNoErr) if (m_InputFilename != str) m_InputFilename = str; } int n = sizeof (str) ; if ((err = POVMSUtil_GetUCS2String (&obj, kPOVAttrib_InputFile, str, &n)) != kNoErr) return (m_LastError = vfeNoInputFile); m_InputFilename = str; POVMSUtil_GetInt (&obj, kPOVAttrib_Width, &m_RenderWidth) ; POVMSUtil_GetInt (&obj, kPOVAttrib_Height, &m_RenderHeight) ; std::list<Path> libpaths; POVMS_Object ropts (obj) ; if (ropts.Exist (kPOVAttrib_LibraryPath)) { POVMS_List pathlist; ropts.Get (kPOVAttrib_LibraryPath, pathlist) ; // we take the opportunity to remove any duplicates that are in the path list. // it's cleaner to do that here, rather than in the INI parser, since it's table- // driven and doesn't have an explicit function for adding library paths per se. // // we use the Path equivalence operator rather than a string compare since // using Path should handle platform-specific issues like case-sensitivity (or, // rather, lack thereof). note that at the time of writing, the Path class did // not yet implement case-insensitive comparisions. // // NB while it would of course be more efficient to sort the list so searches are // faster, we'd have to make a copy of it to do that, as we can't change the order // of existing entries (that would change the include path search order). it's not // common to have a lot of include paths, so we just use linear searches. for (int i = 1; i <= pathlist.GetListSize(); i++) { POVMS_Attribute lp; pathlist.GetNth(i, lp); Path path(lp.GetUCS2String()); if (find(libpaths.begin(), libpaths.end(), path) == libpaths.end()) libpaths.push_back(path); } } if (opts.m_LibraryPaths.empty() == false) { for (vector<UCS2String>::const_iterator i = opts.m_LibraryPaths.begin(); i != opts.m_LibraryPaths.end(); i++) { Path path(*i); if (find(libpaths.begin(), libpaths.end(), path) == libpaths.end()) libpaths.push_back(path); } } if (libpaths.empty() == false) { POVMS_List pathlist; for (list<Path>::iterator i = libpaths.begin(); i != libpaths.end(); i++) { POVMS_Attribute attr((*i)().c_str()); pathlist.Append(attr); } ropts.Set (kPOVAttrib_LibraryPath, pathlist) ; } if (ropts.TryGetBool(kPOVAttrib_RealTimeRaytracing, false) == true) ropts.SetBool(kPOVAttrib_OutputToFile, false); m_OutputToFileSet = ropts.TryGetBool(kPOVAttrib_OutputToFile, true); // this is a bit messy: Grayscale_Output or OutputAlpha may be specified // in an INI file or elsewhere prior to the output file type being set. // so we can't check to see if it is supported with that file type // until all options have been parsed. if (m_OutputToFileSet) { int oft = ropts.TryGetInt(kPOVAttrib_OutputFileType, DEFAULT_OUTPUT_FORMAT); bool has16BitGrayscale = false; bool hasAlpha = false; for (int i = 0; FileTypeTable[i].internalId != 0; i ++) { if (oft == FileTypeTable[i].internalId) { has16BitGrayscale = FileTypeTable[i].has16BitGrayscale; hasAlpha = FileTypeTable[i].hasAlpha; break; } } if (ropts.TryGetBool(kPOVAttrib_GrayscaleOutput, false) && !has16BitGrayscale) { AppendStatusMessage ("Grayscale output not currently supported with selected output file type."); AppendErrorMessage ("Grayscale output not currently supported with selected output file type.") ; return (m_LastError = vfeUnsupportedOptionCombination); } if (ropts.TryGetBool(kPOVAttrib_OutputAlpha, false) && !hasAlpha) { AppendWarningMessage ("Warning: Alpha channel output currently not (or not officially) supported with selected output file type.") ; } } if (ropts.TryGetInt(kPOVAttrib_RenderBlockSize, 32) < 4) return (m_LastError = vfeRenderBlockSizeTooSmall); if ((ropts.TryGetInt(kPOVAttrib_DisplayGammaType, DEFAULT_DISPLAY_GAMMA_TYPE) == kPOVList_GammaType_PowerLaw) && (ropts.TryGetFloat(kPOVAttrib_DisplayGamma, DEFAULT_DISPLAY_GAMMA) < 0.001f)) return (m_LastError = vfeDisplayGammaTooSmall); if ((ropts.TryGetInt(kPOVAttrib_FileGammaType, DEFAULT_FILE_GAMMA_TYPE) == kPOVList_GammaType_PowerLaw) && (ropts.TryGetFloat(kPOVAttrib_FileGamma, DEFAULT_FILE_GAMMA) < 0.001f)) return (m_LastError = vfeFileGammaTooSmall); n = sizeof (str) ; if ((err = POVMSUtil_GetUCS2String (&obj, kPOVAttrib_CreateIni, str, &n)) == kNoErr && str [0] != 0) if ((err = options.WriteFile (UCS2toASCIIString(str).c_str(), &obj)) != kNoErr) return (m_LastError = vfeFailedToWriteINI); opts.m_Options = ropts; m_RenderOptions = opts ; m_OptionsSet = true; return (m_LastError = vfeNoError) ; }