File: DirectionalLight.ispc

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 (142 lines) | stat: -rw-r--r-- 3,686 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
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
// Copyright 2009 Intel Corporation
// SPDX-License-Identifier: Apache-2.0

#include "common/Instance.ih"
#include "math/sampling.ih"
#include "rkcommon/math/LinearSpace.ih"
// c++ shared
#include "DirectionalLightShared.h"

// Implementation
//////////////////////////////////////////////////////////////////////////////
OSPRAY_BEGIN_ISPC_NAMESPACE

inline Light_SampleRes Sample(const DirectionalLight *uniform self,
    const uniform linear3f &frame,
    const vec2f &s)
{
  Light_SampleRes res;

  res.dir = frame.vz;
  res.dist = inf;
  res.pdf = self->pdf;

  if (self->cosAngle < COS_ANGLE_MAX)
    res.dir = frame * uniformSampleCone(self->cosAngle, s);

  res.weight = self->irradiance; // *pdf/pdf cancel

  return res;
}

SYCL_EXTERNAL Light_SampleRes DirectionalLight_sample(
    const Light *uniform super,
    const DifferentialGeometry &,
    const vec2f &s,
    const float,
    const uniform FeatureFlagsHandler &)
{
  const DirectionalLight *uniform self = (DirectionalLight * uniform) super;
  assert(self);
  return Sample(self, self->frame, s);
}

SYCL_EXTERNAL Light_SampleRes DirectionalLight_sample_instanced(
    const Light *uniform super,
    const DifferentialGeometry &,
    const vec2f &s,
    const float time,
    const uniform FeatureFlagsHandler &)
{
  const DirectionalLight *uniform self = (DirectionalLight * uniform) super;
  assert(self);

  const Instance *uniform instance = self->super.instance;
  assert(instance);

  Light_SampleRes res;
  foreach_unique (utime in time) {
    const uniform affine3f xfm = Instance_getTransform(instance, utime);
    res = Sample(self, xfm.l * self->frame, s);
  }
  return res;
}

inline Light_EvalRes Eval(const DirectionalLight *uniform self,
    const uniform linear3f &frame,
    const vec3f &dir,
    const float maxDist)
{
  Light_EvalRes res;
  res.radiance = make_vec3f(0.f);

  if ((float)inf <= maxDist && self->cosAngle < COS_ANGLE_MAX
      && dot(frame.vz, dir) > self->cosAngle) {
    res.radiance = self->irradiance * self->pdf;
    res.pdf = self->pdf;
  }

  return res;
}

SYCL_EXTERNAL Light_EvalRes DirectionalLight_eval(const Light *uniform super,
    const DifferentialGeometry &,
    const vec3f &dir,
    const float /*minDist*/,
    const float maxDist,
    const float)
{
  const DirectionalLight *uniform self = (DirectionalLight * uniform) super;
  assert(self);
  return Eval(self, self->frame, dir, maxDist);
}

SYCL_EXTERNAL Light_EvalRes DirectionalLight_eval_instanced(
    const Light *uniform super,
    const DifferentialGeometry &,
    const vec3f &dir,
    const float /*minDist*/,
    const float maxDist,
    const float time)
{
  const DirectionalLight *uniform self = (DirectionalLight * uniform) super;
  assert(self);

  const Instance *uniform instance = self->super.instance;
  assert(instance);

  Light_EvalRes res;
  foreach_unique (utime in time) {
    const uniform affine3f xfm = Instance_getTransform(instance, utime);
    res = Eval(self, xfm.l * self->frame, dir, maxDist);
  }
  return res;
}

// Exports (called from C++)
//////////////////////////////////////////////////////////////////////////////

export void *uniform DirectionalLight_sample_addr()
{
  return (void *uniform)DirectionalLight_sample;
}

#ifndef OSPRAY_TARGET_SYCL
export void *uniform DirectionalLight_sample_instanced_addr()
{
  return (void *uniform)DirectionalLight_sample_instanced;
}
#endif

export void *uniform DirectionalLight_eval_addr()
{
  return (void *uniform)DirectionalLight_eval;
}

#ifndef OSPRAY_TARGET_SYCL
export void *uniform DirectionalLight_eval_instanced_addr()
{
  return (void *uniform)DirectionalLight_eval_instanced;
}
#endif
OSPRAY_END_ISPC_NAMESPACE