Blender  V3.3
Pow23GridDensityProvider.cpp
Go to the documentation of this file.
1 /* SPDX-License-Identifier: GPL-2.0-or-later */
2 
9 
10 #include "BKE_global.h"
11 
12 namespace Freestyle {
13 
14 Pow23GridDensityProvider::Pow23GridDensityProvider(OccluderSource &source,
15  const real proscenium[4],
16  unsigned numFaces)
17  : GridDensityProvider(source), numFaces(numFaces)
18 {
19  initialize(proscenium);
20 }
21 
22 Pow23GridDensityProvider::Pow23GridDensityProvider(OccluderSource &source,
23  const BBox<Vec3r> &bbox,
25  unsigned numFaces)
26  : GridDensityProvider(source), numFaces(numFaces)
27 {
28  real proscenium[4];
29  calculateQuickProscenium(transform, bbox, proscenium);
30 
31  initialize(proscenium);
32 }
33 
34 Pow23GridDensityProvider::Pow23GridDensityProvider(OccluderSource &source, unsigned numFaces)
35  : GridDensityProvider(source), numFaces(numFaces)
36 {
37  real proscenium[4];
39 
40  initialize(proscenium);
41 }
42 
43 void Pow23GridDensityProvider::initialize(const real proscenium[4])
44 {
45  float prosceniumWidth = (proscenium[1] - proscenium[0]);
46  float prosceniumHeight = (proscenium[3] - proscenium[2]);
47  real cellArea = prosceniumWidth * prosceniumHeight / pow(numFaces, 2.0f / 3.0f);
48  if (G.debug & G_DEBUG_FREESTYLE) {
49  cout << prosceniumWidth << " x " << prosceniumHeight << " grid with cells of area " << cellArea
50  << "." << endl;
51  }
52 
53  _cellSize = sqrt(cellArea);
54  // Now we know how many cells make each side of our grid
55  _cellsX = ceil(prosceniumWidth / _cellSize);
56  _cellsY = ceil(prosceniumHeight / _cellSize);
57  if (G.debug & G_DEBUG_FREESTYLE) {
58  cout << _cellsX << "x" << _cellsY << " cells of size " << _cellSize << " square." << endl;
59  }
60 
61  // Make sure the grid exceeds the proscenium by a small amount
62  float safetyZone = 0.1;
63  if (_cellsX * _cellSize < prosceniumWidth * (1.0 + safetyZone)) {
64  _cellsX = ceil(prosceniumWidth * (1.0 + safetyZone) / _cellSize);
65  }
66  if (_cellsY * _cellSize < prosceniumHeight * (1.0 + safetyZone)) {
67  _cellsY = ceil(prosceniumHeight * (1.0 + safetyZone) / _cellSize);
68  }
69  if (G.debug & G_DEBUG_FREESTYLE) {
70  cout << _cellsX << "x" << _cellsY << " cells of size " << _cellSize << " square." << endl;
71  }
72 
73  // Find grid origin
74  _cellOrigin[0] = ((proscenium[0] + proscenium[1]) / 2.0) - (_cellsX / 2.0) * _cellSize;
75  _cellOrigin[1] = ((proscenium[2] + proscenium[3]) / 2.0) - (_cellsY / 2.0) * _cellSize;
76 }
77 
79  : numFaces(numFaces)
80 {
81 }
82 
84  OccluderSource &source, const real proscenium[4])
85 {
86  return AutoPtr<GridDensityProvider>(new Pow23GridDensityProvider(source, proscenium, numFaces));
87 }
88 
90  OccluderSource &source, const BBox<Vec3r> &bbox, const GridHelpers::Transform &transform)
91 {
93  new Pow23GridDensityProvider(source, bbox, transform, numFaces));
94 }
95 
97  OccluderSource &source)
98 {
100 }
101 
102 } /* namespace Freestyle */
@ G_DEBUG_FREESTYLE
Definition: BKE_global.h:181
sqrt(x)+1/max(0
Class to define a cell grid surrounding the projected image of a scene.
SIMD_FORCE_INLINE btVector3 transform(const btVector3 &point) const
static void calculateOptimalProscenium(OccluderSource &source, real proscenium[4])
static void calculateQuickProscenium(const GridHelpers::Transform &transform, const BBox< Vec3r > &bbox, real proscenium[4])
AutoPtr< GridDensityProvider > newGridDensityProvider(OccluderSource &source, const real proscenium[4])
ccl_device_inline float3 ceil(const float3 &a)
Definition: math_float3.h:363
ccl_device_inline float3 pow(float3 v, float e)
Definition: math_float3.h:533
#define G(x, y, z)
inherits from class Rep
Definition: AppCanvas.cpp:18
double real
Definition: Precision.h:12