conquer3d 0.4.2__tar.gz → 0.4.5__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {conquer3d-0.4.2/conquer3d.egg-info → conquer3d-0.4.5}/PKG-INFO +22 -40
- {conquer3d-0.4.2 → conquer3d-0.4.5}/README.md +21 -39
- {conquer3d-0.4.2 → conquer3d-0.4.5}/conquer3d/_C.so +0 -0
- {conquer3d-0.4.2 → conquer3d-0.4.5}/conquer3d/csrc/binds/data_structure/triangle_mesh.cpp +155 -0
- {conquer3d-0.4.2 → conquer3d-0.4.5}/conquer3d/csrc/data_structure/triangle_mesh.cu +182 -0
- {conquer3d-0.4.2 → conquer3d-0.4.5}/conquer3d/csrc/data_structure/triangle_mesh.h +45 -0
- {conquer3d-0.4.2 → conquer3d-0.4.5}/conquer3d/csrc/primitive/triangle.h +91 -0
- {conquer3d-0.4.2 → conquer3d-0.4.5/conquer3d.egg-info}/PKG-INFO +22 -40
- {conquer3d-0.4.2 → conquer3d-0.4.5}/pyproject.toml +1 -1
- {conquer3d-0.4.2 → conquer3d-0.4.5}/LICENSE +0 -0
- {conquer3d-0.4.2 → conquer3d-0.4.5}/MANIFEST.in +0 -0
- {conquer3d-0.4.2 → conquer3d-0.4.5}/conquer3d/_C.pyi +0 -0
- {conquer3d-0.4.2 → conquer3d-0.4.5}/conquer3d/__init__.py +0 -0
- {conquer3d-0.4.2 → conquer3d-0.4.5}/conquer3d/conversion/__init__.py +0 -0
- {conquer3d-0.4.2 → conquer3d-0.4.5}/conquer3d/conversion/grid.py +0 -0
- {conquer3d-0.4.2 → conquer3d-0.4.5}/conquer3d/conversion/mesh.py +0 -0
- {conquer3d-0.4.2 → conquer3d-0.4.5}/conquer3d/conversion/tmesh.py +0 -0
- {conquer3d-0.4.2 → conquer3d-0.4.5}/conquer3d/creation/__init__.py +0 -0
- {conquer3d-0.4.2 → conquer3d-0.4.5}/conquer3d/creation/triangle_creation.py +0 -0
- {conquer3d-0.4.2 → conquer3d-0.4.5}/conquer3d/csrc/binds/creation/triangle_creation.cpp +0 -0
- {conquer3d-0.4.2 → conquer3d-0.4.5}/conquer3d/csrc/binds/data_structure/bvh.cpp +0 -0
- {conquer3d-0.4.2 → conquer3d-0.4.5}/conquer3d/csrc/binds/data_structure/grid.cpp +0 -0
- {conquer3d-0.4.2 → conquer3d-0.4.5}/conquer3d/csrc/binds/data_structure/gs_bvh.cpp +0 -0
- {conquer3d-0.4.2 → conquer3d-0.4.5}/conquer3d/csrc/binds/data_structure/kdtree.cpp +0 -0
- {conquer3d-0.4.2 → conquer3d-0.4.5}/conquer3d/csrc/binds/data_structure/mesh_bvh.cpp +0 -0
- {conquer3d-0.4.2 → conquer3d-0.4.5}/conquer3d/csrc/binds/data_structure/pgs_bvh.cpp +0 -0
- {conquer3d-0.4.2 → conquer3d-0.4.5}/conquer3d/csrc/binds/data_structure/zcurve.cpp +0 -0
- {conquer3d-0.4.2 → conquer3d-0.4.5}/conquer3d/csrc/binds/ops/chamfer.cpp +0 -0
- {conquer3d-0.4.2 → conquer3d-0.4.5}/conquer3d/csrc/binds/ops/mc.cpp +0 -0
- {conquer3d-0.4.2 → conquer3d-0.4.5}/conquer3d/csrc/binds/primitive/gs.cpp +0 -0
- {conquer3d-0.4.2 → conquer3d-0.4.5}/conquer3d/csrc/binds/primitive/pgs.cpp +0 -0
- {conquer3d-0.4.2 → conquer3d-0.4.5}/conquer3d/csrc/binds/primitive/ray.cpp +0 -0
- {conquer3d-0.4.2 → conquer3d-0.4.5}/conquer3d/csrc/binds/primitive/triangle.cpp +0 -0
- {conquer3d-0.4.2 → conquer3d-0.4.5}/conquer3d/csrc/check.h +0 -0
- {conquer3d-0.4.2 → conquer3d-0.4.5}/conquer3d/csrc/constants.h +0 -0
- {conquer3d-0.4.2 → conquer3d-0.4.5}/conquer3d/csrc/creation/triangle_creation.h +0 -0
- {conquer3d-0.4.2 → conquer3d-0.4.5}/conquer3d/csrc/data_structure/bvh.cu +0 -0
- {conquer3d-0.4.2 → conquer3d-0.4.5}/conquer3d/csrc/data_structure/bvh.h +0 -0
- {conquer3d-0.4.2 → conquer3d-0.4.5}/conquer3d/csrc/data_structure/gs_bvh.h +0 -0
- {conquer3d-0.4.2 → conquer3d-0.4.5}/conquer3d/csrc/data_structure/kdtree.cu +0 -0
- {conquer3d-0.4.2 → conquer3d-0.4.5}/conquer3d/csrc/data_structure/kdtree.h +0 -0
- {conquer3d-0.4.2 → conquer3d-0.4.5}/conquer3d/csrc/data_structure/mesh_bvh.cu +0 -0
- {conquer3d-0.4.2 → conquer3d-0.4.5}/conquer3d/csrc/data_structure/mesh_bvh.h +0 -0
- {conquer3d-0.4.2 → conquer3d-0.4.5}/conquer3d/csrc/data_structure/pgs_bvh.h +0 -0
- {conquer3d-0.4.2 → conquer3d-0.4.5}/conquer3d/csrc/data_structure/zcurve.cu +0 -0
- {conquer3d-0.4.2 → conquer3d-0.4.5}/conquer3d/csrc/data_structure/zcurve.h +0 -0
- {conquer3d-0.4.2 → conquer3d-0.4.5}/conquer3d/csrc/maths/f2x2.h +0 -0
- {conquer3d-0.4.2 → conquer3d-0.4.5}/conquer3d/csrc/maths/f3x1.h +0 -0
- {conquer3d-0.4.2 → conquer3d-0.4.5}/conquer3d/csrc/maths/f3x3.h +0 -0
- {conquer3d-0.4.2 → conquer3d-0.4.5}/conquer3d/csrc/maths/f3x4.h +0 -0
- {conquer3d-0.4.2 → conquer3d-0.4.5}/conquer3d/csrc/maths/f4x1.h +0 -0
- {conquer3d-0.4.2 → conquer3d-0.4.5}/conquer3d/csrc/maths/f4x4.h +0 -0
- {conquer3d-0.4.2 → conquer3d-0.4.5}/conquer3d/csrc/maths/maths.h +0 -0
- {conquer3d-0.4.2 → conquer3d-0.4.5}/conquer3d/csrc/maths/ops.h +0 -0
- {conquer3d-0.4.2 → conquer3d-0.4.5}/conquer3d/csrc/ops/chamfer.cu +0 -0
- {conquer3d-0.4.2 → conquer3d-0.4.5}/conquer3d/csrc/ops/chamfer.h +0 -0
- {conquer3d-0.4.2 → conquer3d-0.4.5}/conquer3d/csrc/ops/mc.cu +0 -0
- {conquer3d-0.4.2 → conquer3d-0.4.5}/conquer3d/csrc/ops/mc.h +0 -0
- {conquer3d-0.4.2 → conquer3d-0.4.5}/conquer3d/csrc/ops/mc_data.h +0 -0
- {conquer3d-0.4.2 → conquer3d-0.4.5}/conquer3d/csrc/primitive/aabb.h +0 -0
- {conquer3d-0.4.2 → conquer3d-0.4.5}/conquer3d/csrc/primitive/edge.h +0 -0
- {conquer3d-0.4.2 → conquer3d-0.4.5}/conquer3d/csrc/primitive/gs.cu +0 -0
- {conquer3d-0.4.2 → conquer3d-0.4.5}/conquer3d/csrc/primitive/gs.h +0 -0
- {conquer3d-0.4.2 → conquer3d-0.4.5}/conquer3d/csrc/primitive/gs_aabb.cu +0 -0
- {conquer3d-0.4.2 → conquer3d-0.4.5}/conquer3d/csrc/primitive/gs_math.cuh +0 -0
- {conquer3d-0.4.2 → conquer3d-0.4.5}/conquer3d/csrc/primitive/pgs.cu +0 -0
- {conquer3d-0.4.2 → conquer3d-0.4.5}/conquer3d/csrc/primitive/pgs.h +0 -0
- {conquer3d-0.4.2 → conquer3d-0.4.5}/conquer3d/csrc/primitive/pgs_aabb.cu +0 -0
- {conquer3d-0.4.2 → conquer3d-0.4.5}/conquer3d/csrc/primitive/pgs_math.cuh +0 -0
- {conquer3d-0.4.2 → conquer3d-0.4.5}/conquer3d/csrc/primitive/ray.h +0 -0
- {conquer3d-0.4.2 → conquer3d-0.4.5}/conquer3d/csrc/pybind.cpp +0 -0
- {conquer3d-0.4.2 → conquer3d-0.4.5}/conquer3d/data/__init__.py +0 -0
- {conquer3d-0.4.2 → conquer3d-0.4.5}/conquer3d/data/assets/__init__.py +0 -0
- {conquer3d-0.4.2 → conquer3d-0.4.5}/conquer3d/data/assets/common.py +0 -0
- {conquer3d-0.4.2 → conquer3d-0.4.5}/conquer3d/data/assets/iphigenia.py +0 -0
- {conquer3d-0.4.2 → conquer3d-0.4.5}/conquer3d/data/collate/__init__.py +0 -0
- {conquer3d-0.4.2 → conquer3d-0.4.5}/conquer3d/data/collate/mesh.py +0 -0
- {conquer3d-0.4.2 → conquer3d-0.4.5}/conquer3d/data/collate/sparse_tensor.py +0 -0
- {conquer3d-0.4.2 → conquer3d-0.4.5}/conquer3d/data/dataset/__init__.py +0 -0
- {conquer3d-0.4.2 → conquer3d-0.4.5}/conquer3d/data/dataset/base_mesh.py +0 -0
- {conquer3d-0.4.2 → conquer3d-0.4.5}/conquer3d/data/dataset/digit3d.py +0 -0
- {conquer3d-0.4.2 → conquer3d-0.4.5}/conquer3d/data/transform/__init__.py +0 -0
- {conquer3d-0.4.2 → conquer3d-0.4.5}/conquer3d/data/transform/base.py +0 -0
- {conquer3d-0.4.2 → conquer3d-0.4.5}/conquer3d/data/transform/ops.py +0 -0
- {conquer3d-0.4.2 → conquer3d-0.4.5}/conquer3d/data/transform/vertex.py +0 -0
- {conquer3d-0.4.2 → conquer3d-0.4.5}/conquer3d/data_structure/__init__.py +0 -0
- {conquer3d-0.4.2 → conquer3d-0.4.5}/conquer3d/data_structure/bmesh.py +0 -0
- {conquer3d-0.4.2 → conquer3d-0.4.5}/conquer3d/data_structure/grid.py +0 -0
- {conquer3d-0.4.2 → conquer3d-0.4.5}/conquer3d/data_structure/sort.py +0 -0
- {conquer3d-0.4.2 → conquer3d-0.4.5}/conquer3d/io/__init__.py +0 -0
- {conquer3d-0.4.2 → conquer3d-0.4.5}/conquer3d/io/obj.py +0 -0
- {conquer3d-0.4.2 → conquer3d-0.4.5}/conquer3d/io/off.py +0 -0
- {conquer3d-0.4.2 → conquer3d-0.4.5}/conquer3d/ops/__init__.py +0 -0
- {conquer3d-0.4.2 → conquer3d-0.4.5}/conquer3d/ops/delaunay_triangulation.py +0 -0
- {conquer3d-0.4.2 → conquer3d-0.4.5}/conquer3d/ops/diff_marching_cubes.py +0 -0
- {conquer3d-0.4.2 → conquer3d-0.4.5}/conquer3d/ops/distance.py +0 -0
- {conquer3d-0.4.2 → conquer3d-0.4.5}/conquer3d/ops/marching_cubes.py +0 -0
- {conquer3d-0.4.2 → conquer3d-0.4.5}/conquer3d/ops/marching_tetrahedra.py +0 -0
- {conquer3d-0.4.2 → conquer3d-0.4.5}/conquer3d/primitive/__init__.py +0 -0
- {conquer3d-0.4.2 → conquer3d-0.4.5}/conquer3d/primitive/gs.py +0 -0
- {conquer3d-0.4.2 → conquer3d-0.4.5}/conquer3d/primitive/pgs.py +0 -0
- {conquer3d-0.4.2 → conquer3d-0.4.5}/conquer3d.egg-info/SOURCES.txt +0 -0
- {conquer3d-0.4.2 → conquer3d-0.4.5}/conquer3d.egg-info/dependency_links.txt +0 -0
- {conquer3d-0.4.2 → conquer3d-0.4.5}/conquer3d.egg-info/not-zip-safe +0 -0
- {conquer3d-0.4.2 → conquer3d-0.4.5}/conquer3d.egg-info/requires.txt +0 -0
- {conquer3d-0.4.2 → conquer3d-0.4.5}/conquer3d.egg-info/top_level.txt +0 -0
- {conquer3d-0.4.2 → conquer3d-0.4.5}/setup.cfg +0 -0
- {conquer3d-0.4.2 → conquer3d-0.4.5}/setup.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: conquer3d
|
|
3
|
-
Version: 0.4.
|
|
3
|
+
Version: 0.4.5
|
|
4
4
|
Summary: Geometric Cuda Tool Box
|
|
5
5
|
Author-email: Do Hoang Khoi <khoido8899@gmail.com>
|
|
6
6
|
License-Expression: MIT
|
|
@@ -88,14 +88,7 @@ twine upload dist/* --verbose
|
|
|
88
88
|
author = {Karras, Tero},
|
|
89
89
|
title = {Maximizing parallelism in the construction of BVHs, octrees, and k-d trees},
|
|
90
90
|
year = {2012},
|
|
91
|
-
isbn = {9783905674415},
|
|
92
|
-
publisher = {Eurographics Association},
|
|
93
|
-
address = {Goslar, DEU},
|
|
94
91
|
booktitle = {Proceedings of the Fourth ACM SIGGRAPH / Eurographics Conference on High-Performance Graphics},
|
|
95
|
-
pages = {33–37},
|
|
96
|
-
numpages = {5},
|
|
97
|
-
location = {Paris, France},
|
|
98
|
-
series = {EGGH-HPG'12}
|
|
99
92
|
}
|
|
100
93
|
```
|
|
101
94
|
|
|
@@ -104,18 +97,7 @@ twine upload dist/* --verbose
|
|
|
104
97
|
author = {M\"{o}ller, Tomas},
|
|
105
98
|
title = {A fast triangle-triangle intersection test},
|
|
106
99
|
year = {1997},
|
|
107
|
-
issue_date = {1997},
|
|
108
|
-
publisher = {A. K. Peters, Ltd.},
|
|
109
|
-
address = {USA},
|
|
110
|
-
volume = {2},
|
|
111
|
-
number = {2},
|
|
112
|
-
issn = {1086-7651},
|
|
113
|
-
url = {https://doi.org/10.1080/10867651.1997.10487472},
|
|
114
|
-
doi = {10.1080/10867651.1997.10487472},
|
|
115
100
|
journal = {J. Graph. Tools},
|
|
116
|
-
month = nov,
|
|
117
|
-
pages = {25–30},
|
|
118
|
-
numpages = {6}
|
|
119
101
|
}
|
|
120
102
|
```
|
|
121
103
|
|
|
@@ -124,36 +106,36 @@ twine upload dist/* --verbose
|
|
|
124
106
|
author = {M\"{o}ller, Tomas and Trumbore, Ben},
|
|
125
107
|
title = {Fast, minimum storage ray/triangle intersection},
|
|
126
108
|
year = {2005},
|
|
127
|
-
|
|
128
|
-
publisher = {Association for Computing Machinery},
|
|
129
|
-
address = {New York, NY, USA},
|
|
130
|
-
url = {https://doi.org/10.1145/1198555.1198746},
|
|
131
|
-
doi = {10.1145/1198555.1198746},
|
|
132
|
-
pages = {7–es},
|
|
133
|
-
keywords = {base transformation, intersection, ray tracing, ray/triangle-intersection},
|
|
134
|
-
location = {Los Angeles, California},
|
|
135
|
-
series = {SIGGRAPH '05}
|
|
109
|
+
booktitle = {ACM SIGGRAPH 2005 Courses},
|
|
136
110
|
}
|
|
137
111
|
```
|
|
138
112
|
|
|
139
113
|
```bibtex
|
|
140
|
-
@
|
|
141
|
-
author="Meyer, Mark
|
|
142
|
-
and Desbrun, Mathieu
|
|
143
|
-
and Schr{\"o}der, Peter
|
|
144
|
-
and Barr, Alan H.",
|
|
145
|
-
editor="Hege, Hans-Christian
|
|
146
|
-
and Polthier, Konrad",
|
|
114
|
+
@inproceedings{10.1007/978-3-662-05105-4_2,
|
|
115
|
+
author="Meyer, Mark and Desbrun, Mathieu and Schr{\"o}der, Peter and Barr, Alan H.",
|
|
147
116
|
title="Discrete Differential-Geometry Operators for Triangulated 2-Manifolds",
|
|
148
117
|
booktitle="Visualization and Mathematics III",
|
|
149
|
-
year="2003"
|
|
150
|
-
publisher="Springer Berlin Heidelberg",
|
|
151
|
-
address="Berlin, Heidelberg",
|
|
152
|
-
pages="35--57",
|
|
153
|
-
isbn="978-3-662-05105-4"
|
|
118
|
+
year="2003"
|
|
154
119
|
}
|
|
155
120
|
```
|
|
156
121
|
|
|
122
|
+
```bibtex
|
|
123
|
+
@article{9167456,
|
|
124
|
+
author={Khan, Dawar and Plopski, Alexander and Fujimoto, Yuichiro and Kanbara, Masayuki and Jabeen, Gul and Zhang, Yongjie Jessica and Zhang, Xiaopeng and Kato, Hirokazu},
|
|
125
|
+
journal={IEEE Transactions on Visualization and Computer Graphics},
|
|
126
|
+
title={Surface Remeshing: A Systematic Literature Review of Methods and Research Directions},
|
|
127
|
+
year={2022}
|
|
128
|
+
}
|
|
129
|
+
```
|
|
130
|
+
|
|
131
|
+
```bibtex
|
|
132
|
+
@article{4487066,
|
|
133
|
+
author={Dietrich, Carlos A. and Scheidegger, Carlos E. and Schreiner, John and Comba, João L.D. and Nedel, Luciana P. and Silva, Cláudio T.},
|
|
134
|
+
journal={IEEE Transactions on Visualization and Computer Graphics},
|
|
135
|
+
title={Edge Transformations for Improving Mesh Quality of Marching Cubes},
|
|
136
|
+
year={2009}}
|
|
137
|
+
```
|
|
138
|
+
|
|
157
139
|
## Blog Post
|
|
158
140
|
- [Thinking Parallel, Part I: Collision Detection on the GPU](https://developer.nvidia.com/blog/thinking-parallel-part-i-collision-detection-gpu/)
|
|
159
141
|
- [Thinking Parallel, Part II: Tree Traversal on the GPU](https://developer.nvidia.com/blog/thinking-parallel-part-ii-tree-traversal-gpu/)
|
|
@@ -58,14 +58,7 @@ twine upload dist/* --verbose
|
|
|
58
58
|
author = {Karras, Tero},
|
|
59
59
|
title = {Maximizing parallelism in the construction of BVHs, octrees, and k-d trees},
|
|
60
60
|
year = {2012},
|
|
61
|
-
isbn = {9783905674415},
|
|
62
|
-
publisher = {Eurographics Association},
|
|
63
|
-
address = {Goslar, DEU},
|
|
64
61
|
booktitle = {Proceedings of the Fourth ACM SIGGRAPH / Eurographics Conference on High-Performance Graphics},
|
|
65
|
-
pages = {33–37},
|
|
66
|
-
numpages = {5},
|
|
67
|
-
location = {Paris, France},
|
|
68
|
-
series = {EGGH-HPG'12}
|
|
69
62
|
}
|
|
70
63
|
```
|
|
71
64
|
|
|
@@ -74,18 +67,7 @@ twine upload dist/* --verbose
|
|
|
74
67
|
author = {M\"{o}ller, Tomas},
|
|
75
68
|
title = {A fast triangle-triangle intersection test},
|
|
76
69
|
year = {1997},
|
|
77
|
-
issue_date = {1997},
|
|
78
|
-
publisher = {A. K. Peters, Ltd.},
|
|
79
|
-
address = {USA},
|
|
80
|
-
volume = {2},
|
|
81
|
-
number = {2},
|
|
82
|
-
issn = {1086-7651},
|
|
83
|
-
url = {https://doi.org/10.1080/10867651.1997.10487472},
|
|
84
|
-
doi = {10.1080/10867651.1997.10487472},
|
|
85
70
|
journal = {J. Graph. Tools},
|
|
86
|
-
month = nov,
|
|
87
|
-
pages = {25–30},
|
|
88
|
-
numpages = {6}
|
|
89
71
|
}
|
|
90
72
|
```
|
|
91
73
|
|
|
@@ -94,36 +76,36 @@ twine upload dist/* --verbose
|
|
|
94
76
|
author = {M\"{o}ller, Tomas and Trumbore, Ben},
|
|
95
77
|
title = {Fast, minimum storage ray/triangle intersection},
|
|
96
78
|
year = {2005},
|
|
97
|
-
|
|
98
|
-
publisher = {Association for Computing Machinery},
|
|
99
|
-
address = {New York, NY, USA},
|
|
100
|
-
url = {https://doi.org/10.1145/1198555.1198746},
|
|
101
|
-
doi = {10.1145/1198555.1198746},
|
|
102
|
-
pages = {7–es},
|
|
103
|
-
keywords = {base transformation, intersection, ray tracing, ray/triangle-intersection},
|
|
104
|
-
location = {Los Angeles, California},
|
|
105
|
-
series = {SIGGRAPH '05}
|
|
79
|
+
booktitle = {ACM SIGGRAPH 2005 Courses},
|
|
106
80
|
}
|
|
107
81
|
```
|
|
108
82
|
|
|
109
83
|
```bibtex
|
|
110
|
-
@
|
|
111
|
-
author="Meyer, Mark
|
|
112
|
-
and Desbrun, Mathieu
|
|
113
|
-
and Schr{\"o}der, Peter
|
|
114
|
-
and Barr, Alan H.",
|
|
115
|
-
editor="Hege, Hans-Christian
|
|
116
|
-
and Polthier, Konrad",
|
|
84
|
+
@inproceedings{10.1007/978-3-662-05105-4_2,
|
|
85
|
+
author="Meyer, Mark and Desbrun, Mathieu and Schr{\"o}der, Peter and Barr, Alan H.",
|
|
117
86
|
title="Discrete Differential-Geometry Operators for Triangulated 2-Manifolds",
|
|
118
87
|
booktitle="Visualization and Mathematics III",
|
|
119
|
-
year="2003"
|
|
120
|
-
publisher="Springer Berlin Heidelberg",
|
|
121
|
-
address="Berlin, Heidelberg",
|
|
122
|
-
pages="35--57",
|
|
123
|
-
isbn="978-3-662-05105-4"
|
|
88
|
+
year="2003"
|
|
124
89
|
}
|
|
125
90
|
```
|
|
126
91
|
|
|
92
|
+
```bibtex
|
|
93
|
+
@article{9167456,
|
|
94
|
+
author={Khan, Dawar and Plopski, Alexander and Fujimoto, Yuichiro and Kanbara, Masayuki and Jabeen, Gul and Zhang, Yongjie Jessica and Zhang, Xiaopeng and Kato, Hirokazu},
|
|
95
|
+
journal={IEEE Transactions on Visualization and Computer Graphics},
|
|
96
|
+
title={Surface Remeshing: A Systematic Literature Review of Methods and Research Directions},
|
|
97
|
+
year={2022}
|
|
98
|
+
}
|
|
99
|
+
```
|
|
100
|
+
|
|
101
|
+
```bibtex
|
|
102
|
+
@article{4487066,
|
|
103
|
+
author={Dietrich, Carlos A. and Scheidegger, Carlos E. and Schreiner, John and Comba, João L.D. and Nedel, Luciana P. and Silva, Cláudio T.},
|
|
104
|
+
journal={IEEE Transactions on Visualization and Computer Graphics},
|
|
105
|
+
title={Edge Transformations for Improving Mesh Quality of Marching Cubes},
|
|
106
|
+
year={2009}}
|
|
107
|
+
```
|
|
108
|
+
|
|
127
109
|
## Blog Post
|
|
128
110
|
- [Thinking Parallel, Part I: Collision Detection on the GPU](https://developer.nvidia.com/blog/thinking-parallel-part-i-collision-detection-gpu/)
|
|
129
111
|
- [Thinking Parallel, Part II: Tree Traversal on the GPU](https://developer.nvidia.com/blog/thinking-parallel-part-ii-tree-traversal-gpu/)
|
|
Binary file
|
|
@@ -104,6 +104,16 @@ torch::Tensor TriangleMesh::get_vertex_degrees()
|
|
|
104
104
|
return this->vertex_degrees;
|
|
105
105
|
}
|
|
106
106
|
|
|
107
|
+
float TriangleMesh::get_valence_567_percentage()
|
|
108
|
+
{
|
|
109
|
+
torch::Tensor degrees = this->get_vertex_degrees();
|
|
110
|
+
if (degrees.numel() == 0) return 0.0f;
|
|
111
|
+
|
|
112
|
+
torch::Tensor mask = (degrees == 5).logical_or(degrees == 6).logical_or(degrees == 7);
|
|
113
|
+
float count = mask.sum().item<float>();
|
|
114
|
+
return (count / degrees.numel()) * 100.0f;
|
|
115
|
+
}
|
|
116
|
+
|
|
107
117
|
void TriangleMesh::compute_vertex_lb_uniform()
|
|
108
118
|
{
|
|
109
119
|
if (this->vertex_lb_uniform.defined()) return;
|
|
@@ -491,6 +501,106 @@ torch::Tensor TriangleMesh::get_surface_area()
|
|
|
491
501
|
return this->surface_area;
|
|
492
502
|
}
|
|
493
503
|
|
|
504
|
+
std::tuple<float, float> TriangleMesh::get_quality() {
|
|
505
|
+
if (this->num_triangles == 0) return std::make_tuple(0.0f, 0.0f);
|
|
506
|
+
|
|
507
|
+
auto options = torch::TensorOptions().dtype(torch::kFloat32).device(this->vertices.device());
|
|
508
|
+
torch::Tensor qualities = torch::empty({static_cast<int64_t>(this->num_triangles)}, options);
|
|
509
|
+
|
|
510
|
+
triangle_mesh::compute_quality(
|
|
511
|
+
this->num_triangles,
|
|
512
|
+
reinterpret_cast<const float3*>(this->vertices.data_ptr<float>()),
|
|
513
|
+
reinterpret_cast<const int3*>(this->triangles.data_ptr<int>()),
|
|
514
|
+
reinterpret_cast<float*>(qualities.data_ptr<float>())
|
|
515
|
+
);
|
|
516
|
+
|
|
517
|
+
float min_q = qualities.min().item<float>();
|
|
518
|
+
float avg_q = qualities.mean().item<float>();
|
|
519
|
+
|
|
520
|
+
return std::make_tuple(min_q, avg_q);
|
|
521
|
+
}
|
|
522
|
+
|
|
523
|
+
torch::Tensor TriangleMesh::get_aspect_ratio(int mode) {
|
|
524
|
+
auto options = torch::TensorOptions().dtype(torch::kFloat32).device(this->vertices.device());
|
|
525
|
+
torch::Tensor ar = torch::empty({static_cast<int64_t>(this->num_triangles)}, options);
|
|
526
|
+
|
|
527
|
+
if (this->num_triangles == 0) return ar;
|
|
528
|
+
|
|
529
|
+
triangle_mesh::compute_aspect_ratio(
|
|
530
|
+
this->num_triangles,
|
|
531
|
+
reinterpret_cast<const float3*>(this->vertices.data_ptr<float>()),
|
|
532
|
+
reinterpret_cast<const int3*>(this->triangles.data_ptr<int>()),
|
|
533
|
+
mode,
|
|
534
|
+
reinterpret_cast<float*>(ar.data_ptr<float>())
|
|
535
|
+
);
|
|
536
|
+
|
|
537
|
+
return ar;
|
|
538
|
+
}
|
|
539
|
+
|
|
540
|
+
torch::Tensor TriangleMesh::get_radii_ratio() {
|
|
541
|
+
auto options = torch::TensorOptions().dtype(torch::kFloat32).device(this->vertices.device());
|
|
542
|
+
torch::Tensor ratios = torch::empty({static_cast<int64_t>(this->num_triangles)}, options);
|
|
543
|
+
|
|
544
|
+
if (this->num_triangles == 0) return ratios;
|
|
545
|
+
|
|
546
|
+
triangle_mesh::compute_radii_ratio(
|
|
547
|
+
this->num_triangles,
|
|
548
|
+
reinterpret_cast<const float3*>(this->vertices.data_ptr<float>()),
|
|
549
|
+
reinterpret_cast<const int3*>(this->triangles.data_ptr<int>()),
|
|
550
|
+
reinterpret_cast<float*>(ratios.data_ptr<float>())
|
|
551
|
+
);
|
|
552
|
+
|
|
553
|
+
return ratios;
|
|
554
|
+
}
|
|
555
|
+
|
|
556
|
+
torch::Tensor TriangleMesh::get_triangle_regularity() {
|
|
557
|
+
auto options = torch::TensorOptions().dtype(torch::kFloat32).device(this->vertices.device());
|
|
558
|
+
torch::Tensor regularities = torch::empty({static_cast<int64_t>(this->num_triangles)}, options);
|
|
559
|
+
|
|
560
|
+
if (this->num_triangles == 0) return regularities;
|
|
561
|
+
|
|
562
|
+
triangle_mesh::compute_triangle_regularity(
|
|
563
|
+
this->num_triangles,
|
|
564
|
+
reinterpret_cast<const float3*>(this->vertices.data_ptr<float>()),
|
|
565
|
+
reinterpret_cast<const int3*>(this->triangles.data_ptr<int>()),
|
|
566
|
+
reinterpret_cast<float*>(regularities.data_ptr<float>())
|
|
567
|
+
);
|
|
568
|
+
|
|
569
|
+
return regularities;
|
|
570
|
+
}
|
|
571
|
+
|
|
572
|
+
torch::Tensor TriangleMesh::get_radius_edge_ratio() {
|
|
573
|
+
auto options = torch::TensorOptions().dtype(torch::kFloat32).device(this->vertices.device());
|
|
574
|
+
torch::Tensor ratios = torch::empty({static_cast<int64_t>(this->num_triangles)}, options);
|
|
575
|
+
|
|
576
|
+
if (this->num_triangles == 0) return ratios;
|
|
577
|
+
|
|
578
|
+
triangle_mesh::compute_radius_edge_ratio(
|
|
579
|
+
this->num_triangles,
|
|
580
|
+
reinterpret_cast<const float3*>(this->vertices.data_ptr<float>()),
|
|
581
|
+
reinterpret_cast<const int3*>(this->triangles.data_ptr<int>()),
|
|
582
|
+
reinterpret_cast<float*>(ratios.data_ptr<float>())
|
|
583
|
+
);
|
|
584
|
+
|
|
585
|
+
return ratios;
|
|
586
|
+
}
|
|
587
|
+
|
|
588
|
+
torch::Tensor TriangleMesh::get_angle_deviation() {
|
|
589
|
+
auto options = torch::TensorOptions().dtype(torch::kFloat32).device(this->vertices.device());
|
|
590
|
+
torch::Tensor deviations = torch::empty({static_cast<int64_t>(this->num_triangles)}, options);
|
|
591
|
+
|
|
592
|
+
if (this->num_triangles == 0) return deviations;
|
|
593
|
+
|
|
594
|
+
triangle_mesh::compute_angle_deviation(
|
|
595
|
+
this->num_triangles,
|
|
596
|
+
reinterpret_cast<const float3*>(this->vertices.data_ptr<float>()),
|
|
597
|
+
reinterpret_cast<const int3*>(this->triangles.data_ptr<int>()),
|
|
598
|
+
reinterpret_cast<float*>(deviations.data_ptr<float>())
|
|
599
|
+
);
|
|
600
|
+
|
|
601
|
+
return deviations;
|
|
602
|
+
}
|
|
603
|
+
|
|
494
604
|
void TriangleMesh::compute_edges_to_triangle_map()
|
|
495
605
|
{
|
|
496
606
|
if (this->num_triangles == 0)
|
|
@@ -763,6 +873,12 @@ void bind_ds_triangle_mesh(py::module_ &m)
|
|
|
763
873
|
Returns:
|
|
764
874
|
torch.Tensor - Shape (N,) int32 tensor of vertex degrees.
|
|
765
875
|
)doc")
|
|
876
|
+
.def_property_readonly("valence_567_percentage", &TriangleMesh::get_valence_567_percentage, R"doc(
|
|
877
|
+
Percentage of vertices whose degrees (valences) are 5, 6, or 7.
|
|
878
|
+
|
|
879
|
+
Returns:
|
|
880
|
+
float - Percentage in range [0, 100].
|
|
881
|
+
)doc")
|
|
766
882
|
.def_property_readonly("vertex_lb_uniform", &TriangleMesh::get_vertex_lb_uniform, R"doc(
|
|
767
883
|
Uniform Laplace-Beltrami operator evaluated at each vertex.
|
|
768
884
|
|
|
@@ -793,6 +909,45 @@ void bind_ds_triangle_mesh(py::module_ &m)
|
|
|
793
909
|
Returns:
|
|
794
910
|
torch.Tensor - Total surface area of the mesh.
|
|
795
911
|
)doc")
|
|
912
|
+
.def("get_quality", &TriangleMesh::get_quality, R"doc(
|
|
913
|
+
Compute the global quality of the mesh.
|
|
914
|
+
|
|
915
|
+
Returns:
|
|
916
|
+
Tuple[float, float] - Minimum and average triangle quality.
|
|
917
|
+
)doc")
|
|
918
|
+
.def("get_aspect_ratio", &TriangleMesh::get_aspect_ratio, py::arg("mode"), R"doc(
|
|
919
|
+
Compute aspect ratio for all triangles.
|
|
920
|
+
|
|
921
|
+
Args:
|
|
922
|
+
mode (int): The formula mode to use.
|
|
923
|
+
|
|
924
|
+
Returns:
|
|
925
|
+
torch.Tensor - Shape (M,) float32 tensor of triangle aspect ratios.
|
|
926
|
+
)doc")
|
|
927
|
+
.def("get_radii_ratio", &TriangleMesh::get_radii_ratio, R"doc(
|
|
928
|
+
Compute the radii ratio (incircle / circumcircle) for all triangles.
|
|
929
|
+
|
|
930
|
+
Returns:
|
|
931
|
+
torch.Tensor - Shape (M,) float32 tensor of triangle radii ratios.
|
|
932
|
+
)doc")
|
|
933
|
+
.def("get_triangle_regularity", &TriangleMesh::get_triangle_regularity, R"doc(
|
|
934
|
+
Compute the triangle regularity (2 * sqrt(3) * r / l) for all triangles.
|
|
935
|
+
|
|
936
|
+
Returns:
|
|
937
|
+
torch.Tensor - Shape (M,) float32 tensor of triangle regularities.
|
|
938
|
+
)doc")
|
|
939
|
+
.def("get_radius_edge_ratio", &TriangleMesh::get_radius_edge_ratio, R"doc(
|
|
940
|
+
Compute the radius edge ratio (R / e) for all triangles.
|
|
941
|
+
|
|
942
|
+
Returns:
|
|
943
|
+
torch.Tensor - Shape (M,) float32 tensor of triangle radius edge ratios.
|
|
944
|
+
)doc")
|
|
945
|
+
.def("get_angle_deviation", &TriangleMesh::get_angle_deviation, R"doc(
|
|
946
|
+
Compute the mean angle deviation from 60 degrees for all triangles.
|
|
947
|
+
|
|
948
|
+
Returns:
|
|
949
|
+
torch.Tensor - Shape (M,) float32 tensor of triangle angle deviations.
|
|
950
|
+
)doc")
|
|
796
951
|
.def_property_readonly("bvh", &TriangleMesh::build_bvh, R"doc(
|
|
797
952
|
The Bounding Volume Hierarchy built for this mesh.
|
|
798
953
|
|
|
@@ -46,6 +46,97 @@ namespace triangle_mesh
|
|
|
46
46
|
}
|
|
47
47
|
}
|
|
48
48
|
|
|
49
|
+
__global__ void compute_quality_kernel(
|
|
50
|
+
const uint32_t num_triangles,
|
|
51
|
+
const float3 *__restrict__ vertices,
|
|
52
|
+
const int3 *__restrict__ triangles,
|
|
53
|
+
float *__restrict__ qualities)
|
|
54
|
+
{
|
|
55
|
+
uint32_t idx = blockIdx.x * blockDim.x + threadIdx.x;
|
|
56
|
+
if (idx < num_triangles)
|
|
57
|
+
{
|
|
58
|
+
int3 tri = triangles[idx];
|
|
59
|
+
Triangle T(vertices[tri.x], vertices[tri.y], vertices[tri.z]);
|
|
60
|
+
qualities[idx] = T.compute_quality();
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
__global__ void compute_aspect_ratio_kernel(
|
|
65
|
+
const uint32_t num_triangles,
|
|
66
|
+
const float3 *__restrict__ vertices,
|
|
67
|
+
const int3 *__restrict__ triangles,
|
|
68
|
+
int mode,
|
|
69
|
+
float *__restrict__ aspect_ratios)
|
|
70
|
+
{
|
|
71
|
+
uint32_t idx = blockIdx.x * blockDim.x + threadIdx.x;
|
|
72
|
+
if (idx < num_triangles)
|
|
73
|
+
{
|
|
74
|
+
int3 tri = triangles[idx];
|
|
75
|
+
Triangle T(vertices[tri.x], vertices[tri.y], vertices[tri.z]);
|
|
76
|
+
aspect_ratios[idx] = T.compute_ar(mode);
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
__global__ void compute_radii_ratio_kernel(
|
|
81
|
+
const uint32_t num_triangles,
|
|
82
|
+
const float3 *__restrict__ vertices,
|
|
83
|
+
const int3 *__restrict__ triangles,
|
|
84
|
+
float *__restrict__ ratios)
|
|
85
|
+
{
|
|
86
|
+
uint32_t idx = blockIdx.x * blockDim.x + threadIdx.x;
|
|
87
|
+
if (idx < num_triangles)
|
|
88
|
+
{
|
|
89
|
+
int3 tri = triangles[idx];
|
|
90
|
+
Triangle T(vertices[tri.x], vertices[tri.y], vertices[tri.z]);
|
|
91
|
+
ratios[idx] = T.compute_radii_ratio();
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
__global__ void compute_triangle_regularity_kernel(
|
|
96
|
+
const uint32_t num_triangles,
|
|
97
|
+
const float3 *__restrict__ vertices,
|
|
98
|
+
const int3 *__restrict__ triangles,
|
|
99
|
+
float *__restrict__ regularities)
|
|
100
|
+
{
|
|
101
|
+
uint32_t idx = blockIdx.x * blockDim.x + threadIdx.x;
|
|
102
|
+
if (idx < num_triangles)
|
|
103
|
+
{
|
|
104
|
+
int3 tri = triangles[idx];
|
|
105
|
+
Triangle T(vertices[tri.x], vertices[tri.y], vertices[tri.z]);
|
|
106
|
+
regularities[idx] = T.compute_triangle_regularity();
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
__global__ void compute_radius_edge_ratio_kernel(
|
|
111
|
+
const uint32_t num_triangles,
|
|
112
|
+
const float3 *__restrict__ vertices,
|
|
113
|
+
const int3 *__restrict__ triangles,
|
|
114
|
+
float *__restrict__ ratios)
|
|
115
|
+
{
|
|
116
|
+
uint32_t idx = blockIdx.x * blockDim.x + threadIdx.x;
|
|
117
|
+
if (idx < num_triangles)
|
|
118
|
+
{
|
|
119
|
+
int3 tri = triangles[idx];
|
|
120
|
+
Triangle T(vertices[tri.x], vertices[tri.y], vertices[tri.z]);
|
|
121
|
+
ratios[idx] = T.compute_radius_edge_ratio();
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
__global__ void compute_angle_deviation_kernel(
|
|
126
|
+
const uint32_t num_triangles,
|
|
127
|
+
const float3 *__restrict__ vertices,
|
|
128
|
+
const int3 *__restrict__ triangles,
|
|
129
|
+
float *__restrict__ deviations)
|
|
130
|
+
{
|
|
131
|
+
uint32_t idx = blockIdx.x * blockDim.x + threadIdx.x;
|
|
132
|
+
if (idx < num_triangles)
|
|
133
|
+
{
|
|
134
|
+
int3 tri = triangles[idx];
|
|
135
|
+
Triangle T(vertices[tri.x], vertices[tri.y], vertices[tri.z]);
|
|
136
|
+
deviations[idx] = T.compute_angle_deviation();
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
|
|
49
140
|
__global__ void compute_triangle_aabbs_kernel(
|
|
50
141
|
const uint32_t num_triangles,
|
|
51
142
|
const float3 *__restrict__ vertices,
|
|
@@ -95,6 +186,97 @@ namespace triangle_mesh
|
|
|
95
186
|
num_triangles, vertices, triangles, triangle_areas);
|
|
96
187
|
}
|
|
97
188
|
|
|
189
|
+
__host__ void compute_quality(
|
|
190
|
+
const uint32_t num_triangles,
|
|
191
|
+
const float3 *__restrict__ vertices,
|
|
192
|
+
const int3 *__restrict__ triangles,
|
|
193
|
+
float *__restrict__ qualities)
|
|
194
|
+
{
|
|
195
|
+
if (num_triangles == 0) return;
|
|
196
|
+
|
|
197
|
+
int threads = NTHREADS;
|
|
198
|
+
int blocks = (num_triangles + threads - 1) / threads;
|
|
199
|
+
|
|
200
|
+
compute_quality_kernel<<<blocks, threads>>>(
|
|
201
|
+
num_triangles, vertices, triangles, qualities);
|
|
202
|
+
}
|
|
203
|
+
|
|
204
|
+
__host__ void compute_aspect_ratio(
|
|
205
|
+
const uint32_t num_triangles,
|
|
206
|
+
const float3 *__restrict__ vertices,
|
|
207
|
+
const int3 *__restrict__ triangles,
|
|
208
|
+
int mode,
|
|
209
|
+
float *__restrict__ aspect_ratios)
|
|
210
|
+
{
|
|
211
|
+
if (num_triangles == 0) return;
|
|
212
|
+
|
|
213
|
+
int threads = NTHREADS;
|
|
214
|
+
int blocks = (num_triangles + threads - 1) / threads;
|
|
215
|
+
|
|
216
|
+
compute_aspect_ratio_kernel<<<blocks, threads>>>(
|
|
217
|
+
num_triangles, vertices, triangles, mode, aspect_ratios);
|
|
218
|
+
}
|
|
219
|
+
|
|
220
|
+
__host__ void compute_radii_ratio(
|
|
221
|
+
const uint32_t num_triangles,
|
|
222
|
+
const float3 *__restrict__ vertices,
|
|
223
|
+
const int3 *__restrict__ triangles,
|
|
224
|
+
float *__restrict__ ratios)
|
|
225
|
+
{
|
|
226
|
+
if (num_triangles == 0) return;
|
|
227
|
+
|
|
228
|
+
int threads = NTHREADS;
|
|
229
|
+
int blocks = (num_triangles + threads - 1) / threads;
|
|
230
|
+
|
|
231
|
+
compute_radii_ratio_kernel<<<blocks, threads>>>(
|
|
232
|
+
num_triangles, vertices, triangles, ratios);
|
|
233
|
+
}
|
|
234
|
+
|
|
235
|
+
__host__ void compute_triangle_regularity(
|
|
236
|
+
const uint32_t num_triangles,
|
|
237
|
+
const float3 *__restrict__ vertices,
|
|
238
|
+
const int3 *__restrict__ triangles,
|
|
239
|
+
float *__restrict__ regularities)
|
|
240
|
+
{
|
|
241
|
+
if (num_triangles == 0) return;
|
|
242
|
+
|
|
243
|
+
int threads = NTHREADS;
|
|
244
|
+
int blocks = (num_triangles + threads - 1) / threads;
|
|
245
|
+
|
|
246
|
+
compute_triangle_regularity_kernel<<<blocks, threads>>>(
|
|
247
|
+
num_triangles, vertices, triangles, regularities);
|
|
248
|
+
}
|
|
249
|
+
|
|
250
|
+
__host__ void compute_radius_edge_ratio(
|
|
251
|
+
const uint32_t num_triangles,
|
|
252
|
+
const float3 *__restrict__ vertices,
|
|
253
|
+
const int3 *__restrict__ triangles,
|
|
254
|
+
float *__restrict__ ratios)
|
|
255
|
+
{
|
|
256
|
+
if (num_triangles == 0) return;
|
|
257
|
+
|
|
258
|
+
int threads = NTHREADS;
|
|
259
|
+
int blocks = (num_triangles + threads - 1) / threads;
|
|
260
|
+
|
|
261
|
+
compute_radius_edge_ratio_kernel<<<blocks, threads>>>(
|
|
262
|
+
num_triangles, vertices, triangles, ratios);
|
|
263
|
+
}
|
|
264
|
+
|
|
265
|
+
__host__ void compute_angle_deviation(
|
|
266
|
+
const uint32_t num_triangles,
|
|
267
|
+
const float3 *__restrict__ vertices,
|
|
268
|
+
const int3 *__restrict__ triangles,
|
|
269
|
+
float *__restrict__ deviations)
|
|
270
|
+
{
|
|
271
|
+
if (num_triangles == 0) return;
|
|
272
|
+
|
|
273
|
+
int threads = NTHREADS;
|
|
274
|
+
int blocks = (num_triangles + threads - 1) / threads;
|
|
275
|
+
|
|
276
|
+
compute_angle_deviation_kernel<<<blocks, threads>>>(
|
|
277
|
+
num_triangles, vertices, triangles, deviations);
|
|
278
|
+
}
|
|
279
|
+
|
|
98
280
|
__host__ void compute_triangle_aabbs(
|
|
99
281
|
const uint32_t num_triangles,
|
|
100
282
|
const float3 *__restrict__ vertices,
|
|
@@ -70,6 +70,7 @@ public:
|
|
|
70
70
|
|
|
71
71
|
void compute_vertex_degrees();
|
|
72
72
|
torch::Tensor get_vertex_degrees();
|
|
73
|
+
float get_valence_567_percentage();
|
|
73
74
|
|
|
74
75
|
void compute_vertex_lb_uniform();
|
|
75
76
|
torch::Tensor get_vertex_lb_uniform();
|
|
@@ -140,6 +141,13 @@ public:
|
|
|
140
141
|
|
|
141
142
|
int32_t get_euler_characteristic();
|
|
142
143
|
int32_t get_genus();
|
|
144
|
+
|
|
145
|
+
std::tuple<float, float> get_quality();
|
|
146
|
+
torch::Tensor get_aspect_ratio(int mode);
|
|
147
|
+
torch::Tensor get_radii_ratio();
|
|
148
|
+
torch::Tensor get_triangle_regularity();
|
|
149
|
+
torch::Tensor get_radius_edge_ratio();
|
|
150
|
+
torch::Tensor get_angle_deviation();
|
|
143
151
|
};
|
|
144
152
|
|
|
145
153
|
namespace triangle_mesh
|
|
@@ -163,6 +171,43 @@ namespace triangle_mesh
|
|
|
163
171
|
const int3 *__restrict__ triangles,
|
|
164
172
|
float *__restrict__ triangle_areas);
|
|
165
173
|
|
|
174
|
+
__host__ void compute_quality(
|
|
175
|
+
const uint32_t num_triangles,
|
|
176
|
+
const float3 *__restrict__ vertices,
|
|
177
|
+
const int3 *__restrict__ triangles,
|
|
178
|
+
float *__restrict__ qualities);
|
|
179
|
+
|
|
180
|
+
__host__ void compute_aspect_ratio(
|
|
181
|
+
const uint32_t num_triangles,
|
|
182
|
+
const float3 *__restrict__ vertices,
|
|
183
|
+
const int3 *__restrict__ triangles,
|
|
184
|
+
int mode,
|
|
185
|
+
float *__restrict__ aspect_ratios);
|
|
186
|
+
|
|
187
|
+
__host__ void compute_radii_ratio(
|
|
188
|
+
const uint32_t num_triangles,
|
|
189
|
+
const float3 *__restrict__ vertices,
|
|
190
|
+
const int3 *__restrict__ triangles,
|
|
191
|
+
float *__restrict__ ratios);
|
|
192
|
+
|
|
193
|
+
__host__ void compute_triangle_regularity(
|
|
194
|
+
const uint32_t num_triangles,
|
|
195
|
+
const float3 *__restrict__ vertices,
|
|
196
|
+
const int3 *__restrict__ triangles,
|
|
197
|
+
float *__restrict__ regularities);
|
|
198
|
+
|
|
199
|
+
__host__ void compute_radius_edge_ratio(
|
|
200
|
+
const uint32_t num_triangles,
|
|
201
|
+
const float3 *__restrict__ vertices,
|
|
202
|
+
const int3 *__restrict__ triangles,
|
|
203
|
+
float *__restrict__ ratios);
|
|
204
|
+
|
|
205
|
+
__host__ void compute_angle_deviation(
|
|
206
|
+
const uint32_t num_triangles,
|
|
207
|
+
const float3 *__restrict__ vertices,
|
|
208
|
+
const int3 *__restrict__ triangles,
|
|
209
|
+
float *__restrict__ deviations);
|
|
210
|
+
|
|
166
211
|
__host__ void compute_triangle_aabbs(
|
|
167
212
|
const uint32_t num_triangles,
|
|
168
213
|
const float3 *__restrict__ vertices,
|
|
@@ -199,6 +199,97 @@ struct Triangle {
|
|
|
199
199
|
return circumcenter;
|
|
200
200
|
}
|
|
201
201
|
|
|
202
|
+
__host__ __device__ __forceinline__ float compute_quality() const {
|
|
203
|
+
float area = compute_area();
|
|
204
|
+
float3 e1 = v1 - v0;
|
|
205
|
+
float3 e2 = v2 - v1;
|
|
206
|
+
float3 e3 = v0 - v2;
|
|
207
|
+
float l1 = maths::norm(e1);
|
|
208
|
+
float l2 = maths::norm(e2);
|
|
209
|
+
float l3 = maths::norm(e3);
|
|
210
|
+
float l = fmaxf(fmaxf(l1, l2), l3);
|
|
211
|
+
float s = (l1 + l2 + l3) * 0.5f;
|
|
212
|
+
float q = (6 / sqrtf(3.0f)) * (area / (s * l));
|
|
213
|
+
return q;
|
|
214
|
+
}
|
|
215
|
+
|
|
216
|
+
__host__ __device__ __forceinline__ float compute_triangle_regularity() const {
|
|
217
|
+
float area = compute_area();
|
|
218
|
+
if (area <= 1e-8f) return 0.0f;
|
|
219
|
+
float3 e1 = v1 - v0;
|
|
220
|
+
float3 e2 = v2 - v1;
|
|
221
|
+
float3 e3 = v0 - v2;
|
|
222
|
+
float l1 = maths::norm(e1);
|
|
223
|
+
float l2 = maths::norm(e2);
|
|
224
|
+
float l3 = maths::norm(e3);
|
|
225
|
+
float s = (l1 + l2 + l3) * 0.5f;
|
|
226
|
+
float r = area / s;
|
|
227
|
+
float l = fmaxf(fmaxf(l1, l2), l3);
|
|
228
|
+
return (2.0f * sqrtf(3.0f) * r) / l;
|
|
229
|
+
}
|
|
230
|
+
|
|
231
|
+
__host__ __device__ __forceinline__ float compute_radius_edge_ratio() const {
|
|
232
|
+
float area = compute_area();
|
|
233
|
+
if (area <= 1e-8f) return 0.0f;
|
|
234
|
+
float3 e1 = v1 - v0;
|
|
235
|
+
float3 e2 = v2 - v1;
|
|
236
|
+
float3 e3 = v0 - v2;
|
|
237
|
+
float l1 = maths::norm(e1);
|
|
238
|
+
float l2 = maths::norm(e2);
|
|
239
|
+
float l3 = maths::norm(e3);
|
|
240
|
+
float R = (l1 * l2 * l3) / (4.0f * area);
|
|
241
|
+
float e = fminf(fminf(l1, l2), l3);
|
|
242
|
+
if (e <= 1e-8f) return 0.0f;
|
|
243
|
+
return R / e;
|
|
244
|
+
}
|
|
245
|
+
|
|
246
|
+
__host__ __device__ __forceinline__ float compute_angle_deviation() const {
|
|
247
|
+
float a0, a1, a2;
|
|
248
|
+
compute_angles(a0, a1, a2);
|
|
249
|
+
float opt = 1.0471975511965977f; // 60 degrees in radians (PI / 3)
|
|
250
|
+
return (fabsf(a0 - opt) + fabsf(a1 - opt) + fabsf(a2 - opt)) / 3.0f;
|
|
251
|
+
}
|
|
252
|
+
|
|
253
|
+
__host__ __device__ __forceinline__ float compute_radii_ratio() const {
|
|
254
|
+
float area = compute_area();
|
|
255
|
+
if (area <= 1e-8f) return 0.0f;
|
|
256
|
+
float3 e1 = v1 - v0;
|
|
257
|
+
float3 e2 = v2 - v1;
|
|
258
|
+
float3 e3 = v0 - v2;
|
|
259
|
+
float l1 = maths::norm(e1);
|
|
260
|
+
float l2 = maths::norm(e2);
|
|
261
|
+
float l3 = maths::norm(e3);
|
|
262
|
+
float s = (l1 + l2 + l3) * 0.5f;
|
|
263
|
+
float r = area / s;
|
|
264
|
+
float R = (l1 * l2 * l3) / (4.0f * area);
|
|
265
|
+
return r / R;
|
|
266
|
+
}
|
|
267
|
+
|
|
268
|
+
__host__ __device__ __forceinline__ float compute_ar(int mode) const {
|
|
269
|
+
float3 e1 = v1 - v0;
|
|
270
|
+
float3 e2 = v2 - v1;
|
|
271
|
+
float3 e3 = v0 - v2;
|
|
272
|
+
float l1 = maths::norm(e1);
|
|
273
|
+
float l2 = maths::norm(e2);
|
|
274
|
+
float l3 = maths::norm(e3);
|
|
275
|
+
|
|
276
|
+
if (mode == 0){
|
|
277
|
+
float area = compute_area();
|
|
278
|
+
float l = fmaxf(fmaxf(l1, l2), l3);
|
|
279
|
+
return (sqrtf(3.0f) * l * l) / (4.0f * area);
|
|
280
|
+
} else if (mode == 1){
|
|
281
|
+
float s = (l1 + l2 + l3) * 0.5f;
|
|
282
|
+
return (l1 * l2 * l3) / (8.0f * (s - l1) * (s - l2) * (s - l3));
|
|
283
|
+
} else if (mode == 2){
|
|
284
|
+
float area = compute_area();
|
|
285
|
+
return (l1 + l2 + l3) / (4.0f * area);
|
|
286
|
+
} else {
|
|
287
|
+
return 0.0f;
|
|
288
|
+
}
|
|
289
|
+
}
|
|
290
|
+
|
|
291
|
+
|
|
292
|
+
|
|
202
293
|
__host__ __device__ __forceinline__ bool test_point_on_tria_plane(const float3& p, float eps = 1e-5f) const {
|
|
203
294
|
float3 n = compute_normal();
|
|
204
295
|
float dist = fabsf(maths::dot(n, p - v0));
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: conquer3d
|
|
3
|
-
Version: 0.4.
|
|
3
|
+
Version: 0.4.5
|
|
4
4
|
Summary: Geometric Cuda Tool Box
|
|
5
5
|
Author-email: Do Hoang Khoi <khoido8899@gmail.com>
|
|
6
6
|
License-Expression: MIT
|
|
@@ -88,14 +88,7 @@ twine upload dist/* --verbose
|
|
|
88
88
|
author = {Karras, Tero},
|
|
89
89
|
title = {Maximizing parallelism in the construction of BVHs, octrees, and k-d trees},
|
|
90
90
|
year = {2012},
|
|
91
|
-
isbn = {9783905674415},
|
|
92
|
-
publisher = {Eurographics Association},
|
|
93
|
-
address = {Goslar, DEU},
|
|
94
91
|
booktitle = {Proceedings of the Fourth ACM SIGGRAPH / Eurographics Conference on High-Performance Graphics},
|
|
95
|
-
pages = {33–37},
|
|
96
|
-
numpages = {5},
|
|
97
|
-
location = {Paris, France},
|
|
98
|
-
series = {EGGH-HPG'12}
|
|
99
92
|
}
|
|
100
93
|
```
|
|
101
94
|
|
|
@@ -104,18 +97,7 @@ twine upload dist/* --verbose
|
|
|
104
97
|
author = {M\"{o}ller, Tomas},
|
|
105
98
|
title = {A fast triangle-triangle intersection test},
|
|
106
99
|
year = {1997},
|
|
107
|
-
issue_date = {1997},
|
|
108
|
-
publisher = {A. K. Peters, Ltd.},
|
|
109
|
-
address = {USA},
|
|
110
|
-
volume = {2},
|
|
111
|
-
number = {2},
|
|
112
|
-
issn = {1086-7651},
|
|
113
|
-
url = {https://doi.org/10.1080/10867651.1997.10487472},
|
|
114
|
-
doi = {10.1080/10867651.1997.10487472},
|
|
115
100
|
journal = {J. Graph. Tools},
|
|
116
|
-
month = nov,
|
|
117
|
-
pages = {25–30},
|
|
118
|
-
numpages = {6}
|
|
119
101
|
}
|
|
120
102
|
```
|
|
121
103
|
|
|
@@ -124,36 +106,36 @@ twine upload dist/* --verbose
|
|
|
124
106
|
author = {M\"{o}ller, Tomas and Trumbore, Ben},
|
|
125
107
|
title = {Fast, minimum storage ray/triangle intersection},
|
|
126
108
|
year = {2005},
|
|
127
|
-
|
|
128
|
-
publisher = {Association for Computing Machinery},
|
|
129
|
-
address = {New York, NY, USA},
|
|
130
|
-
url = {https://doi.org/10.1145/1198555.1198746},
|
|
131
|
-
doi = {10.1145/1198555.1198746},
|
|
132
|
-
pages = {7–es},
|
|
133
|
-
keywords = {base transformation, intersection, ray tracing, ray/triangle-intersection},
|
|
134
|
-
location = {Los Angeles, California},
|
|
135
|
-
series = {SIGGRAPH '05}
|
|
109
|
+
booktitle = {ACM SIGGRAPH 2005 Courses},
|
|
136
110
|
}
|
|
137
111
|
```
|
|
138
112
|
|
|
139
113
|
```bibtex
|
|
140
|
-
@
|
|
141
|
-
author="Meyer, Mark
|
|
142
|
-
and Desbrun, Mathieu
|
|
143
|
-
and Schr{\"o}der, Peter
|
|
144
|
-
and Barr, Alan H.",
|
|
145
|
-
editor="Hege, Hans-Christian
|
|
146
|
-
and Polthier, Konrad",
|
|
114
|
+
@inproceedings{10.1007/978-3-662-05105-4_2,
|
|
115
|
+
author="Meyer, Mark and Desbrun, Mathieu and Schr{\"o}der, Peter and Barr, Alan H.",
|
|
147
116
|
title="Discrete Differential-Geometry Operators for Triangulated 2-Manifolds",
|
|
148
117
|
booktitle="Visualization and Mathematics III",
|
|
149
|
-
year="2003"
|
|
150
|
-
publisher="Springer Berlin Heidelberg",
|
|
151
|
-
address="Berlin, Heidelberg",
|
|
152
|
-
pages="35--57",
|
|
153
|
-
isbn="978-3-662-05105-4"
|
|
118
|
+
year="2003"
|
|
154
119
|
}
|
|
155
120
|
```
|
|
156
121
|
|
|
122
|
+
```bibtex
|
|
123
|
+
@article{9167456,
|
|
124
|
+
author={Khan, Dawar and Plopski, Alexander and Fujimoto, Yuichiro and Kanbara, Masayuki and Jabeen, Gul and Zhang, Yongjie Jessica and Zhang, Xiaopeng and Kato, Hirokazu},
|
|
125
|
+
journal={IEEE Transactions on Visualization and Computer Graphics},
|
|
126
|
+
title={Surface Remeshing: A Systematic Literature Review of Methods and Research Directions},
|
|
127
|
+
year={2022}
|
|
128
|
+
}
|
|
129
|
+
```
|
|
130
|
+
|
|
131
|
+
```bibtex
|
|
132
|
+
@article{4487066,
|
|
133
|
+
author={Dietrich, Carlos A. and Scheidegger, Carlos E. and Schreiner, John and Comba, João L.D. and Nedel, Luciana P. and Silva, Cláudio T.},
|
|
134
|
+
journal={IEEE Transactions on Visualization and Computer Graphics},
|
|
135
|
+
title={Edge Transformations for Improving Mesh Quality of Marching Cubes},
|
|
136
|
+
year={2009}}
|
|
137
|
+
```
|
|
138
|
+
|
|
157
139
|
## Blog Post
|
|
158
140
|
- [Thinking Parallel, Part I: Collision Detection on the GPU](https://developer.nvidia.com/blog/thinking-parallel-part-i-collision-detection-gpu/)
|
|
159
141
|
- [Thinking Parallel, Part II: Tree Traversal on the GPU](https://developer.nvidia.com/blog/thinking-parallel-part-ii-tree-traversal-gpu/)
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|