File: EmbreeManagerTest.cpp

package info (click to toggle)
vecgeom 1.2.8%2Bdfsg-2
  • links: PTS, VCS
  • area: main
  • in suites: sid, trixie
  • size: 24,016 kB
  • sloc: cpp: 88,803; ansic: 6,888; python: 1,035; sh: 582; sql: 538; makefile: 23
file content (110 lines) | stat: -rw-r--r-- 3,646 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
/*
 * EmbreeManagerTest.cpp
 *
 *  Created on: May 18, 2018
 *      Author: swenzel
 */

#include "VecGeom/volumes/utilities/VolumeUtilities.h"
#include "VecGeom/base/Global.h"
#include "VecGeom/base/Vector3D.h"
#include "VecGeom/management/EmbreeManager.h"
#include "memory.h" // for unique ptr
#include <iostream>
#include <embree3/rtcore_ray.h>

using namespace vecgeom;

int g_x;
double DistanceToIn(RTCScene scene, double x, double y, double z, double dx, double dy, double dz, int &geomID,
                    bool &inside)
{
  RTCRayHit ray; // EMBREE_FIXME: use RTCRay for occlusion rays
  ray.ray.flags = 0;
  ray.ray.org_x = x;
  ray.ray.org_y = y;
  ray.ray.org_z = z;
  ray.ray.dir_x = dx;
  ray.ray.dir_y = dy;
  ray.ray.dir_z = dz;
  ray.ray.tnear = 0.;
  ray.ray.tfar  = 1E20f;
  {
    RTCIntersectContext context;

    g_x = x;

    // we can't do a real capture but we do it via some global variables
    auto customFilter = [](const RTCFilterFunctionNArguments *args) {
      assert(args->N == 1);
      std::cerr << "CUSTOM FILTER USED " << g_x << "\n";
      int *valid = args->valid;
      valid[0]   = 0;
    };

    rtcInitIntersectContext(&context);
    context.filter = customFilter;
    rtcIntersect1(scene, &context, &ray);
    ray.hit.Ng_x = -ray.hit.Ng_x;
    ray.hit.Ng_y = -ray.hit.Ng_y;
    ray.hit.Ng_z = -ray.hit.Ng_z;
  }
  geomID = ray.hit.geomID;
  return ray.ray.tfar;
}

void calcLowerUpper(Vector3D<double> origin, double s, Vector3D<double> &lower, Vector3D<double> &upper)
{
  lower = Vector3D<double>(origin.x() - s, origin.y() - s, origin.z() - s);
  upper = Vector3D<double>(origin.x() + s, origin.y() + s, origin.z() + s);
}

int main()
{
  int nObjects = 2;
  int nBoxes   = 2 * nObjects;

  // setup a simple bounding box by defining lower/upper corners
  auto boxcontainer = std::make_unique<EmbreeManager::ABBox_s[]>(nBoxes);

  // displacement + size
  for (int i = 0; i < nObjects; ++i) {
    Vector3D<double> origin(5 * i, 0, 0);
    Vector3D<double> lower, upper;
    calcLowerUpper(origin, 1, lower, upper);
    boxcontainer[2 * i]     = lower;
    boxcontainer[2 * i + 1] = upper;
  }

  // this yields a structure which we can use for rayTracing with Embree
  auto structure = EmbreeManager::Instance().BuildStructureFromBoundingBoxes(boxcontainer.get(), nObjects);

  int geomID  = -1;
  bool inside = false;
  std::cerr << DistanceToIn(structure->fScene, -20, 0, 0, 1, 0, 0, geomID, inside) << "\n";
  std::cerr << "GEOMID " << geomID << "\n";
  std::cerr << DistanceToIn(structure->fScene, 0, -20, 0, 0, 1, 0, geomID, inside) << "\n";
  std::cerr << "GEOMID " << geomID << "\n";
  std::cerr << DistanceToIn(structure->fScene, 0, 0, -20, 0, 0, 1, geomID, inside) << "\n";
  std::cerr << "GEOMID " << geomID << "\n";
  std::cerr << DistanceToIn(structure->fScene, 20, 0, 0, -1, 0, 0, geomID, inside) << "\n";
  std::cerr << "GEOMID " << geomID << "\n";
  std::cerr << DistanceToIn(structure->fScene, 0, 20, 0, 0, -1, 0, geomID, inside) << "\n";
  std::cerr << "GEOMID " << geomID << "\n";
  std::cerr << DistanceToIn(structure->fScene, 0, 0, 20, 0, 0, -1, geomID, inside) << "\n";
  std::cerr << "GEOMID " << geomID << "\n";
  std::cerr << "inside " << inside << "\n";

  // going away
  std::cerr << DistanceToIn(structure->fScene, 0, 0, 20, 0, 0, 1, geomID, inside) << "\n";
  std::cerr << "GEOMID " << geomID << "\n";

  // from inside
  std::cerr << DistanceToIn(structure->fScene, 0, 0, 0, 0, 0, 1, geomID, inside) << "\n";
  std::cerr << "GEOMID " << geomID << "\n";
  std::cerr << "inside " << inside << "\n";

  // use normal to see if inside / outside of geometry

  return 0;
}