File: GeometricModel.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 (57 lines) | stat: -rw-r--r-- 1,785 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
// Copyright 2009 Intel Corporation
// SPDX-License-Identifier: Apache-2.0

// ospray
#include "GeometricModel.ih"
#include "math/Distribution1D.ih"
#include "render/Material.ih"
#include "render/MaterialDispatch.ih"
// c++ shared
#include "common/InstanceShared.h"

OSPRAY_BEGIN_ISPC_NAMESPACE

export uniform int GeometricModel_gatherEmissivePrimIDs(void *uniform _model,
    void *uniform _renderer,
    void *uniform _instance,
    int *uniform primIDs,
    float *uniform distribution,
    uniform float &pdf)
{
  GeometricModel *uniform model = (GeometricModel * uniform) _model;
  const Renderer *uniform renderer = (Renderer * uniform) _renderer;
  const Geometry *uniform geo = model->geom;
  const Instance *uniform instance = (Instance * uniform) _instance;

  // create the list of emissive primitive IDs
  uniform int32 numEmissivePrims = 0;

#ifdef OSPRAY_TARGET_SYCL
  // SYCL execution in a thread is scalar
  for (int primID = 0; primID < geo->numPrimitives; ++primID) {
#else
  foreach (primID = 0 ... geo->numPrimitives) {
#endif
    Material *mat =
        (Material *)GeometricModel_getMaterial(model, renderer, primID);
    if (mat->isEmissive) {
      int offset = exclusive_scan_add(1);

      primIDs[numEmissivePrims + offset] = primID;
      numEmissivePrims += reduce_add(1);
    }
  }

  // create the sampling distribution
  // TODO: use emissive power instead of just area
  // TODO: motion blur can introduce scale, which means areas cannot
  // accurately be precomputed
  // Note: Can stay as a ptr call if not moved to GPU
  geo->getAreas(geo, primIDs, numEmissivePrims, instance->xfm, distribution);
  pdf = model->areaPDF =
      1.f / Distribution1D_create(numEmissivePrims, distribution);

  return numEmissivePrims;
}

OSPRAY_END_ISPC_NAMESPACE