1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49
|
// Copyright 2009-2021 Intel Corporation
// SPDX-License-Identifier: Apache-2.0
#pragma once
#include "../common/ray.h"
#include "../common/geometry.h"
namespace embree
{
namespace isa
{
struct CurvePrecalculations1
{
float depth_scale;
LinearSpace3fa ray_space;
__forceinline CurvePrecalculations1() {}
__forceinline CurvePrecalculations1(const Ray& ray, const void* ptr)
{
depth_scale = rsqrt(dot(ray.dir,ray.dir));
LinearSpace3fa space = frame(depth_scale*ray.dir);
space.vz *= depth_scale;
ray_space = space.transposed();
}
};
template<int K>
struct CurvePrecalculationsK
{
vfloat<K> depth_scale;
LinearSpace3fa ray_space[K];
__forceinline CurvePrecalculationsK(const vbool<K>& valid, const RayK<K>& ray)
{
size_t mask = movemask(valid);
depth_scale = rsqrt(dot(ray.dir,ray.dir));
while (mask) {
size_t k = bscf(mask);
Vec3fa ray_dir_k = Vec3fa(ray.dir.x[k],ray.dir.y[k],ray.dir.z[k]);
LinearSpace3fa ray_space_k = frame(depth_scale[k]*ray_dir_k);
ray_space_k.vz *= depth_scale[k];
ray_space[k] = ray_space_k.transposed();
}
}
};
}
}
|