1 /****************************************************************************
2  *               povmsend.cpp
3  *
4  * This module contains POVMS received message handling routines.
5  *
6  * from Persistence of Vision(tm) Ray Tracer version 3.6.
7  * Copyright 1991-2003 Persistence of Vision Team
8  * Copyright 2003-2004 Persistence of Vision Raytracer Pty. Ltd.
9  *---------------------------------------------------------------------------
10  * NOTICE: This source code file is provided so that users may experiment
11  * with enhancements to POV-Ray and to port the software to platforms other
12  * than those supported by the POV-Ray developers. There are strict rules
13  * regarding how you are permitted to use this file. These rules are contained
14  * in the distribution and derivative versions licenses which should have been
15  * provided with this file.
16  *
17  * These licences may be found online, linked from the end-user license
18  * agreement that is located at http://www.povray.org/povlegal.html
19  *---------------------------------------------------------------------------
20  * This program is based on the popular DKB raytracer version 2.12.
21  * DKBTrace was originally written by David K. Buck.
22  * DKBTrace Ver 2.0-2.12 were written by David K. Buck & Aaron A. Collins.
23  *---------------------------------------------------------------------------
24  * $File: //depot/povray/3.6-release/source/povmsend.cpp $
25  * $Revision: #3 $
26  * $Change: 3032 $
27  * $DateTime: 2004/08/02 18:43:41 $
28  * $Author: chrisc $
29  * $Log$
30  *****************************************************************************/
31 
32 #include <stdarg.h>
33 #include <float.h>
34 #include <algorithm>
35 
36 #include "frame.h"
37 #include "vector.h"
38 #include "parse.h"
39 #include "povray.h"
40 #include "tokenize.h"
41 #include "userio.h"
42 #include "userdisp.h"
43 #include "povms.h"
44 #include "povmsend.h"
45 #include "octree.h"
46 #include "radiosit.h"
47 #include "optout.h"
48 #include "pov_err.h"
49 #include "pov_util.h"
50 
51 #ifndef DONT_SHOW_IMAGE_LIB_VERSIONS
52 // these are needed for copyright notices and version numbers
53 #include "zlib.h"
54 #include "png.h"
55 #include "jversion.h"
56 
57 // Including tiffio.h causes the Windows compile to break. As all we need is the
58 // version function, we just declare it here.
59 //#define __STDC__
60 //#include "tiffio.h"
61 
62 extern "C" const char* TIFFGetVersion(void);
63 #endif
64 
65 /*****************************************************************************
66 * Global variables
67 ******************************************************************************/
68 
69 extern POVMSContext POVMS_Render_Context; // GLOBAL VARIABLE
70 
71 BEGIN_POV_NAMESPACE
72 
73 extern POVMSObject *gStartedStreamMessage; // GLOBAL VARIABLE
74 
75 extern const char *Extract_Version(const char *str);
76 extern int GetPhotonStat(POVMSType a);
77 
78 /*****************************************************************************
79 * Local preprocessor defines
80 ******************************************************************************/
81 
82 
83 /*****************************************************************************
84 * Local typedefs
85 ******************************************************************************/
86 
87 
88 /*****************************************************************************
89 * Local variables
90 ******************************************************************************/
91 
92 DBL Previous_t = 0; // GLOBAL VARIABLE
93 int Previous_tp = 0; // GLOBAL VARIABLE
94 int Previous_th = 0; // GLOBAL VARIABLE
95 int Previous_tr = 0; // GLOBAL VARIABLE
96 
97 
98 /*****************************************************************************
99 * Local functions
100 ******************************************************************************/
101 
102 int BuildCommand(POVMSObjectPtr msg, POVMSType key, SHELLDATA *data);
103 int BuildRenderTime(POVMSObjectPtr msg, POVMSType key, int parse, int photon, int render, int total);
104 int BuildParseStatistics(POVMSObjectPtr msg);
105 int BuildRenderStatistics(POVMSObjectPtr msg, COUNTER *pstats);
106 int BuildProgress(POVMSObjectPtr msg, int progress);
107 int AddStatistic(POVMSObjectPtr msg, POVMSType key, COUNTER *counter);
108 int AddOIStatistic(POVMSAttributeListPtr list, int index, COUNTER *pstats);
109 
110 
111 /*****************************************************************************
112 *
113 * FUNCTION
114 *
115 *   BuildCommand
116 *
117 * INPUT
118 *
119 * OUTPUT
120 *
121 * RETURNS
122 *
123 * AUTHOR
124 *
125 *   Thorsten Froehlich
126 *
127 * DESCRIPTION
128 *
129 *   -
130 *
131 * CHANGES
132 *
133 *   -
134 *
135 ******************************************************************************/
136 
BuildCommand(POVMSObjectPtr msg,POVMSType key,SHELLDATA * data)137 int BuildCommand(POVMSObjectPtr msg, POVMSType key, SHELLDATA *data)
138 {
139    POVMSObject obj;
140    int err;
141 
142    err = POVMSObject_New(&obj, kPOVObjectClass_Command);
143    if(err == 0)
144       err = POVMSUtil_SetString(&obj, kPOVAttrib_CommandString, data->Command);
145    if(err == 0)
146    {
147       int i;
148 
149       switch(data->Ret)
150       {
151          case IGNORE_RET:
152             i = 'I';
153             break;
154          case QUIT_RET:
155             i = 'Q';
156             break;
157          case USER_RET:
158             i = 'U';
159             break;
160          case FATAL_RET:
161             i = 'F';
162             break;
163          case SKIP_ONCE_RET:
164             i = 'S';
165             break;
166          case ALL_SKIP_RET:
167             i = 'A';
168             break;
169       }
170 
171       if(data->Inverse == true)
172          i = -i;
173 
174       err = POVMSUtil_SetInt(&obj, kPOVAttrib_ReturnAction, i);
175    }
176    if(err == 0)
177       err = POVMSObject_Set(msg, &obj, key);
178 
179    return err;
180 }
181 
182 
183 /*****************************************************************************
184 *
185 * FUNCTION
186 *
187 *   BuildRenderTime
188 *
189 * INPUT
190 *
191 * OUTPUT
192 *
193 * RETURNS
194 *
195 * AUTHOR
196 *
197 *   Thorsten Froehlich
198 *
199 * DESCRIPTION
200 *
201 *   -
202 *
203 * CHANGES
204 *
205 *   -
206 *
207 ******************************************************************************/
208 
BuildRenderTime(POVMSObjectPtr msg,POVMSType key,int parse,int photon,int render,int total)209 int BuildRenderTime(POVMSObjectPtr msg, POVMSType key, int parse, int photon, int render, int total)
210 {
211    POVMSObject obj;
212    int err;
213 
214    err = POVMSObject_New(&obj, kPOVObjectClass_RTime);
215    if(err == 0)
216       err = POVMSUtil_SetInt(&obj, kPOVAttrib_ParseTime, parse);
217    if(err == 0)
218       err = POVMSUtil_SetInt(&obj, kPOVAttrib_PhotonTime, photon);
219    if(err == 0)
220       err = POVMSUtil_SetInt(&obj, kPOVAttrib_TraceTime, render);
221    if(err == 0)
222       err = POVMSUtil_SetInt(&obj, kPOVAttrib_TotalTime, total);
223    if(err == 0)
224       err = POVMSObject_Set(msg, &obj, key);
225 
226    return err;
227 }
228 
229 
230 /*****************************************************************************
231 *
232 * FUNCTION
233 *
234 *   BuildRenderOptions
235 *
236 * INPUT
237 *
238 * OUTPUT
239 *
240 * RETURNS
241 *
242 * AUTHOR
243 *
244 *   Thorsten Froehlich
245 *
246 * DESCRIPTION
247 *
248 *   -
249 *
250 * CHANGES
251 *
252 *   -
253 *
254 ******************************************************************************/
255 
BuildRenderOptions(POVMSObjectPtr msg)256 int BuildRenderOptions(POVMSObjectPtr msg)
257 {
258    POVMSAttribute attr;
259    int err = kNoErr;
260 
261    if(msg == NULL)
262       return kParamErr;
263 
264    if(err == kNoErr)
265       err = POVMSAttr_New(&attr);
266    if(err == kNoErr)
267    {
268       err = POVMSAttr_Set(&attr, kPOVMSType_WildCard, (void *)(&opts.Preview_RefCon), sizeof(unsigned long));
269       if(err == kNoErr)
270          err = POVMSObject_Set(msg, &attr, kPOVAttrib_PreviewRefCon);
271    }
272    if(err == kNoErr)
273       err = POVMSUtil_SetInt(msg, kPOVAttrib_Height, Frame.Screen_Height);
274    if(err == kNoErr)
275       err = POVMSUtil_SetInt(msg, kPOVAttrib_Width, Frame.Screen_Width);
276    if(err == kNoErr)
277    {
278       if (opts.First_Column == -1)
279          err = POVMSUtil_SetFloat(msg, kPOVAttrib_StartColumn, opts.First_Column_Percent);
280       else
281          err = POVMSUtil_SetFloat(msg, kPOVAttrib_StartColumn, opts.First_Column);
282    }
283    if(err == kNoErr)
284    {
285       if (opts.Last_Column == -1)
286          err = POVMSUtil_SetFloat(msg, kPOVAttrib_EndColumn, opts.Last_Column_Percent);
287       else
288          err = POVMSUtil_SetFloat(msg, kPOVAttrib_EndColumn, opts.Last_Column);
289    }
290    if(err == kNoErr)
291    {
292       if (opts.First_Line == -1)
293          err = POVMSUtil_SetFloat(msg, kPOVAttrib_StartRow, opts.First_Line_Percent);
294       else
295          err = POVMSUtil_SetFloat(msg, kPOVAttrib_StartRow, opts.First_Line);
296    }
297    if(err == kNoErr)
298    {
299       if (opts.Last_Line == -1)
300          err = POVMSUtil_SetFloat(msg, kPOVAttrib_EndRow, opts.Last_Line_Percent);
301       else
302          err = POVMSUtil_SetFloat(msg, kPOVAttrib_EndRow, opts.Last_Line);
303    }
304    if(err == kNoErr)
305       err = POVMSUtil_SetBool(msg, kPOVAttrib_TestAbort, (opts.Options & EXITENABLE) != 0);
306    if(err == kNoErr)
307       err = POVMSUtil_SetInt(msg, kPOVAttrib_TestAbortCount, opts.Abort_Test_Counter);
308    if(err == kNoErr)
309       err = POVMSUtil_SetBool(msg, kPOVAttrib_ContinueTrace, (opts.Options & CONTINUE_TRACE) != 0);
310    if(err == kNoErr)
311       err = POVMSUtil_SetString(msg, kPOVAttrib_CreateIni, opts.Ini_Output_File_Name);
312    if(err == kNoErr)
313       err = POVMSUtil_SetFloat(msg, kPOVAttrib_Clock, opts.FrameSeq.Clock_Value);
314    if(err == kNoErr)
315       err = POVMSUtil_SetInt(msg, kPOVAttrib_InitialFrame, max(opts.FrameSeq.InitialFrame, 1));
316    if(err == kNoErr)
317       err = POVMSUtil_SetInt(msg, kPOVAttrib_FinalFrame, max(opts.FrameSeq.FinalFrame, 1));
318    if(err == kNoErr)
319       err = POVMSUtil_SetFloat(msg, kPOVAttrib_InitialClock, opts.FrameSeq.InitialClock);
320    if(err == kNoErr)
321    {
322       if(opts.FrameSeq.FinalFrame <= 1)
323          err = POVMSUtil_SetFloat(msg, kPOVAttrib_FinalClock, 1.0);
324       else
325          err = POVMSUtil_SetFloat(msg, kPOVAttrib_FinalClock, opts.FrameSeq.FinalClock);
326    }
327    if(err == kNoErr)
328       err = POVMSUtil_SetInt(msg, kPOVAttrib_SubsetStartFrame, max(opts.FrameSeq.SubsetStartFrame, 1));
329    if(err == kNoErr)
330       err = POVMSUtil_SetInt(msg, kPOVAttrib_SubsetEndFrame, max(opts.FrameSeq.SubsetEndFrame, 1));
331    if(err == kNoErr)
332       err = POVMSUtil_SetBool(msg, kPOVAttrib_CyclicAnimation, (opts.Options & CYCLIC_ANIMATION) != 0);
333    if(err == kNoErr)
334       err = POVMSUtil_SetBool(msg, kPOVAttrib_FieldRender, opts.FrameSeq.Field_Render_Flag);
335    if(err == kNoErr)
336       err = POVMSUtil_SetBool(msg, kPOVAttrib_OddField, opts.FrameSeq.Odd_Field_Flag);
337    if(err == kNoErr)
338       err = POVMSUtil_SetBool(msg, kPOVAttrib_PauseWhenDone, (opts.Options & PROMPTEXIT) != 0);
339    if(err == kNoErr)
340       err = POVMSUtil_SetBool(msg, kPOVAttrib_Verbose, (opts.Options & VERBOSE) != 0);
341    if(err == kNoErr)
342       err = POVMSUtil_SetBool(msg, kPOVAttrib_DrawVistas, (opts.Options & USE_VISTA_DRAW) != 0);
343    if(err == kNoErr)
344       err = POVMSUtil_SetBool(msg, kPOVAttrib_Display, (opts.Options & DISPLAY) != 0);
345    if(err == kNoErr)
346       err = POVMSUtil_SetInt(msg, kPOVAttrib_VideoMode, opts.DisplayFormat);
347    if(err == kNoErr)
348       err = POVMSUtil_SetInt(msg, kPOVAttrib_Palette, opts.PaletteOption);
349    if(err == kNoErr)
350       err = POVMSUtil_SetFloat(msg, kPOVAttrib_DisplayGamma, opts.DisplayGamma);
351    if(err == kNoErr)
352       err = POVMSUtil_SetInt(msg, kPOVAttrib_PreviewStartSize, opts.PreviewGridSize_Start);
353    if(err == kNoErr)
354       err = POVMSUtil_SetInt(msg, kPOVAttrib_PreviewEndSize, opts.PreviewGridSize_End);
355    if(err == kNoErr)
356       err = POVMSUtil_SetBool(msg, kPOVAttrib_OutputToFile, (opts.Options & DISKWRITE) != 0);
357    if(err == kNoErr)
358       err = POVMSUtil_SetInt(msg, kPOVAttrib_OutputFileType, opts.OutputFormat);
359    if(err == kNoErr)
360       err = POVMSUtil_SetInt(msg, kPOVAttrib_Compression, opts.OutputQuality);
361    if(err == kNoErr)
362       err = POVMSUtil_SetBool(msg, kPOVAttrib_OutputAlpha, (opts.Options & OUTPUT_ALPHA) != 0);
363    if(err == kNoErr)
364       err = POVMSUtil_SetInt(msg, kPOVAttrib_BitsPerColor, opts.OutputQuality);
365    if(err == kNoErr)
366       err = POVMSUtil_SetString(msg, kPOVAttrib_OutputFile, opts.Output_File_Name);
367    if(err == kNoErr)
368       err = POVMSUtil_SetString(msg, kPOVAttrib_OutputPath, opts.Output_Path);
369 #if PRECISION_TIMER_AVAILABLE
370    if(err == kNoErr)
371       err = POVMSUtil_SetBool(msg, kPOVAttrib_CreateHistogram, opts.histogram_on != 0);
372    if(err == kNoErr)
373       err = POVMSUtil_SetInt(msg, kPOVAttrib_HistogramFileType, opts.histogram_type);
374    if(err == kNoErr)
375       err = POVMSUtil_SetString(msg, kPOVAttrib_HistogramFile, opts.Histogram_File_Name);
376    if(err == kNoErr)
377       err = POVMSUtil_SetInt(msg, kPOVAttrib_HistogramGridSizeX, opts.histogram_x);
378    if(err == kNoErr)
379       err = POVMSUtil_SetInt(msg, kPOVAttrib_HistogramGridSizeY, opts.histogram_y);
380 #endif /* PRECISION_TIMER_AVAILABLE */
381    if(err == kNoErr)
382       err = BuildCommand(msg, kPOVAttrib_PreSceneCommand, &opts.Shellouts[PRE_SCENE_SHL]);
383    if(err == kNoErr)
384       err = BuildCommand(msg, kPOVAttrib_PreFrameCommand, &opts.Shellouts[PRE_FRAME_SHL]);
385    if(err == kNoErr)
386       err = BuildCommand(msg, kPOVAttrib_PostSceneCommand, &opts.Shellouts[POST_SCENE_SHL]);
387    if(err == kNoErr)
388       err = BuildCommand(msg, kPOVAttrib_PostFrameCommand, &opts.Shellouts[POST_FRAME_SHL]);
389    if(err == kNoErr)
390       err = BuildCommand(msg, kPOVAttrib_UserAbortCommand, &opts.Shellouts[USER_ABORT_SHL]);
391    if(err == kNoErr)
392       err = BuildCommand(msg, kPOVAttrib_FatalErrorCommand, &opts.Shellouts[FATAL_SHL]);
393    if(err == kNoErr)
394       err = POVMSUtil_SetString(msg, kPOVAttrib_InputFile, opts.Input_File_Name);
395    if(err == kNoErr)
396    {
397       POVMSAttributeList list;
398 
399       err = POVMSAttrList_New(&list);
400       if(err == kNoErr)
401       {
402          int ii;
403 
404          for(ii = 0; ii < opts.Library_Path_Index; ii++)
405          {
406             err = POVMSAttr_New(&attr);
407             if(err == kNoErr)
408             {
409                err = POVMSAttr_Set(&attr, kPOVMSType_CString, opts.Library_Paths[ii], strlen(opts.Library_Paths[ii]) + 1);
410                if(err == kNoErr)
411                   err = POVMSAttrList_Append(&list, &attr);
412                else
413                   err = POVMSAttr_Delete(&attr);
414             }
415          }
416          if(err == kNoErr)
417             err = POVMSObject_Set(msg, &list, kPOVAttrib_LibraryPath);
418       }
419    }
420    if(err == kNoErr)
421    {
422       POVMSFloat f = opts.Language_Version / 100.0;
423       err = POVMSUtil_SetFloat(msg, kPOVAttrib_Version, f);
424    }
425 /* FIXME
426    if(err == kNoErr)
427       err = POVMSUtil_SetBool(msg, kPOVAttrib_DebugConsole, Stream_Info[DEBUG_STREAM]->console != NULL);
428    if(err == kNoErr)
429       err = POVMSUtil_SetBool(msg, kPOVAttrib_FatalConsole, Stream_Info[FATAL_STREAM]->console != NULL);
430    if(err == kNoErr)
431       err = POVMSUtil_SetBool(msg, kPOVAttrib_RenderConsole, Stream_Info[RENDER_STREAM]->console != NULL);
432    if(err == kNoErr)
433       err = POVMSUtil_SetBool(msg, kPOVAttrib_StatisticsConsole, Stream_Info[STATISTIC_STREAM]->console != NULL);
434    if(err == kNoErr)
435       err = POVMSUtil_SetBool(msg, kPOVAttrib_WarningConsole, Stream_Info[WARNING_STREAM]->console != NULL);
436    if(err == kNoErr)
437       err = POVMSUtil_SetBool(msg, kPOVAttrib_AllConsole, Stream_Info[ALL_STREAM]->console != NULL);
438    if((err == kNoErr) && (Stream_Info[DEBUG_STREAM]->name != NULL))
439       err = POVMSUtil_SetString(msg, kPOVAttrib_DebugFile, Stream_Info[DEBUG_STREAM]->name);
440    if((err == kNoErr) && (Stream_Info[FATAL_STREAM]->name != NULL))
441       err = POVMSUtil_SetString(msg, kPOVAttrib_FatalFile, Stream_Info[FATAL_STREAM]->name);
442    if((err == kNoErr) && (Stream_Info[RENDER_STREAM]->name != NULL))
443       err = POVMSUtil_SetString(msg, kPOVAttrib_RenderFile, Stream_Info[RENDER_STREAM]->name);
444    if((err == kNoErr) && (Stream_Info[STATISTIC_STREAM]->name != NULL))
445       err = POVMSUtil_SetString(msg, kPOVAttrib_StatisticsFile, Stream_Info[STATISTIC_STREAM]->name);
446    if((err == kNoErr) && (Stream_Info[WARNING_STREAM]->name != NULL))
447       err = POVMSUtil_SetString(msg, kPOVAttrib_WarningFile, Stream_Info[WARNING_STREAM]->name);
448    if((err == kNoErr) && (Stream_Info[ALL_STREAM]->name != NULL))
449       err = POVMSUtil_SetString(msg, kPOVAttrib_AllFile, Stream_Info[ALL_STREAM]->name);
450 */   if(err == kNoErr)
451       err = POVMSUtil_SetInt(msg, kPOVAttrib_Quality, opts.Quality);
452    if(err == kNoErr)
453       err = POVMSUtil_SetBool(msg, kPOVAttrib_Bounding, opts.Use_Slabs);
454    if(err == kNoErr)
455       err = POVMSUtil_SetInt(msg, kPOVAttrib_BoundingThreshold, opts.BBox_Threshold);
456    if(err == kNoErr)
457       err = POVMSUtil_SetBool(msg, kPOVAttrib_LightBuffer, (opts.Options & USE_LIGHT_BUFFER) != 0);
458    if(err == kNoErr)
459       err = POVMSUtil_SetBool(msg, kPOVAttrib_VistaBuffer, (opts.Options & USE_VISTA_BUFFER) != 0);
460    if(err == kNoErr)
461       err = POVMSUtil_SetBool(msg, kPOVAttrib_RemoveBounds, (opts.Options & REMOVE_BOUNDS) != 0);
462    if(err == kNoErr)
463       err = POVMSUtil_SetBool(msg, kPOVAttrib_SplitUnions, (opts.Options & SPLIT_UNION) != 0);
464    if(err == kNoErr)
465       err = POVMSUtil_SetBool(msg, kPOVAttrib_Antialias, (opts.Options & ANTIALIAS) != 0);
466    if(err == kNoErr)
467       err = POVMSUtil_SetInt(msg, kPOVAttrib_SamplingMethod, opts.Tracing_Method);
468    if(err == kNoErr)
469       err = POVMSUtil_SetFloat(msg, kPOVAttrib_AntialiasThreshold, opts.Antialias_Threshold);
470    if(err == kNoErr)
471       err = POVMSUtil_SetInt(msg, kPOVAttrib_AntialiasDepth, opts.AntialiasDepth);
472    if(err == kNoErr)
473       err = POVMSUtil_SetBool(msg, kPOVAttrib_Jitter, (opts.Options & JITTER) != 0);
474    if(err == kNoErr)
475       err = POVMSUtil_SetFloat(msg, kPOVAttrib_JitterAmount, opts.JitterScale);
476    if(err == kNoErr)
477       err = POVMSUtil_SetString(msg, kPOVAttrib_IncludeHeader, opts.Header_File_Name);
478 
479    return err;
480 }
481 
482 
483 /*****************************************************************************
484 *
485 * FUNCTION
486 *
487 *   BuildRenderStatus
488 *
489 * INPUT
490 *
491 * OUTPUT
492 *
493 * RETURNS
494 *
495 * AUTHOR
496 *
497 *   Thorsten Froehlich
498 *
499 * DESCRIPTION
500 *
501 *   -
502 *
503 * CHANGES
504 *
505 *   -
506 *
507 ******************************************************************************/
508 
BuildParseStatistics(POVMSObjectPtr msg)509 int BuildParseStatistics(POVMSObjectPtr msg)
510 {
511    int err = kNoErr;
512 
513    if(err == kNoErr)
514       err = POVMSUtil_SetInt(msg, kPOVAttrib_FiniteObjects, numberOfFiniteObjects);
515    if(err == kNoErr)
516       err = POVMSUtil_SetInt(msg, kPOVAttrib_InfiniteObjects, numberOfInfiniteObjects);
517    if(err == kNoErr)
518       err = POVMSUtil_SetInt(msg, kPOVAttrib_LightSources, numberOfLightSources);
519 
520    return err;
521 }
522 
523 
524 /*****************************************************************************
525 *
526 * FUNCTION
527 *
528 *   BuildRenderStatistics
529 *
530 * INPUT
531 *
532 * OUTPUT
533 *
534 * RETURNS
535 *
536 * AUTHOR
537 *
538 *   Thorsten Froehlich
539 *
540 * DESCRIPTION
541 *
542 *   -
543 *
544 * CHANGES
545 *
546 *   -
547 *
548 ******************************************************************************/
549 
BuildRenderStatistics(POVMSObjectPtr msg,COUNTER * pstats)550 int BuildRenderStatistics(POVMSObjectPtr msg, COUNTER *pstats)
551 {
552    POVMSAttributeList list;
553    int err = kNoErr;
554 
555    if(err == kNoErr)
556       err = POVMSUtil_SetInt(msg, kPOVAttrib_Height, Frame.Screen_Height);
557    if(err == kNoErr)
558       err = POVMSUtil_SetInt(msg, kPOVAttrib_Width, Frame.Screen_Width);
559    if(err == kNoErr)
560       err = AddStatistic(msg, kPOVAttrib_Pixels, &pstats[Number_Of_Pixels]);
561    if(err == kNoErr)
562       err = AddStatistic(msg, kPOVAttrib_PixelSamples, &pstats[Number_Of_Samples]);
563    if(err == kNoErr)
564       err = AddStatistic(msg, kPOVAttrib_Rays, &pstats[Number_Of_Rays]);
565    if(err == kNoErr)
566       err = AddStatistic(msg, kPOVAttrib_RaysSaved, &pstats[ADC_Saves]);
567    if(err == kNoErr)
568       err = POVMSAttrList_New(&list);
569    if(err == kNoErr)
570    {
571       int i;
572 
573       for(i = 0; intersection_stats[i].infotext != NULL; i++)
574       {
575          err = AddOIStatistic(&list, i, pstats);
576          if(err != kNoErr)
577             break;
578       }
579    }
580    if(err == kNoErr)
581       err = POVMSObject_Set(msg, &list, kPOVAttrib_ObjectIStats);
582    if(err == kNoErr)
583       err = AddStatistic(msg, kPOVAttrib_ShadowTest, &pstats[Shadow_Ray_Tests]);
584    if(err == kNoErr)
585       err = AddStatistic(msg, kPOVAttrib_ShadowTestSuc, &pstats[Shadow_Rays_Succeeded]);
586    if(err == kNoErr)
587       err = AddStatistic(msg, kPOVAttrib_IsoFindRoot, &pstats[Ray_IsoSurface_Find_Root]);
588    if(err == kNoErr)
589       err = AddStatistic(msg, kPOVAttrib_FunctionVMCalls, &pstats[Ray_Function_VM_Calls]);
590    if(err == kNoErr)
591       err = AddStatistic(msg, kPOVAttrib_FunctionVMInstrEst, &pstats[Ray_Function_VM_Instruction_Est]);
592    if(err == kNoErr)
593       err = AddStatistic(msg, kPOVAttrib_PolynomTest, &pstats[Polynomials_Tested]);
594    if(err == kNoErr)
595       err = AddStatistic(msg, kPOVAttrib_RootsEliminated, &pstats[Roots_Eliminated]);
596    if(err == kNoErr)
597       err = AddStatistic(msg, kPOVAttrib_CallsToNoise, &pstats[Calls_To_Noise]);
598    if(err == kNoErr)
599       err = AddStatistic(msg, kPOVAttrib_CallsToDNoise, &pstats[Calls_To_DNoise]);
600    if(err == kNoErr)
601       err = AddStatistic(msg, kPOVAttrib_MediaSamples, &pstats[Media_Samples]);
602    if(err == kNoErr)
603       err = AddStatistic(msg, kPOVAttrib_MediaIntervals, &pstats[Media_Intervals]);
604    if(err == kNoErr)
605       err = AddStatistic(msg, kPOVAttrib_ReflectedRays, &pstats[Reflected_Rays_Traced]);
606    if(err == kNoErr)
607       err = AddStatistic(msg, kPOVAttrib_InnerReflectedRays, &pstats[Internal_Reflected_Rays_Traced]);
608    if(err == kNoErr)
609       err = AddStatistic(msg, kPOVAttrib_RefractedRays, &pstats[Refracted_Rays_Traced]);
610    if(err == kNoErr)
611       err = AddStatistic(msg, kPOVAttrib_TransmittedRays, &pstats[Transmitted_Rays_Traced]);
612    if(err == kNoErr)
613       err = AddStatistic(msg, kPOVAttrib_IStackOverflow, &pstats[Istack_overflows]);
614 #if defined(MEM_STATS)
615    Long_To_Counter(mem_stats_smallest_alloc(), pstats[MemStat_Smallest_Alloc]);
616    Long_To_Counter(mem_stats_largest_alloc(), pstats[MemStat_Largest_Alloc]);
617    if(err == kNoErr)
618       err = AddStatistic(msg, kPOVAttrib_MinAlloc, &pstats[MemStat_Smallest_Alloc]);
619    if(err == kNoErr)
620       err = AddStatistic(msg, kPOVAttrib_MaxAlloc, &pstats[MemStat_Largest_Alloc]);
621 #if (MEM_STATS>=2)
622    Long_To_Counter(mem_stats_total_allocs(), pstats[MemStat_Total_Allocs]);
623    Long_To_Counter(mem_stats_total_frees(), pstats[MemStat_Total_Frees]);
624    if(err == kNoErr)
625       err = AddStatistic(msg, kPOVAttrib_CallsToAlloc, &pstats[MemStat_Total_Allocs]);
626    if(err == kNoErr)
627       err = AddStatistic(msg, kPOVAttrib_CallsToFree, &pstats[MemStat_Total_Frees]);
628 #endif
629    Long_To_Counter(mem_stats_largest_mem_usage(), pstats[MemStat_Largest_Mem_Usage]);
630    if(err == kNoErr)
631       err = AddStatistic(msg, kPOVAttrib_PeakMemoryUsage, &pstats[MemStat_Largest_Mem_Usage]);
632 #endif
633 
634    if(err == kNoErr)
635       err = POVMSUtil_SetInt(msg, kPOVAttrib_TraceLevel, Highest_Trace_Level);
636    if(err == kNoErr)
637       err = POVMSUtil_SetInt(msg, kPOVAttrib_MaxTraceLevel, Max_Trace_Level);
638    if(err == kNoErr)
639       err = POVMSUtil_SetInt(msg, kPOVAttrib_RadGatherCount, ra_gather_count);
640    if(err == kNoErr)
641       err = POVMSUtil_SetInt(msg, kPOVAttrib_RadReuseCount, ra_reuse_count);
642 
643    if(err == kNoErr)
644       err = AddStatistic(msg, kPOVAttrib_PhotonsShot, &pstats[Number_Of_Photons_Shot]);
645    if(err == kNoErr)
646       err = AddStatistic(msg, kPOVAttrib_PhotonsStored, &pstats[Number_Of_Photons_Stored]);
647    if(err == kNoErr)
648       err = AddStatistic(msg, kPOVAttrib_GlobalPhotonsStored, &pstats[Number_Of_Global_Photons_Stored]);
649    if(err == kNoErr)
650       err = AddStatistic(msg, kPOVAttrib_MediaPhotonsStored, &pstats[Number_Of_Media_Photons_Stored]);
651    if(err == kNoErr)
652       err = AddStatistic(msg, kPOVAttrib_PhotonsPriQInsert, &pstats[Priority_Queue_Add]);
653    if(err == kNoErr)
654       err = AddStatistic(msg, kPOVAttrib_PhotonsPriQRemove, &pstats[Priority_Queue_Remove]);
655    if(err == kNoErr)
656       err = AddStatistic(msg, kPOVAttrib_GatherPerformedCnt, &pstats[Gather_Performed_Count]);
657    if(err == kNoErr)
658       err = AddStatistic(msg, kPOVAttrib_GatherExpandedCnt, &pstats[Gather_Expanded_Count]);
659 
660    return 0;
661 }
662 
663 
664 /*****************************************************************************
665 *
666 * FUNCTION
667 *
668 *   BuildProgress
669 *
670 * INPUT
671 *
672 * OUTPUT
673 *
674 * RETURNS
675 *
676 * AUTHOR
677 *
678 *   Thorsten Froehlich
679 *
680 * DESCRIPTION
681 *
682 *   -
683 *
684 * CHANGES
685 *
686 *   -
687 *
688 ******************************************************************************/
689 
BuildProgress(POVMSObjectPtr msg,int progress)690 int BuildProgress(POVMSObjectPtr msg, int progress)
691 {
692 	int ret = kNoErr;
693 	DBL time_dif;
694 
695 	STOP_TIME
696 	time_dif = TIME_ELAPSED
697 
698 	ret = POVMSUtil_SetInt(msg, kPOVAttrib_TotalTime, int(time_dif));
699 
700 	switch(progress)
701 	{
702 		case kPOVList_Prog_CreatingBoundingSlabs:
703 			break;
704 		case kPOVList_Prog_CreatingVistaBuffer:
705 			break;
706 		case kPOVList_Prog_CreatingLightBuffers:
707 			break;
708 		case kPOVList_Prog_BuildingPhotonMaps:
709 			(void)POVMSUtil_SetInt(msg, kPOVAttrib_TotalPhotonCount, GetPhotonStat(kPOVAttrib_TotalPhotonCount));
710 			(void)POVMSUtil_SetInt(msg, kPOVAttrib_ObjectPhotonCount, GetPhotonStat(kPOVAttrib_ObjectPhotonCount));
711 			(void)POVMSUtil_SetInt(msg, kPOVAttrib_MediaPhotonCount, GetPhotonStat(kPOVAttrib_MediaPhotonCount));
712 			(void)POVMSUtil_SetInt(msg, kPOVAttrib_PhotonXSamples, GetPhotonStat(kPOVAttrib_PhotonXSamples));
713 			(void)POVMSUtil_SetInt(msg, kPOVAttrib_PhotonYSamples, GetPhotonStat(kPOVAttrib_PhotonYSamples));
714 			break;
715 		case kPOVList_Prog_LoadingPhotonMaps:
716 			break;
717 		case kPOVList_Prog_SavingPhotonMaps:
718 			break;
719 		case kPOVList_Prog_SortingPhotons:
720 			(void)POVMSUtil_SetInt(msg, kPOVAttrib_CurrentPhotonCount, GetPhotonStat(kPOVAttrib_CurrentPhotonCount));
721 			(void)POVMSUtil_SetInt(msg, kPOVAttrib_TotalPhotonCount, GetPhotonStat(kPOVAttrib_TotalPhotonCount));
722 			break;
723 		case kPOVList_Prog_ReclaimingMemory:
724 			break;
725 		case kPOVList_Prog_WritingINIFile:
726 			break;
727 		case kPOVList_Prog_WritingHistogramFile:
728 			break;
729 		case kPOVList_Prog_PerformingShelloutCommand:
730 			break;
731 		case kPOVList_Prog_ResumingInterruptedTrace:
732 			break;
733 		case kPOVList_Prog_ProcessingFrame:
734 			(void)POVMSUtil_SetInt(msg, kPOVAttrib_CurrentFrame, opts.FrameSeq.FrameNumber - opts.FrameSeq.InitialFrame + 1);
735 			(void)POVMSUtil_SetInt(msg, kPOVAttrib_FrameCount, opts.FrameSeq.FinalFrame - opts.FrameSeq.InitialFrame + 1);
736 			(void)POVMSUtil_SetInt(msg, kPOVAttrib_AbsoluteCurFrame, opts.FrameSeq.FrameNumber);
737 			(void)POVMSUtil_SetFloat(msg, kPOVAttrib_FirstClock, opts.FrameSeq.InitialClock);
738 			(void)POVMSUtil_SetFloat(msg, kPOVAttrib_CurrentClock, opts.FrameSeq.Clock_Value);
739 			(void)POVMSUtil_SetFloat(msg, kPOVAttrib_LastClock, opts.FrameSeq.FinalClock);
740 			break;
741 		case kPOVList_Prog_Parsing:
742 			(void)POVMSUtil_SetLong(msg, kPOVAttrib_CurrentToken, Current_Token_Count);
743 			break;
744 		case kPOVList_Prog_Displaying:
745 			break;
746 		case kPOVList_Prog_Rendering:
747 			(void)POVMSUtil_SetInt(msg, kPOVAttrib_CurrentLine, Current_Line_Number - opts.First_Line + 1);
748 			(void)POVMSUtil_SetInt(msg, kPOVAttrib_AbsoluteCurrentLine, Current_Line_Number);
749 			(void)POVMSUtil_SetInt(msg, kPOVAttrib_LineCount, opts.Last_Line - opts.First_Line);
750 			if(MosaicPreviewSize > 1)
751 				(void)POVMSUtil_SetInt(msg, kPOVAttrib_MosaicPreviewSize, MosaicPreviewSize);
752 			else
753 			{
754 				if(opts.Options & ANTIALIAS)
755 					(void)POVMSUtil_SetInt(msg, kPOVAttrib_SuperSampleCount, SuperSampleCount);
756 				if(opts.Radiosity_Enabled)
757 					(void)POVMSUtil_SetInt(msg, kPOVAttrib_RadGatherCount, ra_gather_count - RadiosityCount);
758 			}
759 			break;
760 		case kPOVList_Prog_DoneTracing:
761 			break;
762 		case kPOVList_Prog_AbortingRender:
763 			break;
764 		case kPOVList_Prog_UserAbort:
765 			break;
766 	}
767 
768 	return ret;
769 }
770 
771 
772 /*****************************************************************************
773 *
774 * FUNCTION
775 *
776 *   AddStatistic
777 *
778 * INPUT
779 *
780 * OUTPUT
781 *
782 * RETURNS
783 *
784 * AUTHOR
785 *
786 *   Thorsten Froehlich
787 *
788 * DESCRIPTION
789 *
790 *   -
791 *
792 * CHANGES
793 *
794 *   -
795 *
796 ******************************************************************************/
797 
AddStatistic(POVMSObjectPtr msg,POVMSType key,COUNTER * counter)798 int AddStatistic(POVMSObjectPtr msg, POVMSType key, COUNTER *counter)
799 {
800    return POVMSUtil_SetLong(msg, key, *counter);
801 }
802 
803 
804 /*****************************************************************************
805 *
806 * FUNCTION
807 *
808 *   AddOIStatistic
809 *
810 * INPUT
811 *
812 * OUTPUT
813 *
814 * RETURNS
815 *
816 * AUTHOR
817 *
818 *   Thorsten Froehlich
819 *
820 * DESCRIPTION
821 *
822 *   -
823 *
824 * CHANGES
825 *
826 *   -
827 *
828 ******************************************************************************/
829 
AddOIStatistic(POVMSAttributeListPtr list,int index,COUNTER * pstats)830 int AddOIStatistic(POVMSAttributeListPtr list, int index, COUNTER *pstats)
831 {
832    POVMSObject obj;
833    int err;
834 
835    err = POVMSObject_New(&obj, kPOVObjectClass_OIStat);
836    if(err == kNoErr)
837       err = POVMSUtil_SetString(&obj, kPOVAttrib_ObjectName, intersection_stats[index].infotext);
838    if(err == kNoErr)
839       err = POVMSUtil_SetInt(&obj, kPOVAttrib_ObjectID, intersection_stats[index].povms_id);
840    if(err == kNoErr)
841       err = POVMSUtil_SetLong(&obj, kPOVAttrib_ISectsTests, pstats[intersection_stats[index].stat_test_id]);
842    if(err == kNoErr)
843       err = POVMSUtil_SetLong(&obj, kPOVAttrib_ISectsSucceeded, pstats[intersection_stats[index].stat_suc_id]);
844    if(err == kNoErr)
845       err = POVMSAttrList_Append(list, &obj);
846 
847    return err;
848 }
849 
850 
851 /*****************************************************************************
852 *
853 * FUNCTION
854 *
855 *   Send_InitInfo
856 *
857 * INPUT
858 *
859 * OUTPUT
860 *
861 * RETURNS
862 *
863 * AUTHOR
864 *
865 *   Thorsten Froehlich
866 *
867 * DESCRIPTION
868 *
869 *   -
870 *
871 * CHANGES
872 *
873 *   -
874 *
875 ******************************************************************************/
876 
Send_InitInfo()877 void Send_InitInfo()
878 {
879    POVMSAttributeList attrlist;
880    POVMSAttribute attr;
881    POVMSObject msg;
882    int err = kNoErr;
883 
884    if(err == kNoErr)
885       err = POVMSObject_New(&msg, kPOVMSType_WildCard);
886 
887    if(err == kNoErr)
888       err = POVMSUtil_SetString(&msg, kPOVAttrib_PlatformName, POVRAY_PLATFORM_NAME);
889    if(err == kNoErr)
890       err = POVMSUtil_SetFormatString(&msg, kPOVAttrib_CoreVersion,
891                                       "Persistence of Vision(tm) Ray Tracer Version %s%s", POV_RAY_VERSION, COMPILER_VER);
892    if(err == kNoErr)
893       err = POVMSUtil_SetString(&msg, kPOVAttrib_EnglishText,
894                                 DISTRIBUTION_MESSAGE_1 "\n" DISTRIBUTION_MESSAGE_2 "\n" DISTRIBUTION_MESSAGE_3
895                                 "\nPOV-Ray is based on DKBTrace 2.12 by David K. Buck & Aaron A. Collins\n" POV_RAY_COPYRIGHT);
896    if(err == kNoErr)
897       err = POVMSUtil_SetBool(&msg, kPOVAttrib_Official, POV_RAY_IS_OFFICIAL);
898 
899    if(err == kNoErr)
900       err = POVMSAttrList_New(&attrlist);
901    if(err == kNoErr)
902    {
903       for(int i = 0; Primary_Developers[i] != NULL; i++)
904       {
905          err = POVMSAttr_New(&attr);
906          if(err == kNoErr)
907          {
908             err = POVMSAttr_Set(&attr, kPOVMSType_CString, Primary_Developers[i], strlen(Primary_Developers[i]) + 1);
909             if(err == kNoErr)
910                err = POVMSAttrList_Append(&attrlist, &attr);
911             else
912                err = POVMSAttr_Delete(&attr);
913          }
914       }
915    }
916    if(err == kNoErr)
917       err = POVMSObject_Set(&msg, &attrlist, kPOVAttrib_PrimaryDevs);
918 
919    if(err == kNoErr)
920       err = POVMSAttrList_New(&attrlist);
921    if(err == kNoErr)
922    {
923       for(int i = 0; Contributing_Authors[i] != NULL; i++)
924       {
925          err = POVMSAttr_New(&attr);
926          if(err == kNoErr)
927          {
928             err = POVMSAttr_Set(&attr, kPOVMSType_CString, Contributing_Authors[i], strlen(Contributing_Authors[i]) + 1);
929             if(err == kNoErr)
930                err = POVMSAttrList_Append(&attrlist, &attr);
931             else
932                err = POVMSAttr_Delete(&attr);
933          }
934       }
935    }
936    if(err == kNoErr)
937       err = POVMSObject_Set(&msg, &attrlist, kPOVAttrib_ContributingDevs);
938 
939    if(err == kNoErr)
940       err = POVMSAttrList_New(&attrlist);
941 #ifndef DONT_SHOW_IMAGE_LIB_VERSIONS
942    // ZLib library version and copyright notice
943    if(err == kNoErr)
944    {
945       err = POVMSAttr_New(&attr);
946       if(err == kNoErr)
947       {
948          const char *tempstr = pov_tsprintf("ZLib %s, Copyright 1995-1998 Jean-loup Gailly and Mark Adler", Extract_Version(zlibVersion()));
949          err = POVMSAttr_Set(&attr, kPOVMSType_CString, (void *)tempstr, strlen(tempstr) + 1);
950          if(err == kNoErr)
951             err = POVMSAttrList_Append(&attrlist, &attr);
952          else
953             err = POVMSAttr_Delete(&attr);
954       }
955    }
956    // LibPNG library version and copyright notice
957    if(err == kNoErr)
958    {
959       err = POVMSAttr_New(&attr);
960       if(err == kNoErr)
961       {
962          const char *tempstr = pov_tsprintf("LibPNG %s, Copyright 1998-2002 Glenn Randers-Pehrson", Extract_Version(png_get_libpng_ver(NULL)));
963          err = POVMSAttr_Set(&attr, kPOVMSType_CString, (void *)tempstr, strlen(tempstr) + 1);
964          if(err == kNoErr)
965             err = POVMSAttrList_Append(&attrlist, &attr);
966          else
967             err = POVMSAttr_Delete(&attr);
968       }
969    }
970    // LibJPEG library version and copyright notice
971    if(err == kNoErr)
972    {
973       err = POVMSAttr_New(&attr);
974       if(err == kNoErr)
975       {
976          const char *tempstr = pov_tsprintf("LibJPEG %s, Copyright 1998 Thomas G. Lane", Extract_Version(JVERSION));
977          err = POVMSAttr_Set(&attr, kPOVMSType_CString, (void *)tempstr, strlen(tempstr) + 1);
978          if(err == kNoErr)
979             err = POVMSAttrList_Append(&attrlist, &attr);
980          else
981             err = POVMSAttr_Delete(&attr);
982       }
983    }
984    // LibTIFF library version and copyright notice
985    if(err == kNoErr)
986    {
987       err = POVMSAttr_New(&attr);
988       if(err == kNoErr)
989       {
990          const char *tempstr = pov_tsprintf("LibTIFF %s, Copyright 1988-1997 Sam Leffler, 1991-1997 SGI", Extract_Version(TIFFGetVersion()));
991          err = POVMSAttr_Set(&attr, kPOVMSType_CString, (void *)tempstr, strlen(tempstr) + 1);
992          if(err == kNoErr)
993             err = POVMSAttrList_Append(&attrlist, &attr);
994          else
995             err = POVMSAttr_Delete(&attr);
996       }
997    }
998 #endif
999    if(err == kNoErr)
1000       err = POVMSObject_Set(&msg, &attrlist, kPOVAttrib_ImageLibVersions);
1001 
1002    if(err == kNoErr)
1003       err = POVMSMsg_SetupMessage(&msg, kPOVMsgClass_Miscellaneous, kPOVMsgIdent_InitInfo);
1004    if(err == kNoErr)
1005       err = POVMSMsg_SetDestinationAddress(&msg, FRONTEND_ADDRESS);
1006 
1007    if(err == kNoErr)
1008       err = POVMS_Send(POVMS_Render_Context, &msg, NULL, kPOVMSSendMode_NoReply);
1009 
1010    if(err != 0)
1011       (void)POVMS_ASSERT_OUTPUT("Sending InitInfo failed!", "povmsend.cpp", 0);
1012 }
1013 
1014 /*****************************************************************************
1015 *
1016 * FUNCTION
1017 *
1018 *   Send_Progress
1019 *
1020 * INPUT
1021 *
1022 * OUTPUT
1023 *
1024 * RETURNS
1025 *
1026 * AUTHOR
1027 *
1028 *   Thorsten Froehlich
1029 *
1030 * DESCRIPTION
1031 *
1032 *   -
1033 *
1034 * CHANGES
1035 *
1036 *   -
1037 *
1038 ******************************************************************************/
1039 
Send_Progress(const char * statusString,int progressState)1040 int Send_Progress(const char *statusString, int progressState)
1041 {
1042 	POVMSObject msg;
1043 	int err = kNoErr;
1044 
1045 	Previous_t = 0;
1046 
1047 	if(err == kNoErr)
1048 		err = POVMSObject_New(&msg, kPOVObjectClass_Progress);
1049 
1050 	if(err == kNoErr)
1051 		err = POVMSUtil_SetString(&msg, kPOVAttrib_EnglishText, statusString);
1052 	if(err == kNoErr)
1053 		err = POVMSUtil_SetBool(&msg, kPOVAttrib_ProgressStatus, false);
1054 
1055 	if(err == kNoErr)
1056 		err = BuildProgress(&msg, progressState);
1057 
1058 	if(err == kNoErr)
1059 		err = POVMSMsg_SetupMessage(&msg, kPOVMsgClass_RenderOutput, kPOVMsgIdent_Progress);
1060 	if(err == kNoErr)
1061 		err = POVMSMsg_SetDestinationAddress(&msg, FRONTEND_ADDRESS);
1062 
1063 	if(err == kNoErr)
1064 		err = POVMS_Send(POVMS_Render_Context, &msg, NULL, kPOVMSSendMode_NoReply);
1065 
1066 	return err;
1067 }
1068 
1069 /*****************************************************************************
1070 *
1071 * FUNCTION
1072 *
1073 *   Send_ProgressUpdate
1074 *
1075 * INPUT
1076 *
1077 * OUTPUT
1078 *
1079 * RETURNS
1080 *
1081 * AUTHOR
1082 *
1083 *   Thorsten Froehlich
1084 *
1085 * DESCRIPTION
1086 *
1087 *   -
1088 *
1089 * CHANGES
1090 *
1091 *   -
1092 *
1093 ******************************************************************************/
1094 
Send_ProgressUpdate(int progressState,int t)1095 int Send_ProgressUpdate(int progressState, int t)
1096 {
1097 	POVMSObject msg;
1098 	int err = kNoErr;
1099 	DBL time_dif;
1100 
1101 	STOP_TIME
1102 	time_dif = TIME_ELAPSED
1103 
1104 	if((fabs(time_dif - Previous_t) >= t) || (t == 0))
1105 	{
1106 		Previous_t = time_dif;
1107 
1108 		if(err == kNoErr)
1109 			err = POVMSObject_New(&msg, kPOVObjectClass_Progress);
1110 
1111 		if(err == kNoErr)
1112 			err = POVMSUtil_SetBool(&msg, kPOVAttrib_ProgressStatus, true);
1113 
1114 		if(err == kNoErr)
1115 			err = BuildProgress(&msg, progressState);
1116 
1117 		if(err == kNoErr)
1118 			err = POVMSMsg_SetupMessage(&msg, kPOVMsgClass_RenderOutput, kPOVMsgIdent_Progress);
1119 		if(err == kNoErr)
1120 			err = POVMSMsg_SetDestinationAddress(&msg, FRONTEND_ADDRESS);
1121 
1122 		if(err == kNoErr)
1123 			err = POVMS_Send(POVMS_Render_Context, &msg, NULL, kPOVMSSendMode_NoReply);
1124 	}
1125 
1126 	return err;
1127 }
1128 
1129 
1130 /*****************************************************************************
1131 *
1132 * FUNCTION
1133 *
1134 *   Send_FrameStatistics
1135 *
1136 * INPUT
1137 *
1138 * OUTPUT
1139 *
1140 * RETURNS
1141 *
1142 * AUTHOR
1143 *
1144 *   Thorsten Froehlich
1145 *
1146 * DESCRIPTION
1147 *
1148 *   -
1149 *
1150 * CHANGES
1151 *
1152 *   -
1153 *
1154 ******************************************************************************/
1155 
Send_FrameStatistics()1156 int Send_FrameStatistics()
1157 {
1158 	POVMSObject msg;
1159 	int err = kNoErr;
1160 
1161 	if(err == kNoErr)
1162 		err = POVMSObject_New(&msg, kPOVObjectClass_FStats);
1163 
1164     if(err == kNoErr)
1165         err = BuildRenderTime(&msg, kPOVAttrib_FrameTime, tparse_frame, tphoton_frame, trender_frame, tparse_frame+tphoton_frame+trender_frame);
1166     if(err == kNoErr)
1167         err = BuildRenderTime(&msg, kPOVAttrib_AnimationTime, tparse_total, tphoton_total, trender_total, tparse_total+tphoton_total+trender_total);
1168 
1169 	if(err == kNoErr)
1170 		err = POVMSMsg_SetupMessage(&msg, kPOVMsgClass_RenderOutput, kPOVMsgIdent_FrameStatistics);
1171 	if(err == kNoErr)
1172 		err = POVMSMsg_SetDestinationAddress(&msg, FRONTEND_ADDRESS);
1173 
1174 	if(err == kNoErr)
1175 		err = POVMS_Send(POVMS_Render_Context, &msg, NULL, kPOVMSSendMode_NoReply);
1176 
1177 	return err;
1178 }
1179 
1180 
1181 /*****************************************************************************
1182 *
1183 * FUNCTION
1184 *
1185 *   Send_ParseStatistics
1186 *
1187 * INPUT
1188 *
1189 * OUTPUT
1190 *
1191 * RETURNS
1192 *
1193 * AUTHOR
1194 *
1195 *   Thorsten Froehlich
1196 *
1197 * DESCRIPTION
1198 *
1199 *   -
1200 *
1201 * CHANGES
1202 *
1203 *   -
1204 *
1205 ******************************************************************************/
1206 
Send_ParseStatistics()1207 int Send_ParseStatistics()
1208 {
1209 	POVMSObject msg;
1210 	int err = kNoErr;
1211 
1212 	if(err == kNoErr)
1213 		err = POVMSObject_New(&msg, kPOVObjectClass_PStats);
1214 
1215 	if(err == kNoErr)
1216 		err = BuildParseStatistics(&msg);
1217 
1218 	if(err == kNoErr)
1219 		err = POVMSMsg_SetupMessage(&msg, kPOVMsgClass_RenderOutput, kPOVMsgIdent_ParseStatistics);
1220 	if(err == kNoErr)
1221 		err = POVMSMsg_SetDestinationAddress(&msg, FRONTEND_ADDRESS);
1222 
1223 	if(err == kNoErr)
1224 		err = POVMS_Send(POVMS_Render_Context, &msg, NULL, kPOVMSSendMode_NoReply);
1225 
1226 	return err;
1227 }
1228 
1229 
1230 /*****************************************************************************
1231 *
1232 * FUNCTION
1233 *
1234 *   Send_RenderStatistics
1235 *
1236 * INPUT
1237 *
1238 * OUTPUT
1239 *
1240 * RETURNS
1241 *
1242 * AUTHOR
1243 *
1244 *   Thorsten Froehlich
1245 *
1246 * DESCRIPTION
1247 *
1248 *   -
1249 *
1250 * CHANGES
1251 *
1252 *   -
1253 *
1254 ******************************************************************************/
1255 
Send_RenderStatistics(bool total)1256 int Send_RenderStatistics(bool total)
1257 {
1258    POVMSObject msg;
1259    int err = kNoErr;
1260 
1261    if(err == kNoErr)
1262       err = POVMSObject_New(&msg, kPOVObjectClass_RStats);
1263    if(err == kNoErr)
1264    {
1265       if(total == true)
1266          err = BuildRenderStatistics(&msg, totalstats);
1267       else
1268          err = BuildRenderStatistics(&msg, stats);
1269    }
1270    if(err == kNoErr)
1271       err = POVMSMsg_SetupMessage(&msg, kPOVMsgClass_RenderOutput, kPOVMsgIdent_RenderStatistics);
1272    if(err == kNoErr)
1273       err = POVMSMsg_SetDestinationAddress(&msg, FRONTEND_ADDRESS);
1274    if(err == kNoErr)
1275       err = POVMS_Send(POVMS_Render_Context, &msg, NULL, kPOVMSSendMode_NoReply);
1276 
1277    return err;
1278 }
1279 
1280 
1281 /*****************************************************************************
1282 *
1283 * FUNCTION
1284 *
1285 *   Send_RenderOptions
1286 *
1287 * INPUT
1288 *
1289 * OUTPUT
1290 *
1291 * RETURNS
1292 *
1293 * AUTHOR
1294 *
1295 *   Thorsten Froehlich
1296 *
1297 * DESCRIPTION
1298 *
1299 *   -
1300 *
1301 * CHANGES
1302 *
1303 *   -
1304 *
1305 ******************************************************************************/
1306 
Send_RenderOptions()1307 int Send_RenderOptions()
1308 {
1309    POVMSObject msg;
1310    int err = kNoErr;
1311 
1312    if(err == kNoErr)
1313       err = POVMSObject_New(&msg, kPOVObjectClass_ROptions);
1314    if(err == kNoErr)
1315       err = BuildRenderOptions(&msg);
1316    if(err == kNoErr)
1317       err = POVMSMsg_SetupMessage(&msg, kPOVMsgClass_RenderOutput, kPOVMsgIdent_RenderOptions);
1318    if(err == kNoErr)
1319       err = POVMSMsg_SetDestinationAddress(&msg, FRONTEND_ADDRESS);
1320    if(err == kNoErr)
1321       err = POVMS_Send(POVMS_Render_Context, &msg, NULL, kPOVMSSendMode_NoReply);
1322 
1323    return err;
1324 }
1325 
1326 
1327 /*****************************************************************************
1328 *
1329 * FUNCTION
1330 *
1331 *   Send_RenderDone
1332 *
1333 * INPUT
1334 *
1335 * OUTPUT
1336 *
1337 * RETURNS
1338 *
1339 * AUTHOR
1340 *
1341 *   Thorsten Froehlich
1342 *
1343 * DESCRIPTION
1344 *
1345 *   -
1346 *
1347 * CHANGES
1348 *
1349 *   -
1350 *
1351 ******************************************************************************/
1352 
Send_RenderStarted(bool continuetrace)1353 int Send_RenderStarted(bool continuetrace)
1354 {
1355    POVMSObject msg;
1356    int err = kNoErr;
1357 
1358    err = POVMSObject_New(&msg, kPOVMSType_WildCard);
1359    if(err == kNoErr)
1360       err = POVMSObject_Copy(gStartedStreamMessage, &msg);
1361    if(err == kNoErr)
1362       err = POVMSUtil_SetBool(&msg, kPOVAttrib_ContinueTrace, continuetrace);
1363    if(err == kNoErr)
1364       err = POVMSMsg_SetupMessage(&msg, kPOVMsgClass_RenderOutput, kPOVMsgIdent_RenderStarted);
1365    if(err == kNoErr)
1366       err = POVMSMsg_SetDestinationAddress(&msg, FRONTEND_ADDRESS);
1367    if(err == kNoErr)
1368       err = POVMS_Send(POVMS_Render_Context, &msg, NULL, kPOVMSSendMode_NoReply);
1369 
1370    return err;
1371 }
1372 
1373 
1374 /*****************************************************************************
1375 *
1376 * FUNCTION
1377 *
1378 *   Send_RenderDone
1379 *
1380 * INPUT
1381 *
1382 * OUTPUT
1383 *
1384 * RETURNS
1385 *
1386 * AUTHOR
1387 *
1388 *   Thorsten Froehlich
1389 *
1390 * DESCRIPTION
1391 *
1392 *   -
1393 *
1394 * CHANGES
1395 *
1396 *   -
1397 *
1398 ******************************************************************************/
1399 
Send_RenderDone(bool withtime)1400 int Send_RenderDone(bool withtime)
1401 {
1402    POVMSObject msg;
1403    int err = kNoErr;
1404    int tp, th, tr;
1405 
1406    if (trender == 0.0)
1407    {
1408      STOP_TIME
1409 
1410      trender = TIME_ELAPSED
1411    }
1412 
1413    tp = tparse_total;
1414    if(tp <= 0)
1415      tp = tparse;
1416    th = tphoton_total;
1417    if(th <= 0)
1418      th = tphoton;
1419    tr = trender_total;
1420    if(tr <= 0)
1421      tr = trender;
1422 
1423    err = POVMSObject_New(&msg, kPOVMSType_WildCard);
1424    if(err == kNoErr)
1425       BuildRenderTime(&msg, kPOVAttrib_AnimationTime, tp, th, tr, tp + th + tr);
1426    if(err == kNoErr)
1427       err = POVMSMsg_SetupMessage(&msg, kPOVMsgClass_RenderOutput, kPOVMsgIdent_RenderDone);
1428    if(err == kNoErr)
1429       err = POVMSMsg_SetDestinationAddress(&msg, FRONTEND_ADDRESS);
1430    if(err == kNoErr)
1431       err = POVMS_Send(POVMS_Render_Context, &msg, NULL, kPOVMSSendMode_NoReply);
1432 
1433    return err;
1434 }
1435 
1436 END_POV_NAMESPACE
1437