void Bucket::sample(int x, int y) { Vec3 sample = m_sampler->getSquareSample(); int lightBounces = m_scene->m_settings.m_lightBounces; int cameraBounces = m_scene->m_settings.m_cameraBounces; Ray ray = m_viewPlane->getPixelRay(x,y,*m_sampler); RGBA finalCol(0.0f); RGBA col(0.0f); int numCameraNodes = 0; int numLightNodes = 1; buildPath(m_cameraPath,&ray,numCameraNodes, RGBA(1.0f,1.0f,1.0f,1.0f), 0, cameraBounces); int lightIndex = floor(m_sampler->get1DSample()*m_scene->m_lights.size()); Light *light = m_scene->m_lights[lightIndex]; ray = light->getRay(*m_sampler); m_lightPath[0].m_sr.m_hitPos = ray.m_origin; m_lightPath[0].m_accumColor = RGBA(1.0f,1.0f,1.0f,1.0f); for(int j=0;j<numCameraNodes;j++){ PathNode &cameraNode = m_cameraPath[j]; for(int i=0;i<numLightNodes;i++){ PathNode &lightNode = m_lightPath[i]; Vec3 dir = lightNode.m_sr.m_hitPos - cameraNode.m_sr.m_hitPos; float maxT = dir.length(); dir.normalize(); float delta = 0.001f; Vec3 tmp = dir * delta; tmp = cameraNode.m_sr.m_hitPos - tmp; Ray ray = Ray(tmp,dir,true); ray.computePlucker(); float pdf; col = light->getLightColor(dir, cameraNode.m_sr.m_hitPos, lightNode.m_sr.m_hitPos, &pdf); float shadeVal = float(m_scene->m_lights.size())/pdf; shadeVal *= m_scene->traceShadow(ray,maxT); col *= cameraNode.m_accumColor; cameraNode.m_sr.m_material->shade(cameraNode.m_incident, dir, cameraNode.m_sr, &col, m_shadingContext); col *= shadeVal; finalCol += col; } } if(numCameraNodes != 0){ finalCol[3] = 1.0f; } else{ finalCol = RGBA(0.0f,0.0f,0.0f,0.0f); } m_viewPlane->setPixelValue(x,y,finalCol); }
void Instance::hit(Ray &ray, ShadeRec &sr) const { const Triangle *tmpTriangle = sr.m_triangle; if(!sr.m_hit){ tmpTriangle = 0; } Ray tmpRay = ray; m_transform.multDirMatrix(tmpRay.m_dir, tmpRay.m_dir); m_transform.multVecMatrix(tmpRay.m_origin, tmpRay.m_origin); tmpRay.computePlucker(); m_bvh->hit(tmpRay, sr); if(sr.m_hit){ if(sr.m_triangle != tmpTriangle){ sr.m_hitPos = tmpRay.getPointAtPos(sr.m_hitT); sr.m_triangle->shadeInfo(tmpRay,sr); m_normalinvTransform.multDirMatrix(sr.m_normal, sr.m_normal); sr.m_normal.normalize(); sr.m_calculated = true; sr.m_hitPos = ray.getPointAtPos(sr.m_hitT); } } return; }