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