void PhotonEstimationTask::SearchThroughObjectsEstimatePhotons(vector<ObjectPtr>& Objects, LightSource *Light) { ViewThreadData *renderDataPtr = GetViewDataPtr(); shared_ptr<SceneData> sceneData = GetSceneData(); /* check this object and all siblings */ for(vector<ObjectPtr>::iterator Sib = Objects.begin(); Sib != Objects.end(); Sib++) { if(Test_Flag((*Sib), PH_TARGET_FLAG) && !((*Sib)->Type & LIGHT_SOURCE_OBJECT)) { /* do not shoot photons if global lights are turned off for ObjectPtr */ if(!Test_Flag((*Sib), NO_GLOBAL_LIGHTS_FLAG)) { EstimatePhotonsForObjectAndLight((*Sib), Light); } Cooperate(); } /* if it has children, check them too */ else if(((*Sib)->Type & IS_COMPOUND_OBJECT)) { SearchThroughObjectsEstimatePhotons(((CSG *)(*Sib))->children, Light); } } }
void PhotonEstimationTask::EstimatePhotonsForObjectAndLight(ObjectPtr Object, LightSource *Light) { int mergedFlags=0; /* merged flags to see if we should shoot photons */ ViewThreadData *renderDataPtr = GetViewDataPtr(); /* first, check on various flags... make sure all is a go for this ObjectPtr */ LightTargetCombo combo(Light,Object); mergedFlags = combo.computeMergedFlags(); if (!( ((mergedFlags & PH_RFR_ON_FLAG) && !(mergedFlags & PH_RFR_OFF_FLAG)) || ((mergedFlags & PH_RFL_ON_FLAG) && !(mergedFlags & PH_RFL_OFF_FLAG)) )) /* it is a no-go for this object... bail out now */ return; if(!Object) return; ShootingDirection shootingDirection(Light,Object); shootingDirection.compute(); /* calculate the spacial separation (spread) */ renderDataPtr->photonSpread = combo.target->Ph_Density*GetSceneData()->photonSettings.surfaceSeparation; /* if rays aren't parallel, divide by dist so we get separation at a distance of 1 unit */ if (!combo.light->Parallel) { renderDataPtr->photonSpread /= shootingDirection.dist; } /* try to guess the number of photons */ DBL x=shootingDirection.rad / (combo.target->Ph_Density*GetSceneData()->photonSettings.surfaceSeparation); x=x*x*M_PI; if ( ((mergedFlags & PH_RFR_ON_FLAG) && !(mergedFlags & PH_RFR_OFF_FLAG)) && ((mergedFlags & PH_RFL_ON_FLAG) && !(mergedFlags & PH_RFL_OFF_FLAG)) ) { x *= 1.5; /* assume 2 times as many photons with both reflection & refraction */ } if ( !Test_Flag(combo.target, PH_IGNORE_PHOTONS_FLAG) ) { if ( ((mergedFlags & PH_RFR_ON_FLAG) && !(mergedFlags & PH_RFR_OFF_FLAG)) ) { if ( ((mergedFlags & PH_RFL_ON_FLAG) && !(mergedFlags & PH_RFL_OFF_FLAG)) ) x *= 3; /* assume 3 times as many photons if ignore_photons not used */ else x *= 2; /* assume less for only refraction */ } } x *= 0.5; /* assume 1/2 of photons hit target ObjectPtr */ photonCountEstimate += x; }
void PhotonEstimationTask::Run() { // quit right away if photons not enabled if (!GetSceneData()->photonSettings.photonsEnabled) return; if (GetSceneData()->photonSettings.surfaceCount==0) return; Cooperate(); // COUNT THE PHOTONS DBL factor; photonCountEstimate = 0.0; // global lights GetViewDataPtr()->Light_Is_Global = true; for(vector<LightSource *>::iterator Light = GetSceneData()->lightSources.begin(); Light != GetSceneData()->lightSources.end(); Light++) { if((*Light)->Light_Type != FILL_LIGHT_SOURCE) SearchThroughObjectsEstimatePhotons(GetSceneData()->objects, *Light); } // light_group lights /* TODO renderer->sceneData->photonSettings.Light_Is_Global = false; for(vector<LightSource *>::iterator Light_Group_Light = renderer->sceneData->lightGroupLights.begin(); Light_Group_Light != renderer->sceneData->lightGroupLights.end(); Light_Group_Light++) { Light = Light_Group_Light->Light; if (Light->Light_Type != FILL_LightSource) { SearchThroughObjectsEstimatePhotons(GetSceneData()->objects, *Light); } } */ factor = (DBL)photonCountEstimate/GetSceneData()->photonSettings.surfaceCount; factor = sqrt(factor); GetSceneData()->photonSettings.surfaceSeparation *= factor; // good idea to make sure all warnings and errors arrive frontend now [trf] Cooperate(); }
void PhotonSortingTask::Finish() { GetViewDataPtr()->timeType = TraceThreadData::kPhotonTime; GetViewDataPtr()->realTime = ConsumedRealTime(); GetViewDataPtr()->cpuTime = ConsumedCPUTime(); }
} Colour& TraceTask::SubdivisionBuffer::operator()(size_t x, size_t y) { return colors[x + (y * size)]; } void TraceTask::SubdivisionBuffer::Clear() { for(vector<bool>::iterator i(sampled.begin()); i != sampled.end(); i++) *i = false; } TraceTask::TraceTask(ViewData *vd, unsigned int tm, DBL js, DBL aat, unsigned int aad, GammaCurvePtr& aag, unsigned int ps, bool psc, bool final, bool hr) : RenderTask(vd), trace(vd, GetViewDataPtr(), vd->GetSceneData()->parsedMaxTraceLevel, vd->GetSceneData()->parsedAdcBailout, vd->GetQualityFeatureFlags(), cooperate, media, radiosity), cooperate(*this), tracingMethod(tm), jitterScale(js), aaThreshold(aat), aaDepth(aad), aaGamma(aag), previewSize(ps), previewSkipCorner(psc), finalTrace(final), highReproducibility(hr), media(GetViewDataPtr(), &trace, &photonGatherer), radiosity(vd->GetSceneData(), GetViewDataPtr(), vd->GetSceneData()->radiositySettings, vd->GetRadiosityCache(), cooperate, final, Vector3d(vd->GetCamera().Location)), photonGatherer(&vd->GetSceneData()->mediaPhotonMap, vd->GetSceneData()->photonSettings)
void PhotonEstimationTask::Finish() { GetViewDataPtr()->timeType = SceneThreadData::kPhotonTime; GetViewDataPtr()->realTime = ConsumedRealTime(); GetViewDataPtr()->cpuTime = ConsumedCPUTime(); }