-
Notifications
You must be signed in to change notification settings - Fork 2
/
BigMeshSampler.cpp
108 lines (87 loc) · 3.85 KB
/
BigMeshSampler.cpp
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 2022-2022 Stefan Zellmann //
// //
// Licensed under the Apache License, Version 2.0 (the "License"); //
// you may not use this file except in compliance with the License. //
// You may obtain a copy of the License at //
// //
// http://www.apache.org/licenses/LICENSE-2.0 //
// //
// Unless required by applicable law or agreed to in writing, software //
// distributed under the License is distributed on an "AS IS" BASIS, //
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. //
// See the License for the specific language governing permissions and //
// limitations under the License. //
// ======================================================================== //
#include "BigMeshSampler.h"
namespace exa {
bool BigMeshSampler::build(OWLContext owl, Model::SP model)
{
#ifdef HAVE_BIGMESH
bmModel = model->as<BigMeshModel>();
if (!bmModel)
return false;
if (!bmSampler)
bmSampler = std::make_shared<fun::BigMeshSampler>();
bmSampler->build(owl,bmModel->getFunModel());
bmModel->grid->worldBounds = model->cellBounds;
//std::cout << model->cellBounds << '\n';
const vec3i dims = bmModel->grid->dims;
bmModel->grid->valueRanges = owlDeviceBufferCreate(owl, OWL_USER_TYPE(range1f),
dims.x*size_t(dims.y)*dims.z,
nullptr);
bmModel->grid->maxOpacities = owlDeviceBufferCreate(owl, OWL_FLOAT,
dims.x*size_t(dims.y)*dims.z,
nullptr);
bmSampler->buildMacroCells((range1f*)owlBufferGetPointer(bmModel->grid->valueRanges,0),
bmModel->grid->dims, bmModel->grid->worldBounds);
#ifdef EXA_STITCH_MIRROR_EXAJET
owl4x3f &mirrorTransform = model->mirrorTransform;
#endif
#ifdef EXA_STITCH_MIRROR_EXAJET
bmModel->grid->deviceTraversable.traversable.dims = dims;
bmModel->grid->deviceTraversable.traversable.bounds = model->cellBounds;
bmModel->grid->deviceTraversable.mirrorInvTransform = rcp((const affine3f &)mirrorTransform);
bmModel->grid->deviceTraversable.mirrorPlane.axis = 1;
bmModel->grid->deviceTraversable.mirrorPlane.offset = model->cellBounds.upper.y;
#else
bmModel->grid->deviceTraversable.dims = dims;
bmModel->grid->deviceTraversable.bounds = model->cellBounds;
#endif
Sampler::majorantAccel.grid = bmModel->grid;
Sampler::maxOpacities = bmModel->grid->maxOpacities;
return true;
#else
return false;
#endif
}
void BigMeshSampler::computeMaxOpacities(OWLContext owl,
OWLBuffer colorMap,
range1f xfRange)
{
#ifdef HAVE_BIGMESH
if (!bmModel->grid || bmModel->grid->dims==vec3i(0))
return;
bmModel->grid->computeMaxOpacities(owl,colorMap,xfRange);
#endif
}
std::vector<OWLVarDecl> BigMeshSampler::getLPVariables()
{
#ifdef HAVE_BIGMESH
if (!bmSampler)
bmSampler = std::make_shared<fun::BigMeshSampler>();
return bmSampler->getLPVariables();
#else
return {};
#endif
}
void BigMeshSampler::setLPs(OWLParams lp)
{
#ifdef HAVE_BIGMESH
if (!bmSampler)
bmSampler = std::make_shared<fun::BigMeshSampler>();
bmSampler->setLPs(lp);
#endif
}
} // ::exa
// vim: sw=2:expandtab:softtabstop=2:ts=2:cino=\:0g0t0