File: IntensityDistribution.ih

package info (click to toggle)
ospray 3.2.0-2
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 10,048 kB
  • sloc: cpp: 80,569; ansic: 951; sh: 805; makefile: 170; python: 69
file content (42 lines) | stat: -rw-r--r-- 1,263 bytes parent folder | download | duplicates (2)
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
// Copyright 2022 Intel Corporation
// SPDX-License-Identifier: Apache-2.0

#pragma once

#include "rkcommon/math/vec.ih"
// c++ shared
#include "IntensityDistributionShared.h"

OSPRAY_BEGIN_ISPC_NAMESPACE

inline float IntensityDistribution_eval(
    const IntensityDistribution *uniform self,
    const uniform vec3f &c0,
    const uniform vec3f &c90,
    float cosAngle,
    const vec3f &dir /*normalized*/)
{
  const float u = acos(clamp(cosAngle, -1.f, 1.f)) * self->scale.x;
  const float u_frac = frac(u);
  const int u0 = u;
  const int u1 = (u0 + 2 >= self->size.x) ? self->size.x - 1 : u0 + 1;

  float intensity;
  if (self->size.y == 1) { // 1D
    intensity = lerp(u_frac, self->lid[u0], self->lid[u1]);
  } else { // 2D
    const float v =
        (atan2(dot(dir, c90), dot(dir, c0)) + (float)pi) * self->scale.y;
    const float v_frac = frac(v);
    const int v0 = v;
    const int v1 = (v0 + 1 >= self->size.y) ? 0 : v0 + 1;
    const int r0 = v0 * self->size.x;
    const int r1 = v1 * self->size.x;
    const float li0 = lerp(u_frac, self->lid[r0 + u0], self->lid[r0 + u1]);
    const float li1 = lerp(u_frac, self->lid[r1 + u0], self->lid[r1 + u1]);
    intensity = lerp(v_frac, li0, li1);
  }
  return intensity;
}

OSPRAY_END_ISPC_NAMESPACE