File: Instance.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 (107 lines) | stat: -rw-r--r-- 3,268 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
// Copyright 2009 Intel Corporation
// SPDX-License-Identifier: Apache-2.0

#pragma once

// ospray stuff
#include "../geometry/GeometricModel.ih"
#include "DifferentialGeometry.ih"
#include "OSPCommon.ih"
#include "Ray.ih"
// c++ shared
#include "GroupShared.h"
#include "InstanceShared.h"
#include "common/FeatureFlagsEnum.h"

#include "rkcommon/math/AffineSpace.ih"

OSPRAY_BEGIN_ISPC_NAMESPACE

struct Renderer;

inline uniform AffineSpace3f Instance_getTransform(
    const Instance *uniform self, const uniform float time)
{
  uniform AffineSpace3f xfm;
  rtcGetGeometryTransformFromScene(
      self->scene, self->geomID, time, RTC_FORMAT_FLOAT3X4_COLUMN_MAJOR, &xfm);

  return xfm;
}

#ifndef OSPRAY_TARGET_SYCL
inline AffineSpace3f Instance_getTransform(
    const Instance *uniform self, const float time)
{
  AffineSpace3f xfm;
  rtcGetGeometryTransformFromScene(
      self->scene, self->geomID, time, RTC_FORMAT_FLOAT3X4_COLUMN_MAJOR, &xfm);

  return xfm;
}
#endif

inline void Instance_postIntersect(const Instance *uniform self,
    const Renderer *uniform renderer,
    varying DifferentialGeometry &dg,
    const varying Ray &ray,
    uniform int64 flags,
    const uniform bool clip,
    const uniform FeatureFlagsHandler &ffh)
{
  GeometricModel **uniform models =
      clip ? self->group->clipModels : self->group->geometricModels;
  foreach_unique (geomID in ray.geomID)
    GeometricModel_postIntersect(models[geomID], renderer, dg, ray, flags, ffh);

  dg.instID =
      (self->userID == RTC_INVALID_GEOMETRY_ID) ? ray.instID : self->userID;

  uniform AffineSpace3f uxfm = self->xfm;
  uniform AffineSpace3f rcp_uxfm = self->rcp_xfm;

  const uniform FeatureFlagsGeometry ffg = getFeatureFlagsGeometry(ffh);
  if ((flags & DG_MOTIONBLUR) == DG_MOTIONBLUR && self->motionBlur
      && (ffg & FFG_MOTION_BLUR)) {
    uniform float utime = 0.f;
    uniform int cnt = 0;
    foreach_unique (t in ray.time) {
      utime = t;
      cnt++;
    }

    if (cnt > 1) { // varying xfm
      const AffineSpace3f xfm = Instance_getTransform(self, ray.time);
      const AffineSpace3f rcp_xfm = rcp(xfm);

      dg.lP = xfmPoint(rcp_xfm, dg.P);
      dg.Ns = xfmVector(transposed(rcp_xfm.l), dg.Ns);
      dg.Ng = xfmVector(transposed(rcp_xfm.l), dg.Ng);
      // scale dg.epsilon by max (epsilon is scalar and thus assumed to be
      // isotropic anyway and hence cannot better handle non-uniform scaling)
      dg.epsilon *= max(abs(xfm.l.vx.x), max(abs(xfm.l.vy.y), abs(xfm.l.vz.z)));
      if (flags & DG_TANGENTS) {
        dg.dPds = xfmVector(xfm, dg.dPds);
        dg.dPdt = xfmVector(xfm, dg.dPdt);
      }
      return;
    } else { // uniform xfm
      uxfm = Instance_getTransform(self, utime);
      rcp_uxfm = rcp(uxfm);
    }
  }

  dg.lP = xfmPoint(rcp_uxfm, dg.P);
  dg.Ns = xfmVector(transposed(rcp_uxfm.l), dg.Ns);
  dg.Ng = xfmVector(transposed(rcp_uxfm.l), dg.Ng);
  // scale dg.epsilon by max (epsilon is scalar and thus assumed to be
  // isotropic anyway and hence cannot better handle non-uniform scaling)
  dg.epsilon *= max(abs(uxfm.l.vx.x), max(abs(uxfm.l.vy.y), abs(uxfm.l.vz.z)));

  if (flags & DG_TANGENTS) {
    dg.dPds = xfmVector(uxfm, dg.dPds);
    dg.dPdt = xfmVector(uxfm, dg.dPdt);
  }
}

OSPRAY_END_ISPC_NAMESPACE