Changeset View
Changeset View
Standalone View
Standalone View
intern/cycles/kernel/closure/bsdf_ashikhmin_velvet.h
| Show All 24 Lines | |||||
| * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT | * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT | ||||
| * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, | * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, | ||||
| * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY | * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY | ||||
| * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT | * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT | ||||
| * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE | * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE | ||||
| * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | ||||
| */ | */ | ||||
| #ifndef __BSDF_ASHIKHMIN_VELVET_H__ | #pragma once | ||||
| #define __BSDF_ASHIKHMIN_VELVET_H__ | |||||
| #include "kernel/kernel_montecarlo.h" | |||||
| CCL_NAMESPACE_BEGIN | CCL_NAMESPACE_BEGIN | ||||
| typedef ccl_addr_space struct VelvetBsdf { | typedef ccl_addr_space struct VelvetBsdf { | ||||
| SHADER_CLOSURE_BASE; | SHADER_CLOSURE_BASE; | ||||
| float sigma; | float sigma; | ||||
| float invsigma2; | float invsigma2; | ||||
| } VelvetBsdf; | } VelvetBsdf; | ||||
| static_assert(sizeof(ShaderClosure) >= sizeof(VelvetBsdf), "VelvetBsdf is too large!"); | static_assert(sizeof(ShaderClosure) >= sizeof(VelvetBsdf), "VelvetBsdf is too large!"); | ||||
| ccl_device int bsdf_ashikhmin_velvet_setup(VelvetBsdf *bsdf) | ccl_device int bsdf_ashikhmin_velvet_setup(VelvetBsdf *bsdf) | ||||
| { | { | ||||
| float sigma = fmaxf(bsdf->sigma, 0.01f); | float sigma = fmaxf(bsdf->sigma, 0.01f); | ||||
| bsdf->invsigma2 = 1.0f / (sigma * sigma); | bsdf->invsigma2 = 1.0f / (sigma * sigma); | ||||
| bsdf->type = CLOSURE_BSDF_ASHIKHMIN_VELVET_ID; | bsdf->type = CLOSURE_BSDF_ASHIKHMIN_VELVET_ID; | ||||
| return SD_BSDF | SD_BSDF_HAS_EVAL; | return SD_BSDF | SD_BSDF_HAS_EVAL; | ||||
| } | } | ||||
| ccl_device bool bsdf_ashikhmin_velvet_merge(const ShaderClosure *a, const ShaderClosure *b) | |||||
| { | |||||
| const VelvetBsdf *bsdf_a = (const VelvetBsdf *)a; | |||||
| const VelvetBsdf *bsdf_b = (const VelvetBsdf *)b; | |||||
| return (isequal_float3(bsdf_a->N, bsdf_b->N)) && (bsdf_a->sigma == bsdf_b->sigma); | |||||
| } | |||||
| ccl_device float3 bsdf_ashikhmin_velvet_eval_reflect(const ShaderClosure *sc, | ccl_device float3 bsdf_ashikhmin_velvet_eval_reflect(const ShaderClosure *sc, | ||||
| const float3 I, | const float3 I, | ||||
| const float3 omega_in, | const float3 omega_in, | ||||
| float *pdf) | float *pdf) | ||||
| { | { | ||||
| const VelvetBsdf *bsdf = (const VelvetBsdf *)sc; | const VelvetBsdf *bsdf = (const VelvetBsdf *)sc; | ||||
| float m_invsigma2 = bsdf->invsigma2; | float m_invsigma2 = bsdf->invsigma2; | ||||
| float3 N = bsdf->N; | float3 N = bsdf->N; | ||||
| ▲ Show 20 Lines • Show All 97 Lines • ▼ Show 20 Lines | #endif | ||||
| } | } | ||||
| else | else | ||||
| *pdf = 0.0f; | *pdf = 0.0f; | ||||
| return LABEL_REFLECT | LABEL_DIFFUSE; | return LABEL_REFLECT | LABEL_DIFFUSE; | ||||
| } | } | ||||
| CCL_NAMESPACE_END | CCL_NAMESPACE_END | ||||
| #endif /* __BSDF_ASHIKHMIN_VELVET_H__ */ | |||||