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.
Files changed (108) hide show
  1. {conquer3d-0.4.2/conquer3d.egg-info → conquer3d-0.4.5}/PKG-INFO +22 -40
  2. {conquer3d-0.4.2 → conquer3d-0.4.5}/README.md +21 -39
  3. {conquer3d-0.4.2 → conquer3d-0.4.5}/conquer3d/_C.so +0 -0
  4. {conquer3d-0.4.2 → conquer3d-0.4.5}/conquer3d/csrc/binds/data_structure/triangle_mesh.cpp +155 -0
  5. {conquer3d-0.4.2 → conquer3d-0.4.5}/conquer3d/csrc/data_structure/triangle_mesh.cu +182 -0
  6. {conquer3d-0.4.2 → conquer3d-0.4.5}/conquer3d/csrc/data_structure/triangle_mesh.h +45 -0
  7. {conquer3d-0.4.2 → conquer3d-0.4.5}/conquer3d/csrc/primitive/triangle.h +91 -0
  8. {conquer3d-0.4.2 → conquer3d-0.4.5/conquer3d.egg-info}/PKG-INFO +22 -40
  9. {conquer3d-0.4.2 → conquer3d-0.4.5}/pyproject.toml +1 -1
  10. {conquer3d-0.4.2 → conquer3d-0.4.5}/LICENSE +0 -0
  11. {conquer3d-0.4.2 → conquer3d-0.4.5}/MANIFEST.in +0 -0
  12. {conquer3d-0.4.2 → conquer3d-0.4.5}/conquer3d/_C.pyi +0 -0
  13. {conquer3d-0.4.2 → conquer3d-0.4.5}/conquer3d/__init__.py +0 -0
  14. {conquer3d-0.4.2 → conquer3d-0.4.5}/conquer3d/conversion/__init__.py +0 -0
  15. {conquer3d-0.4.2 → conquer3d-0.4.5}/conquer3d/conversion/grid.py +0 -0
  16. {conquer3d-0.4.2 → conquer3d-0.4.5}/conquer3d/conversion/mesh.py +0 -0
  17. {conquer3d-0.4.2 → conquer3d-0.4.5}/conquer3d/conversion/tmesh.py +0 -0
  18. {conquer3d-0.4.2 → conquer3d-0.4.5}/conquer3d/creation/__init__.py +0 -0
  19. {conquer3d-0.4.2 → conquer3d-0.4.5}/conquer3d/creation/triangle_creation.py +0 -0
  20. {conquer3d-0.4.2 → conquer3d-0.4.5}/conquer3d/csrc/binds/creation/triangle_creation.cpp +0 -0
  21. {conquer3d-0.4.2 → conquer3d-0.4.5}/conquer3d/csrc/binds/data_structure/bvh.cpp +0 -0
  22. {conquer3d-0.4.2 → conquer3d-0.4.5}/conquer3d/csrc/binds/data_structure/grid.cpp +0 -0
  23. {conquer3d-0.4.2 → conquer3d-0.4.5}/conquer3d/csrc/binds/data_structure/gs_bvh.cpp +0 -0
  24. {conquer3d-0.4.2 → conquer3d-0.4.5}/conquer3d/csrc/binds/data_structure/kdtree.cpp +0 -0
  25. {conquer3d-0.4.2 → conquer3d-0.4.5}/conquer3d/csrc/binds/data_structure/mesh_bvh.cpp +0 -0
  26. {conquer3d-0.4.2 → conquer3d-0.4.5}/conquer3d/csrc/binds/data_structure/pgs_bvh.cpp +0 -0
  27. {conquer3d-0.4.2 → conquer3d-0.4.5}/conquer3d/csrc/binds/data_structure/zcurve.cpp +0 -0
  28. {conquer3d-0.4.2 → conquer3d-0.4.5}/conquer3d/csrc/binds/ops/chamfer.cpp +0 -0
  29. {conquer3d-0.4.2 → conquer3d-0.4.5}/conquer3d/csrc/binds/ops/mc.cpp +0 -0
  30. {conquer3d-0.4.2 → conquer3d-0.4.5}/conquer3d/csrc/binds/primitive/gs.cpp +0 -0
  31. {conquer3d-0.4.2 → conquer3d-0.4.5}/conquer3d/csrc/binds/primitive/pgs.cpp +0 -0
  32. {conquer3d-0.4.2 → conquer3d-0.4.5}/conquer3d/csrc/binds/primitive/ray.cpp +0 -0
  33. {conquer3d-0.4.2 → conquer3d-0.4.5}/conquer3d/csrc/binds/primitive/triangle.cpp +0 -0
  34. {conquer3d-0.4.2 → conquer3d-0.4.5}/conquer3d/csrc/check.h +0 -0
  35. {conquer3d-0.4.2 → conquer3d-0.4.5}/conquer3d/csrc/constants.h +0 -0
  36. {conquer3d-0.4.2 → conquer3d-0.4.5}/conquer3d/csrc/creation/triangle_creation.h +0 -0
  37. {conquer3d-0.4.2 → conquer3d-0.4.5}/conquer3d/csrc/data_structure/bvh.cu +0 -0
  38. {conquer3d-0.4.2 → conquer3d-0.4.5}/conquer3d/csrc/data_structure/bvh.h +0 -0
  39. {conquer3d-0.4.2 → conquer3d-0.4.5}/conquer3d/csrc/data_structure/gs_bvh.h +0 -0
  40. {conquer3d-0.4.2 → conquer3d-0.4.5}/conquer3d/csrc/data_structure/kdtree.cu +0 -0
  41. {conquer3d-0.4.2 → conquer3d-0.4.5}/conquer3d/csrc/data_structure/kdtree.h +0 -0
  42. {conquer3d-0.4.2 → conquer3d-0.4.5}/conquer3d/csrc/data_structure/mesh_bvh.cu +0 -0
  43. {conquer3d-0.4.2 → conquer3d-0.4.5}/conquer3d/csrc/data_structure/mesh_bvh.h +0 -0
  44. {conquer3d-0.4.2 → conquer3d-0.4.5}/conquer3d/csrc/data_structure/pgs_bvh.h +0 -0
  45. {conquer3d-0.4.2 → conquer3d-0.4.5}/conquer3d/csrc/data_structure/zcurve.cu +0 -0
  46. {conquer3d-0.4.2 → conquer3d-0.4.5}/conquer3d/csrc/data_structure/zcurve.h +0 -0
  47. {conquer3d-0.4.2 → conquer3d-0.4.5}/conquer3d/csrc/maths/f2x2.h +0 -0
  48. {conquer3d-0.4.2 → conquer3d-0.4.5}/conquer3d/csrc/maths/f3x1.h +0 -0
  49. {conquer3d-0.4.2 → conquer3d-0.4.5}/conquer3d/csrc/maths/f3x3.h +0 -0
  50. {conquer3d-0.4.2 → conquer3d-0.4.5}/conquer3d/csrc/maths/f3x4.h +0 -0
  51. {conquer3d-0.4.2 → conquer3d-0.4.5}/conquer3d/csrc/maths/f4x1.h +0 -0
  52. {conquer3d-0.4.2 → conquer3d-0.4.5}/conquer3d/csrc/maths/f4x4.h +0 -0
  53. {conquer3d-0.4.2 → conquer3d-0.4.5}/conquer3d/csrc/maths/maths.h +0 -0
  54. {conquer3d-0.4.2 → conquer3d-0.4.5}/conquer3d/csrc/maths/ops.h +0 -0
  55. {conquer3d-0.4.2 → conquer3d-0.4.5}/conquer3d/csrc/ops/chamfer.cu +0 -0
  56. {conquer3d-0.4.2 → conquer3d-0.4.5}/conquer3d/csrc/ops/chamfer.h +0 -0
  57. {conquer3d-0.4.2 → conquer3d-0.4.5}/conquer3d/csrc/ops/mc.cu +0 -0
  58. {conquer3d-0.4.2 → conquer3d-0.4.5}/conquer3d/csrc/ops/mc.h +0 -0
  59. {conquer3d-0.4.2 → conquer3d-0.4.5}/conquer3d/csrc/ops/mc_data.h +0 -0
  60. {conquer3d-0.4.2 → conquer3d-0.4.5}/conquer3d/csrc/primitive/aabb.h +0 -0
  61. {conquer3d-0.4.2 → conquer3d-0.4.5}/conquer3d/csrc/primitive/edge.h +0 -0
  62. {conquer3d-0.4.2 → conquer3d-0.4.5}/conquer3d/csrc/primitive/gs.cu +0 -0
  63. {conquer3d-0.4.2 → conquer3d-0.4.5}/conquer3d/csrc/primitive/gs.h +0 -0
  64. {conquer3d-0.4.2 → conquer3d-0.4.5}/conquer3d/csrc/primitive/gs_aabb.cu +0 -0
  65. {conquer3d-0.4.2 → conquer3d-0.4.5}/conquer3d/csrc/primitive/gs_math.cuh +0 -0
  66. {conquer3d-0.4.2 → conquer3d-0.4.5}/conquer3d/csrc/primitive/pgs.cu +0 -0
  67. {conquer3d-0.4.2 → conquer3d-0.4.5}/conquer3d/csrc/primitive/pgs.h +0 -0
  68. {conquer3d-0.4.2 → conquer3d-0.4.5}/conquer3d/csrc/primitive/pgs_aabb.cu +0 -0
  69. {conquer3d-0.4.2 → conquer3d-0.4.5}/conquer3d/csrc/primitive/pgs_math.cuh +0 -0
  70. {conquer3d-0.4.2 → conquer3d-0.4.5}/conquer3d/csrc/primitive/ray.h +0 -0
  71. {conquer3d-0.4.2 → conquer3d-0.4.5}/conquer3d/csrc/pybind.cpp +0 -0
  72. {conquer3d-0.4.2 → conquer3d-0.4.5}/conquer3d/data/__init__.py +0 -0
  73. {conquer3d-0.4.2 → conquer3d-0.4.5}/conquer3d/data/assets/__init__.py +0 -0
  74. {conquer3d-0.4.2 → conquer3d-0.4.5}/conquer3d/data/assets/common.py +0 -0
  75. {conquer3d-0.4.2 → conquer3d-0.4.5}/conquer3d/data/assets/iphigenia.py +0 -0
  76. {conquer3d-0.4.2 → conquer3d-0.4.5}/conquer3d/data/collate/__init__.py +0 -0
  77. {conquer3d-0.4.2 → conquer3d-0.4.5}/conquer3d/data/collate/mesh.py +0 -0
  78. {conquer3d-0.4.2 → conquer3d-0.4.5}/conquer3d/data/collate/sparse_tensor.py +0 -0
  79. {conquer3d-0.4.2 → conquer3d-0.4.5}/conquer3d/data/dataset/__init__.py +0 -0
  80. {conquer3d-0.4.2 → conquer3d-0.4.5}/conquer3d/data/dataset/base_mesh.py +0 -0
  81. {conquer3d-0.4.2 → conquer3d-0.4.5}/conquer3d/data/dataset/digit3d.py +0 -0
  82. {conquer3d-0.4.2 → conquer3d-0.4.5}/conquer3d/data/transform/__init__.py +0 -0
  83. {conquer3d-0.4.2 → conquer3d-0.4.5}/conquer3d/data/transform/base.py +0 -0
  84. {conquer3d-0.4.2 → conquer3d-0.4.5}/conquer3d/data/transform/ops.py +0 -0
  85. {conquer3d-0.4.2 → conquer3d-0.4.5}/conquer3d/data/transform/vertex.py +0 -0
  86. {conquer3d-0.4.2 → conquer3d-0.4.5}/conquer3d/data_structure/__init__.py +0 -0
  87. {conquer3d-0.4.2 → conquer3d-0.4.5}/conquer3d/data_structure/bmesh.py +0 -0
  88. {conquer3d-0.4.2 → conquer3d-0.4.5}/conquer3d/data_structure/grid.py +0 -0
  89. {conquer3d-0.4.2 → conquer3d-0.4.5}/conquer3d/data_structure/sort.py +0 -0
  90. {conquer3d-0.4.2 → conquer3d-0.4.5}/conquer3d/io/__init__.py +0 -0
  91. {conquer3d-0.4.2 → conquer3d-0.4.5}/conquer3d/io/obj.py +0 -0
  92. {conquer3d-0.4.2 → conquer3d-0.4.5}/conquer3d/io/off.py +0 -0
  93. {conquer3d-0.4.2 → conquer3d-0.4.5}/conquer3d/ops/__init__.py +0 -0
  94. {conquer3d-0.4.2 → conquer3d-0.4.5}/conquer3d/ops/delaunay_triangulation.py +0 -0
  95. {conquer3d-0.4.2 → conquer3d-0.4.5}/conquer3d/ops/diff_marching_cubes.py +0 -0
  96. {conquer3d-0.4.2 → conquer3d-0.4.5}/conquer3d/ops/distance.py +0 -0
  97. {conquer3d-0.4.2 → conquer3d-0.4.5}/conquer3d/ops/marching_cubes.py +0 -0
  98. {conquer3d-0.4.2 → conquer3d-0.4.5}/conquer3d/ops/marching_tetrahedra.py +0 -0
  99. {conquer3d-0.4.2 → conquer3d-0.4.5}/conquer3d/primitive/__init__.py +0 -0
  100. {conquer3d-0.4.2 → conquer3d-0.4.5}/conquer3d/primitive/gs.py +0 -0
  101. {conquer3d-0.4.2 → conquer3d-0.4.5}/conquer3d/primitive/pgs.py +0 -0
  102. {conquer3d-0.4.2 → conquer3d-0.4.5}/conquer3d.egg-info/SOURCES.txt +0 -0
  103. {conquer3d-0.4.2 → conquer3d-0.4.5}/conquer3d.egg-info/dependency_links.txt +0 -0
  104. {conquer3d-0.4.2 → conquer3d-0.4.5}/conquer3d.egg-info/not-zip-safe +0 -0
  105. {conquer3d-0.4.2 → conquer3d-0.4.5}/conquer3d.egg-info/requires.txt +0 -0
  106. {conquer3d-0.4.2 → conquer3d-0.4.5}/conquer3d.egg-info/top_level.txt +0 -0
  107. {conquer3d-0.4.2 → conquer3d-0.4.5}/setup.cfg +0 -0
  108. {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.2
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
- isbn = {9781450378338},
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
- @InProceedings{10.1007/978-3-662-05105-4_2,
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
- isbn = {9781450378338},
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
- @InProceedings{10.1007/978-3-662-05105-4_2,
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/)
@@ -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.2
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
- isbn = {9781450378338},
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
- @InProceedings{10.1007/978-3-662-05105-4_2,
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/)
@@ -9,7 +9,7 @@ build-backend = "setuptools.build_meta"
9
9
 
10
10
  [project]
11
11
  name = "conquer3d"
12
- version = "0.4.2"
12
+ version = "0.4.5"
13
13
  description = "Geometric Cuda Tool Box"
14
14
  readme = "README.md"
15
15
  license = "MIT"
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes