141 |
|
* may be recalculated. The previous output rows are not zeroed or deleted, |
142 |
|
* but are overwritten as the calculation proceeds from the new starting point. |
143 |
|
* However, the output file(s) will indicate in the NROWS= line in the header |
144 |
< |
* that only the newly calculated rows are present. |
144 |
> |
* that only the newly calculated rows are present. If you wish to start over |
145 |
> |
* with a different set of modifiers or outputs, call ClearModifiers() instead, |
146 |
> |
* which keeps the current octree in memory. This call also returns to single |
147 |
> |
* process mode if any children were running. |
148 |
|
* |
149 |
|
* It is not possible to write to standard output, but the output |
150 |
|
* model is quite flexible thanks to the RdataShare polymorphic class. |
207 |
|
modLUT.freek = efree; |
208 |
|
modLUT.freed = FreeRcMod; |
209 |
|
kid = NULL; kidRow = NULL; nkids = 0; |
207 |
– |
rtFlags = RTtraceSources; |
208 |
– |
SetTraceCall(&RctCall, this); |
210 |
|
outOp = RCOnew; |
211 |
|
cdsF = &defDataShare; |
212 |
|
xres = yres = 0; |
213 |
|
accum = 1; |
214 |
+ |
if (octname) { |
215 |
+ |
SetTraceCall(&RctCall, this); |
216 |
+ |
rtFlags |= RTtraceSources; |
217 |
+ |
UpdateMode(); |
218 |
+ |
} |
219 |
|
} |
220 |
|
~RcontribSimulManager() { |
221 |
< |
Cleanup(); |
221 |
> |
if (nkids >= 0) ClearModifiers(); |
222 |
|
} |
223 |
|
/// Check modifiable ray-tracing computation flag(s) |
224 |
|
bool HasFlag(int fl) const { |
233 |
|
} |
234 |
|
/// Load octree and prepare renderer |
235 |
|
bool LoadOctree(const char *octn) { |
236 |
< |
return RtraceSimulManager::LoadOctree(octn); |
236 |
> |
if (octname) Cleanup(false); |
237 |
> |
if (!RtraceSimulManager::LoadOctree(octn)) |
238 |
> |
return false; |
239 |
> |
SetTraceCall(&RctCall, this); |
240 |
> |
rtFlags |= RTtraceSources; |
241 |
> |
return UpdateMode(); |
242 |
|
} |
243 |
|
/// Prepare header from previous input (or clear) |
244 |
|
bool NewHeader(const char *inspec=NULL) { |
316 |
|
return rowsDone.Length(); |
317 |
|
return nDone; |
318 |
|
} |
308 |
– |
/// Rewind calculation (previous results unchanged) |
309 |
– |
bool ResetRow(int r); |
319 |
|
/// Add a ray/bundle to compute next record (n=accum) |
320 |
|
int ComputeRecord(const FVECT orig_direc[]); |
321 |
|
/// Finish pending rays if multi-processing |
325 |
|
; |
326 |
|
return true; |
327 |
|
} |
328 |
< |
/// Close octree, free data, return status |
329 |
< |
int Cleanup(bool everything = false) { |
330 |
< |
if (nkids < 0) return 0; // skip 4 child |
328 |
> |
/// Rewind calculation (previous results unchanged) |
329 |
> |
bool ResetRow(int r); |
330 |
> |
/// Clear the modifiers and close all outputs |
331 |
> |
void ClearModifiers() { |
332 |
|
if (rowsDone.Length()) { |
333 |
|
SetThreadCount(1); |
324 |
– |
cow_doneshare(); |
334 |
|
rowsDone.NewBitMap(0); |
335 |
+ |
rInPos = 0; |
336 |
|
} |
337 |
|
lu_done(&modLUT); |
338 |
|
delete outList; outList = NULL; |
339 |
|
nChan = 0; |
340 |
+ |
} |
341 |
+ |
/// Close octree, free data, return status |
342 |
+ |
int Cleanup(bool everything = false) { |
343 |
+ |
ClearModifiers(); |
344 |
+ |
cow_doneshare(); |
345 |
+ |
if (everything) { |
346 |
+ |
dtyp = 'f'; |
347 |
+ |
outOp = RCOnew; |
348 |
+ |
cdsF = &defDataShare; |
349 |
+ |
xres = yres = 0; |
350 |
+ |
accum = 1; |
351 |
+ |
rtFlags &= ~RCmask; |
352 |
+ |
} |
353 |
|
return RtraceSimulManager::Cleanup(everything); |
354 |
|
} |
355 |
|
}; |
356 |
+ |
|
357 |
+ |
extern const char * formstr(int f); // string from format |
358 |
|
|
359 |
|
#endif /* RcontribSimulManager_h */ |