/** \brief Compute occlusion from the current view direction to the * given sample region. * * \param sampleRegion - parallelogram region over which to sample the map * \param sampleOpts - set of sampling options * \param numSamples - number of samples to take for the region. * \param outSamps[0] - Return parameter; amount of occlusion over the * sample region in the viewing direction for this map. */ void sample(const Sq3DSamplePllgram& sampleRegion, const CqShadowSampleOptions& sampleOpts, const TqInt numSamples, TqFloat* outSamps) { // filter weights CqConstFilter filterWeights; // Use constant depth approximation for the surface for maximum // sampling speed. We use the depth from the camera to the centre // of the sample region. CqConstDepthApprox depthFunc((m_currToLight*sampleRegion.c).z()); // Determine rough filter support. This results in a // texture-aligned box, so doesn't do proper anisotropic filtering. // For occlusion this isn't visible anyway because of the large // amount of averaging. We also want the filter setup to be as // fast as possible. // CqVector3D side1 = m_currToRasterVec*sampleRegion.s1; // CqVector3D side2 = m_currToRasterVec*sampleRegion.s2; // CqVector3D center = m_currToRaster*sampleRegion.c; // TqFloat sWidthOn2 = max(side1.x(), side2.x())*m_pixels.width()/2; // TqFloat tWidthOn2 = max(side1.y(), side2.y())*m_pixels.height()/2; // TODO: Fix the above calculation so that the width is actually // taken into account properly. CqVector3D center = m_currToRaster*sampleRegion.c; TqFloat sWidthOn2 = 0.5*(sampleOpts.sBlur()*m_pixels.width()); TqFloat tWidthOn2 = 0.5*(sampleOpts.tBlur()*m_pixels.height()); SqFilterSupport support( lround(center.x()-sWidthOn2), lround(center.x()+sWidthOn2) + 1, lround(center.y()-tWidthOn2), lround(center.y()+tWidthOn2) + 1); // percentage closer accumulator CqPcfAccum<CqConstFilter, CqConstDepthApprox> accumulator( filterWeights, depthFunc, sampleOpts.startChannel(), sampleOpts.biasLow(), sampleOpts.biasHigh(), outSamps); // accumulate occlusion over the filter support. filterTextureNowrapStochastic(accumulator, m_pixels, support, numSamples); }