warp-lang 1.0.0b2__py3-none-win_amd64.whl → 1.0.0b6__py3-none-win_amd64.whl

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.

Potentially problematic release.


This version of warp-lang might be problematic. Click here for more details.

Files changed (271) hide show
  1. docs/conf.py +17 -5
  2. examples/env/env_ant.py +1 -1
  3. examples/env/env_cartpole.py +1 -1
  4. examples/env/env_humanoid.py +1 -1
  5. examples/env/env_usd.py +4 -1
  6. examples/env/environment.py +8 -9
  7. examples/example_dem.py +34 -33
  8. examples/example_diffray.py +364 -337
  9. examples/example_fluid.py +32 -23
  10. examples/example_jacobian_ik.py +97 -93
  11. examples/example_marching_cubes.py +6 -16
  12. examples/example_mesh.py +6 -16
  13. examples/example_mesh_intersect.py +16 -14
  14. examples/example_nvdb.py +14 -16
  15. examples/example_raycast.py +14 -13
  16. examples/example_raymarch.py +16 -23
  17. examples/example_render_opengl.py +19 -10
  18. examples/example_sim_cartpole.py +82 -78
  19. examples/example_sim_cloth.py +45 -48
  20. examples/example_sim_fk_grad.py +51 -44
  21. examples/example_sim_fk_grad_torch.py +47 -40
  22. examples/example_sim_grad_bounce.py +108 -133
  23. examples/example_sim_grad_cloth.py +99 -113
  24. examples/example_sim_granular.py +5 -6
  25. examples/{example_sim_sdf_shape.py → example_sim_granular_collision_sdf.py} +37 -26
  26. examples/example_sim_neo_hookean.py +51 -55
  27. examples/example_sim_particle_chain.py +4 -4
  28. examples/example_sim_quadruped.py +126 -81
  29. examples/example_sim_rigid_chain.py +54 -61
  30. examples/example_sim_rigid_contact.py +66 -70
  31. examples/example_sim_rigid_fem.py +3 -3
  32. examples/example_sim_rigid_force.py +1 -1
  33. examples/example_sim_rigid_gyroscopic.py +3 -4
  34. examples/example_sim_rigid_kinematics.py +28 -39
  35. examples/example_sim_trajopt.py +112 -110
  36. examples/example_sph.py +9 -8
  37. examples/example_wave.py +7 -7
  38. examples/fem/bsr_utils.py +30 -17
  39. examples/fem/example_apic_fluid.py +85 -69
  40. examples/fem/example_convection_diffusion.py +97 -93
  41. examples/fem/example_convection_diffusion_dg.py +142 -149
  42. examples/fem/example_convection_diffusion_dg0.py +141 -136
  43. examples/fem/example_deformed_geometry.py +146 -0
  44. examples/fem/example_diffusion.py +115 -84
  45. examples/fem/example_diffusion_3d.py +116 -86
  46. examples/fem/example_diffusion_mgpu.py +102 -79
  47. examples/fem/example_mixed_elasticity.py +139 -100
  48. examples/fem/example_navier_stokes.py +175 -162
  49. examples/fem/example_stokes.py +143 -111
  50. examples/fem/example_stokes_transfer.py +186 -157
  51. examples/fem/mesh_utils.py +59 -97
  52. examples/fem/plot_utils.py +138 -17
  53. tools/ci/publishing/build_nodes_info.py +54 -0
  54. warp/__init__.py +4 -3
  55. warp/__init__.pyi +1 -0
  56. warp/bin/warp-clang.dll +0 -0
  57. warp/bin/warp.dll +0 -0
  58. warp/build.py +5 -3
  59. warp/build_dll.py +29 -9
  60. warp/builtins.py +836 -492
  61. warp/codegen.py +864 -553
  62. warp/config.py +3 -1
  63. warp/context.py +389 -172
  64. warp/fem/__init__.py +24 -6
  65. warp/fem/cache.py +318 -25
  66. warp/fem/dirichlet.py +7 -3
  67. warp/fem/domain.py +14 -0
  68. warp/fem/field/__init__.py +30 -38
  69. warp/fem/field/field.py +149 -0
  70. warp/fem/field/nodal_field.py +244 -138
  71. warp/fem/field/restriction.py +8 -6
  72. warp/fem/field/test.py +127 -59
  73. warp/fem/field/trial.py +117 -60
  74. warp/fem/geometry/__init__.py +5 -1
  75. warp/fem/geometry/deformed_geometry.py +271 -0
  76. warp/fem/geometry/element.py +24 -1
  77. warp/fem/geometry/geometry.py +86 -14
  78. warp/fem/geometry/grid_2d.py +112 -54
  79. warp/fem/geometry/grid_3d.py +134 -65
  80. warp/fem/geometry/hexmesh.py +953 -0
  81. warp/fem/geometry/partition.py +85 -33
  82. warp/fem/geometry/quadmesh_2d.py +532 -0
  83. warp/fem/geometry/tetmesh.py +451 -115
  84. warp/fem/geometry/trimesh_2d.py +197 -92
  85. warp/fem/integrate.py +534 -268
  86. warp/fem/operator.py +58 -31
  87. warp/fem/polynomial.py +11 -0
  88. warp/fem/quadrature/__init__.py +1 -1
  89. warp/fem/quadrature/pic_quadrature.py +150 -58
  90. warp/fem/quadrature/quadrature.py +209 -57
  91. warp/fem/space/__init__.py +230 -53
  92. warp/fem/space/basis_space.py +489 -0
  93. warp/fem/space/collocated_function_space.py +105 -0
  94. warp/fem/space/dof_mapper.py +49 -2
  95. warp/fem/space/function_space.py +90 -39
  96. warp/fem/space/grid_2d_function_space.py +149 -496
  97. warp/fem/space/grid_3d_function_space.py +173 -538
  98. warp/fem/space/hexmesh_function_space.py +352 -0
  99. warp/fem/space/partition.py +129 -76
  100. warp/fem/space/quadmesh_2d_function_space.py +369 -0
  101. warp/fem/space/restriction.py +46 -34
  102. warp/fem/space/shape/__init__.py +15 -0
  103. warp/fem/space/shape/cube_shape_function.py +738 -0
  104. warp/fem/space/shape/shape_function.py +103 -0
  105. warp/fem/space/shape/square_shape_function.py +611 -0
  106. warp/fem/space/shape/tet_shape_function.py +567 -0
  107. warp/fem/space/shape/triangle_shape_function.py +429 -0
  108. warp/fem/space/tetmesh_function_space.py +132 -1039
  109. warp/fem/space/topology.py +295 -0
  110. warp/fem/space/trimesh_2d_function_space.py +104 -742
  111. warp/fem/types.py +13 -11
  112. warp/fem/utils.py +335 -60
  113. warp/native/array.h +120 -34
  114. warp/native/builtin.h +101 -72
  115. warp/native/bvh.cpp +73 -325
  116. warp/native/bvh.cu +406 -23
  117. warp/native/bvh.h +22 -40
  118. warp/native/clang/clang.cpp +1 -0
  119. warp/native/crt.h +2 -0
  120. warp/native/cuda_util.cpp +8 -3
  121. warp/native/cuda_util.h +1 -0
  122. warp/native/exports.h +1522 -1243
  123. warp/native/intersect.h +19 -4
  124. warp/native/intersect_adj.h +8 -8
  125. warp/native/mat.h +76 -17
  126. warp/native/mesh.cpp +33 -108
  127. warp/native/mesh.cu +114 -18
  128. warp/native/mesh.h +395 -40
  129. warp/native/noise.h +272 -329
  130. warp/native/quat.h +51 -8
  131. warp/native/rand.h +44 -34
  132. warp/native/reduce.cpp +1 -1
  133. warp/native/sparse.cpp +4 -4
  134. warp/native/sparse.cu +163 -155
  135. warp/native/spatial.h +2 -2
  136. warp/native/temp_buffer.h +18 -14
  137. warp/native/vec.h +103 -21
  138. warp/native/warp.cpp +2 -1
  139. warp/native/warp.cu +28 -3
  140. warp/native/warp.h +4 -3
  141. warp/render/render_opengl.py +261 -109
  142. warp/sim/__init__.py +1 -2
  143. warp/sim/articulation.py +385 -185
  144. warp/sim/import_mjcf.py +59 -48
  145. warp/sim/import_urdf.py +15 -15
  146. warp/sim/import_usd.py +174 -102
  147. warp/sim/inertia.py +17 -18
  148. warp/sim/integrator_xpbd.py +4 -3
  149. warp/sim/model.py +330 -250
  150. warp/sim/render.py +1 -1
  151. warp/sparse.py +625 -152
  152. warp/stubs.py +341 -309
  153. warp/tape.py +9 -6
  154. warp/tests/__main__.py +3 -6
  155. warp/tests/assets/curlnoise_golden.npy +0 -0
  156. warp/tests/assets/pnoise_golden.npy +0 -0
  157. warp/tests/{test_class_kernel.py → aux_test_class_kernel.py} +9 -1
  158. warp/tests/aux_test_conditional_unequal_types_kernels.py +21 -0
  159. warp/tests/{test_dependent.py → aux_test_dependent.py} +2 -2
  160. warp/tests/{test_reference.py → aux_test_reference.py} +1 -1
  161. warp/tests/aux_test_unresolved_func.py +14 -0
  162. warp/tests/aux_test_unresolved_symbol.py +14 -0
  163. warp/tests/disabled_kinematics.py +239 -0
  164. warp/tests/run_coverage_serial.py +31 -0
  165. warp/tests/test_adam.py +103 -106
  166. warp/tests/test_arithmetic.py +94 -74
  167. warp/tests/test_array.py +82 -101
  168. warp/tests/test_array_reduce.py +57 -23
  169. warp/tests/test_atomic.py +64 -28
  170. warp/tests/test_bool.py +22 -12
  171. warp/tests/test_builtins_resolution.py +1292 -0
  172. warp/tests/test_bvh.py +18 -18
  173. warp/tests/test_closest_point_edge_edge.py +54 -57
  174. warp/tests/test_codegen.py +165 -134
  175. warp/tests/test_compile_consts.py +28 -20
  176. warp/tests/test_conditional.py +108 -24
  177. warp/tests/test_copy.py +10 -12
  178. warp/tests/test_ctypes.py +112 -88
  179. warp/tests/test_dense.py +21 -14
  180. warp/tests/test_devices.py +98 -0
  181. warp/tests/test_dlpack.py +75 -75
  182. warp/tests/test_examples.py +237 -0
  183. warp/tests/test_fabricarray.py +22 -24
  184. warp/tests/test_fast_math.py +15 -11
  185. warp/tests/test_fem.py +1034 -124
  186. warp/tests/test_fp16.py +23 -16
  187. warp/tests/test_func.py +187 -86
  188. warp/tests/test_generics.py +194 -49
  189. warp/tests/test_grad.py +123 -181
  190. warp/tests/test_grad_customs.py +176 -0
  191. warp/tests/test_hash_grid.py +35 -34
  192. warp/tests/test_import.py +10 -23
  193. warp/tests/test_indexedarray.py +24 -25
  194. warp/tests/test_intersect.py +18 -9
  195. warp/tests/test_large.py +141 -0
  196. warp/tests/test_launch.py +14 -41
  197. warp/tests/test_lerp.py +64 -65
  198. warp/tests/test_lvalue.py +493 -0
  199. warp/tests/test_marching_cubes.py +12 -13
  200. warp/tests/test_mat.py +517 -2898
  201. warp/tests/test_mat_lite.py +115 -0
  202. warp/tests/test_mat_scalar_ops.py +2889 -0
  203. warp/tests/test_math.py +103 -9
  204. warp/tests/test_matmul.py +304 -69
  205. warp/tests/test_matmul_lite.py +410 -0
  206. warp/tests/test_mesh.py +60 -22
  207. warp/tests/test_mesh_query_aabb.py +21 -25
  208. warp/tests/test_mesh_query_point.py +111 -22
  209. warp/tests/test_mesh_query_ray.py +12 -24
  210. warp/tests/test_mlp.py +30 -22
  211. warp/tests/test_model.py +92 -89
  212. warp/tests/test_modules_lite.py +39 -0
  213. warp/tests/test_multigpu.py +88 -114
  214. warp/tests/test_noise.py +12 -11
  215. warp/tests/test_operators.py +16 -20
  216. warp/tests/test_options.py +11 -11
  217. warp/tests/test_pinned.py +17 -18
  218. warp/tests/test_print.py +32 -11
  219. warp/tests/test_quat.py +275 -129
  220. warp/tests/test_rand.py +18 -16
  221. warp/tests/test_reload.py +38 -34
  222. warp/tests/test_rounding.py +50 -43
  223. warp/tests/test_runlength_encode.py +168 -20
  224. warp/tests/test_smoothstep.py +9 -11
  225. warp/tests/test_snippet.py +143 -0
  226. warp/tests/test_sparse.py +261 -63
  227. warp/tests/test_spatial.py +276 -243
  228. warp/tests/test_streams.py +110 -85
  229. warp/tests/test_struct.py +268 -63
  230. warp/tests/test_tape.py +39 -21
  231. warp/tests/test_torch.py +90 -86
  232. warp/tests/test_transient_module.py +10 -12
  233. warp/tests/test_types.py +363 -0
  234. warp/tests/test_utils.py +451 -0
  235. warp/tests/test_vec.py +354 -2050
  236. warp/tests/test_vec_lite.py +73 -0
  237. warp/tests/test_vec_scalar_ops.py +2099 -0
  238. warp/tests/test_volume.py +418 -376
  239. warp/tests/test_volume_write.py +124 -134
  240. warp/tests/unittest_serial.py +35 -0
  241. warp/tests/unittest_suites.py +291 -0
  242. warp/tests/unittest_utils.py +342 -0
  243. warp/tests/{test_misc.py → unused_test_misc.py} +13 -5
  244. warp/tests/{test_debug.py → walkthough_debug.py} +3 -17
  245. warp/thirdparty/appdirs.py +36 -45
  246. warp/thirdparty/unittest_parallel.py +589 -0
  247. warp/types.py +622 -211
  248. warp/utils.py +54 -393
  249. warp_lang-1.0.0b6.dist-info/METADATA +238 -0
  250. warp_lang-1.0.0b6.dist-info/RECORD +409 -0
  251. {warp_lang-1.0.0b2.dist-info → warp_lang-1.0.0b6.dist-info}/WHEEL +1 -1
  252. examples/example_cache_management.py +0 -40
  253. examples/example_multigpu.py +0 -54
  254. examples/example_struct.py +0 -65
  255. examples/fem/example_stokes_transfer_3d.py +0 -210
  256. warp/bin/warp-clang.so +0 -0
  257. warp/bin/warp.so +0 -0
  258. warp/fem/field/discrete_field.py +0 -80
  259. warp/fem/space/nodal_function_space.py +0 -233
  260. warp/tests/test_all.py +0 -223
  261. warp/tests/test_array_scan.py +0 -60
  262. warp/tests/test_base.py +0 -208
  263. warp/tests/test_unresolved_func.py +0 -7
  264. warp/tests/test_unresolved_symbol.py +0 -7
  265. warp_lang-1.0.0b2.dist-info/METADATA +0 -26
  266. warp_lang-1.0.0b2.dist-info/RECORD +0 -380
  267. /warp/tests/{test_compile_consts_dummy.py → aux_test_compile_consts_dummy.py} +0 -0
  268. /warp/tests/{test_reference_reference.py → aux_test_reference_reference.py} +0 -0
  269. /warp/tests/{test_square.py → aux_test_square.py} +0 -0
  270. {warp_lang-1.0.0b2.dist-info → warp_lang-1.0.0b6.dist-info}/LICENSE.md +0 -0
  271. {warp_lang-1.0.0b2.dist-info → warp_lang-1.0.0b6.dist-info}/top_level.txt +0 -0
@@ -13,12 +13,14 @@ from .utils import tab10_color_map
13
13
 
14
14
  from collections import defaultdict
15
15
  from typing import List, Tuple, Union, Optional
16
+ from enum import Enum
16
17
 
17
18
  import numpy as np
18
19
  import ctypes
19
20
 
20
21
  Mat44 = Union[List[float], List[List[float]], np.ndarray]
21
22
 
23
+
22
24
  wp.set_module_options({"enable_backward": False})
23
25
 
24
26
  shape_vertex_shader = """
@@ -175,12 +177,13 @@ in vec2 TexCoord;
175
177
 
176
178
  uniform vec3 color1;
177
179
  uniform vec3 color2;
180
+ uniform float farPlane;
178
181
 
179
182
  uniform vec3 sunDirection;
180
183
 
181
184
  void main()
182
185
  {
183
- float y = tanh(FragPos.y*0.01)*0.5+0.5;
186
+ float y = tanh(FragPos.y/farPlane*10.0)*0.5+0.5;
184
187
  float height = sqrt(1.0-y);
185
188
 
186
189
  float s = pow(0.5, 1.0 / 10.0);
@@ -222,6 +225,42 @@ void main() {
222
225
  }
223
226
  """
224
227
 
228
+ frame_depth_fragment_shader = """
229
+ #version 330 core
230
+ in vec2 TexCoord;
231
+
232
+ out vec4 FragColor;
233
+
234
+ uniform sampler2D textureSampler;
235
+
236
+ vec3 bourkeColorMap(float v) {
237
+ vec3 c = vec3(1.0, 1.0, 1.0);
238
+
239
+ v = clamp(v, 0.0, 1.0); // Ensures v is between 0 and 1
240
+
241
+ if (v < 0.25) {
242
+ c.r = 0.0;
243
+ c.g = 4.0 * v;
244
+ } else if (v < 0.5) {
245
+ c.r = 0.0;
246
+ c.b = 1.0 + 4.0 * (0.25 - v);
247
+ } else if (v < 0.75) {
248
+ c.r = 4.0 * (v - 0.5);
249
+ c.b = 0.0;
250
+ } else {
251
+ c.g = 1.0 + 4.0 * (0.75 - v);
252
+ c.b = 0.0;
253
+ }
254
+
255
+ return c;
256
+ }
257
+
258
+ void main() {
259
+ float depth = texture(textureSampler, TexCoord).r;
260
+ FragColor = vec4(bourkeColorMap(sqrt(1.0 - depth)), 1.0);
261
+ }
262
+ """
263
+
225
264
 
226
265
  @wp.kernel
227
266
  def update_vbo_transforms(
@@ -411,7 +450,7 @@ def assemble_gfx_vertices(
411
450
 
412
451
 
413
452
  @wp.kernel
414
- def copy_frame(
453
+ def copy_rgb_frame(
415
454
  input_img: wp.array(dtype=wp.uint8),
416
455
  width: int,
417
456
  height: int,
@@ -432,7 +471,26 @@ def copy_frame(
432
471
 
433
472
 
434
473
  @wp.kernel
435
- def copy_frame_tiles(
474
+ def copy_depth_frame(
475
+ input_img: wp.array(dtype=wp.float32),
476
+ width: int,
477
+ height: int,
478
+ near: float,
479
+ far: float,
480
+ # outputs
481
+ output_img: wp.array(dtype=wp.float32, ndim=3),
482
+ ):
483
+ w, v = wp.tid()
484
+ pixel = v * width + w
485
+ # flip vertically (OpenGL coordinates start at bottom)
486
+ v = height - v - 1
487
+ d = 2.0 * input_img[pixel] - 1.0
488
+ d = 2.0 * near * far / ((far - near) * d - near - far)
489
+ output_img[v, w, 0] = -d
490
+
491
+
492
+ @wp.kernel
493
+ def copy_rgb_frame_tiles(
436
494
  input_img: wp.array(dtype=wp.uint8),
437
495
  positions: wp.array(dtype=int, ndim=2),
438
496
  screen_width: int,
@@ -463,7 +521,34 @@ def copy_frame_tiles(
463
521
 
464
522
 
465
523
  @wp.kernel
466
- def copy_frame_tile(
524
+ def copy_depth_frame_tiles(
525
+ input_img: wp.array(dtype=wp.float32),
526
+ positions: wp.array(dtype=int, ndim=2),
527
+ screen_width: int,
528
+ screen_height: int,
529
+ tile_height: int,
530
+ near: float,
531
+ far: float,
532
+ # outputs
533
+ output_img: wp.array(dtype=wp.float32, ndim=4),
534
+ ):
535
+ tile, x, y = wp.tid()
536
+ p = positions[tile]
537
+ qx = x + p[0]
538
+ qy = y + p[1]
539
+ pixel = qy * screen_width + qx
540
+ # flip vertically (OpenGL coordinates start at bottom)
541
+ y = tile_height - y - 1
542
+ if qx >= screen_width or qy >= screen_height:
543
+ output_img[tile, y, x, 0] = far
544
+ return # prevent out-of-bounds access
545
+ d = 2.0 * input_img[pixel] - 1.0
546
+ d = 2.0 * near * far / ((far - near) * d - near - far)
547
+ output_img[tile, y, x, 0] = -d
548
+
549
+
550
+ @wp.kernel
551
+ def copy_rgb_frame_tile(
467
552
  input_img: wp.array(dtype=wp.uint8),
468
553
  offset_x: int,
469
554
  offset_y: int,
@@ -768,15 +853,19 @@ class OpenGLRenderer:
768
853
  up_axis="Y",
769
854
  screen_width=1024,
770
855
  screen_height=768,
771
- near_plane=0.01,
772
- far_plane=1000.0,
856
+ near_plane=1.0,
857
+ far_plane=100.0,
773
858
  camera_fov=45.0,
859
+ camera_pos=(0.0, 2.0, 10.0),
860
+ camera_front=(0.0, 0.0, -1.0),
861
+ camera_up=(0.0, 1.0, 0.0),
774
862
  background_color=(0.53, 0.8, 0.92),
775
863
  draw_grid=True,
776
864
  draw_sky=True,
777
865
  draw_axis=True,
778
866
  show_info=True,
779
867
  render_wireframe=False,
868
+ render_depth=False,
780
869
  axis_scale=1.0,
781
870
  vsync=False,
782
871
  headless=False,
@@ -804,6 +893,7 @@ class OpenGLRenderer:
804
893
  self.draw_axis = draw_axis
805
894
  self.show_info = show_info
806
895
  self.render_wireframe = render_wireframe
896
+ self.render_depth = render_depth
807
897
  self.enable_backface_culling = enable_backface_culling
808
898
 
809
899
  self._device = wp.get_cuda_device()
@@ -819,9 +909,9 @@ class OpenGLRenderer:
819
909
 
820
910
  self.screen_width, self.screen_height = self.window.get_framebuffer_size()
821
911
 
822
- self._camera_pos = PyVec3(0.0, 2.0, 10.0)
823
- self._camera_front = PyVec3(0.0, 0.0, -1.0)
824
- self._camera_up = PyVec3(0.0, 1.0, 0.0)
912
+ self._camera_pos = PyVec3(*camera_pos)
913
+ self._camera_front = PyVec3(*camera_front)
914
+ self._camera_up = PyVec3(*camera_up)
825
915
  self._camera_speed = 0.04
826
916
  if isinstance(up_axis, int):
827
917
  self._camera_axis = up_axis
@@ -832,6 +922,7 @@ class OpenGLRenderer:
832
922
  self._first_mouse = True
833
923
  self._left_mouse_pressed = False
834
924
  self._keys_pressed = defaultdict(bool)
925
+ self._key_callbacks = []
835
926
 
836
927
  self.update_view_matrix()
837
928
  self.update_projection_matrix()
@@ -888,6 +979,7 @@ class OpenGLRenderer:
888
979
  self._tile_projection_matrices = None
889
980
 
890
981
  self._frame_texture = None
982
+ self._frame_depth_texture = None
891
983
  self._frame_fbo = None
892
984
  self._frame_pbo = None
893
985
 
@@ -903,6 +995,8 @@ class OpenGLRenderer:
903
995
 
904
996
  gl.glClearColor(*self.background_color, 1)
905
997
  gl.glEnable(gl.GL_DEPTH_TEST)
998
+ gl.glDepthMask(True)
999
+ gl.glDepthRange(0.0, 1.0)
906
1000
 
907
1001
  self._shape_shader = ShaderProgram(
908
1002
  Shader(shape_vertex_shader, "vertex"), Shader(shape_fragment_shader, "fragment")
@@ -969,15 +1063,17 @@ class OpenGLRenderer:
969
1063
 
970
1064
  self._loc_sky_color1 = gl.glGetUniformLocation(self._sky_shader.id, str_buffer("color1"))
971
1065
  self._loc_sky_color2 = gl.glGetUniformLocation(self._sky_shader.id, str_buffer("color2"))
1066
+ self._loc_sky_far_plane = gl.glGetUniformLocation(self._sky_shader.id, str_buffer("farPlane"))
972
1067
  gl.glUniform3f(self._loc_sky_color1, *background_color)
973
1068
  # glUniform3f(self._loc_sky_color2, *np.clip(np.array(background_color)+0.5, 0.0, 1.0))
974
1069
  gl.glUniform3f(self._loc_sky_color2, 0.8, 0.4, 0.05)
1070
+ gl.glUniform1f(self._loc_sky_far_plane, self.camera_far_plane)
975
1071
  self._loc_sky_view_pos = gl.glGetUniformLocation(self._sky_shader.id, str_buffer("viewPos"))
976
1072
  gl.glUniform3f(
977
1073
  gl.glGetUniformLocation(self._sky_shader.id, str_buffer("sunDirection")), *self._sun_direction
978
1074
  )
979
1075
 
980
- # Create VAO, VBO, and EBO
1076
+ # create VAO, VBO, and EBO
981
1077
  self._sky_vao = gl.GLuint()
982
1078
  gl.glGenVertexArrays(1, self._sky_vao)
983
1079
  gl.glBindVertexArray(self._sky_vao)
@@ -995,7 +1091,7 @@ class OpenGLRenderer:
995
1091
  gl.glBindBuffer(gl.GL_ELEMENT_ARRAY_BUFFER, self._sky_ebo)
996
1092
  gl.glBufferData(gl.GL_ELEMENT_ARRAY_BUFFER, indices.nbytes, indices.ctypes.data, gl.GL_STATIC_DRAW)
997
1093
 
998
- # Set up vertex attributes
1094
+ # set up vertex attributes
999
1095
  vertex_stride = vertices.shape[1] * vertices.itemsize
1000
1096
  # positions
1001
1097
  gl.glVertexAttribPointer(0, 3, gl.GL_FLOAT, gl.GL_FALSE, vertex_stride, ctypes.c_void_p(0))
@@ -1029,6 +1125,7 @@ class OpenGLRenderer:
1029
1125
 
1030
1126
  # create frame buffer for rendering to a texture
1031
1127
  self._frame_texture = None
1128
+ self._frame_depth_texture = None
1032
1129
  self._frame_fbo = None
1033
1130
  self._setup_framebuffer()
1034
1131
 
@@ -1076,7 +1173,15 @@ class OpenGLRenderer:
1076
1173
  gl.glUseProgram(self._frame_shader.id)
1077
1174
  self._frame_loc_texture = gl.glGetUniformLocation(self._frame_shader.id, str_buffer("textureSampler"))
1078
1175
 
1079
- # Unbind the VBO and VAO
1176
+ self._frame_depth_shader = ShaderProgram(
1177
+ Shader(frame_vertex_shader, "vertex"), Shader(frame_depth_fragment_shader, "fragment")
1178
+ )
1179
+ gl.glUseProgram(self._frame_depth_shader.id)
1180
+ self._frame_loc_depth_texture = gl.glGetUniformLocation(
1181
+ self._frame_depth_shader.id, str_buffer("textureSampler")
1182
+ )
1183
+
1184
+ # unbind the VBO and VAO
1080
1185
  gl.glBindBuffer(gl.GL_ARRAY_BUFFER, 0)
1081
1186
  gl.glBindVertexArray(0)
1082
1187
 
@@ -1322,7 +1427,11 @@ class OpenGLRenderer:
1322
1427
  if self._frame_texture is None:
1323
1428
  self._frame_texture = gl.GLuint()
1324
1429
  gl.glGenTextures(1, self._frame_texture)
1430
+ if self._frame_depth_texture is None:
1431
+ self._frame_depth_texture = gl.GLuint()
1432
+ gl.glGenTextures(1, self._frame_depth_texture)
1325
1433
 
1434
+ # set up RGB texture
1326
1435
  gl.glBindFramebuffer(gl.GL_FRAMEBUFFER, 0)
1327
1436
  gl.glBindBuffer(gl.GL_PIXEL_UNPACK_BUFFER, 0)
1328
1437
  gl.glBindTexture(gl.GL_TEXTURE_2D, self._frame_texture)
@@ -1339,6 +1448,22 @@ class OpenGLRenderer:
1339
1448
  )
1340
1449
  gl.glTexParameteri(gl.GL_TEXTURE_2D, gl.GL_TEXTURE_MIN_FILTER, gl.GL_LINEAR)
1341
1450
  gl.glTexParameteri(gl.GL_TEXTURE_2D, gl.GL_TEXTURE_MAG_FILTER, gl.GL_LINEAR)
1451
+
1452
+ # set up depth texture
1453
+ gl.glBindTexture(gl.GL_TEXTURE_2D, self._frame_depth_texture)
1454
+ gl.glTexImage2D(
1455
+ gl.GL_TEXTURE_2D,
1456
+ 0,
1457
+ gl.GL_DEPTH_COMPONENT32,
1458
+ self.screen_width,
1459
+ self.screen_height,
1460
+ 0,
1461
+ gl.GL_DEPTH_COMPONENT,
1462
+ gl.GL_FLOAT,
1463
+ None,
1464
+ )
1465
+ gl.glTexParameteri(gl.GL_TEXTURE_2D, gl.GL_TEXTURE_MIN_FILTER, gl.GL_LINEAR)
1466
+ gl.glTexParameteri(gl.GL_TEXTURE_2D, gl.GL_TEXTURE_MAG_FILTER, gl.GL_LINEAR)
1342
1467
  gl.glBindTexture(gl.GL_TEXTURE_2D, 0)
1343
1468
 
1344
1469
  # create a framebuffer object (FBO)
@@ -1351,15 +1476,9 @@ class OpenGLRenderer:
1351
1476
  gl.glFramebufferTexture2D(
1352
1477
  gl.GL_FRAMEBUFFER, gl.GL_COLOR_ATTACHMENT0, gl.GL_TEXTURE_2D, self._frame_texture, 0
1353
1478
  )
1354
-
1355
- self._frame_depth_renderbuffer = gl.GLuint()
1356
- gl.glGenRenderbuffers(1, self._frame_depth_renderbuffer)
1357
- gl.glBindRenderbuffer(gl.GL_RENDERBUFFER, self._frame_depth_renderbuffer)
1358
- gl.glRenderbufferStorage(gl.GL_RENDERBUFFER, gl.GL_DEPTH_COMPONENT, self.screen_width, self.screen_height)
1359
-
1360
- # attach the depth renderbuffer to the FBO
1361
- gl.glFramebufferRenderbuffer(
1362
- gl.GL_FRAMEBUFFER, gl.GL_DEPTH_ATTACHMENT, gl.GL_RENDERBUFFER, self._frame_depth_renderbuffer
1479
+ # attach the depth texture to the FBO as its depth attachment
1480
+ gl.glFramebufferTexture2D(
1481
+ gl.GL_FRAMEBUFFER, gl.GL_DEPTH_ATTACHMENT, gl.GL_TEXTURE_2D, self._frame_depth_texture, 0
1363
1482
  )
1364
1483
 
1365
1484
  if gl.glCheckFramebufferStatus(gl.GL_FRAMEBUFFER) != gl.GL_FRAMEBUFFER_COMPLETE:
@@ -1367,13 +1486,6 @@ class OpenGLRenderer:
1367
1486
  gl.glBindFramebuffer(gl.GL_FRAMEBUFFER, 0)
1368
1487
  sys.exit(1)
1369
1488
 
1370
- gl.glBindRenderbuffer(gl.GL_RENDERBUFFER, 0)
1371
- else:
1372
- # rescale framebuffer
1373
- gl.glBindRenderbuffer(gl.GL_RENDERBUFFER, self._frame_depth_renderbuffer)
1374
- gl.glRenderbufferStorage(gl.GL_RENDERBUFFER, gl.GL_DEPTH_COMPONENT, self.screen_width, self.screen_height)
1375
- gl.glBindRenderbuffer(gl.GL_RENDERBUFFER, 0)
1376
-
1377
1489
  # unbind the FBO (switch back to the default framebuffer)
1378
1490
  gl.glBindFramebuffer(gl.GL_FRAMEBUFFER, 0)
1379
1491
 
@@ -1383,7 +1495,11 @@ class OpenGLRenderer:
1383
1495
  gl.glBindBuffer(gl.GL_PIXEL_PACK_BUFFER, self._frame_pbo) # binding to this buffer
1384
1496
 
1385
1497
  # allocate memory for PBO
1386
- pixels = np.zeros((self.screen_height, self.screen_width, 3), dtype=np.uint8)
1498
+ rgb_bytes_per_pixel = 3
1499
+ depth_bytes_per_pixel = 4
1500
+ pixels = np.zeros(
1501
+ (self.screen_height, self.screen_width, rgb_bytes_per_pixel + depth_bytes_per_pixel), dtype=np.uint8
1502
+ )
1387
1503
  gl.glBufferData(gl.GL_PIXEL_PACK_BUFFER, pixels.nbytes, pixels.ctypes.data, gl.GL_DYNAMIC_DRAW)
1388
1504
  gl.glBindBuffer(gl.GL_PIXEL_PACK_BUFFER, 0)
1389
1505
 
@@ -1542,7 +1658,6 @@ class OpenGLRenderer:
1542
1658
 
1543
1659
  if self._frame_fbo is not None:
1544
1660
  gl.glBindFramebuffer(gl.GL_FRAMEBUFFER, self._frame_fbo)
1545
- gl.glBindBuffer(gl.GL_PIXEL_UNPACK_BUFFER, self._frame_fbo)
1546
1661
 
1547
1662
  gl.glClearColor(*self.background_color, 1)
1548
1663
  gl.glClear(gl.GL_COLOR_BUFFER_BIT | gl.GL_DEPTH_BUFFER_BIT)
@@ -1580,15 +1695,26 @@ class OpenGLRenderer:
1580
1695
 
1581
1696
  # render frame buffer texture to screen
1582
1697
  if self._frame_fbo is not None:
1583
- with self._frame_shader:
1584
- gl.glActiveTexture(gl.GL_TEXTURE0)
1585
- gl.glBindTexture(gl.GL_TEXTURE_2D, self._frame_texture)
1586
- gl.glUniform1i(self._frame_loc_texture, 0)
1698
+ if self.render_depth:
1699
+ with self._frame_depth_shader:
1700
+ gl.glActiveTexture(gl.GL_TEXTURE0)
1701
+ gl.glBindTexture(gl.GL_TEXTURE_2D, self._frame_depth_texture)
1702
+ gl.glUniform1i(self._frame_loc_depth_texture, 0)
1703
+
1704
+ gl.glBindVertexArray(self._frame_vao)
1705
+ gl.glDrawElements(gl.GL_TRIANGLES, len(self._frame_indices), gl.GL_UNSIGNED_INT, None)
1706
+ gl.glBindVertexArray(0)
1707
+ gl.glBindTexture(gl.GL_TEXTURE_2D, 0)
1708
+ else:
1709
+ with self._frame_shader:
1710
+ gl.glActiveTexture(gl.GL_TEXTURE0)
1711
+ gl.glBindTexture(gl.GL_TEXTURE_2D, self._frame_texture)
1712
+ gl.glUniform1i(self._frame_loc_texture, 0)
1587
1713
 
1588
- gl.glBindVertexArray(self._frame_vao)
1589
- gl.glDrawElements(gl.GL_TRIANGLES, len(self._frame_indices), gl.GL_UNSIGNED_INT, None)
1590
- gl.glBindVertexArray(0)
1591
- gl.glBindTexture(gl.GL_TEXTURE_2D, 0)
1714
+ gl.glBindVertexArray(self._frame_vao)
1715
+ gl.glDrawElements(gl.GL_TRIANGLES, len(self._frame_indices), gl.GL_UNSIGNED_INT, None)
1716
+ gl.glBindVertexArray(0)
1717
+ gl.glBindTexture(gl.GL_TEXTURE_2D, 0)
1592
1718
 
1593
1719
  # check for OpenGL errors
1594
1720
  # check_gl_error()
@@ -1767,9 +1893,17 @@ Instances: {len(self._instances)}"""
1767
1893
  self.show_info = not self.show_info
1768
1894
  if symbol == pyglet.window.key.X:
1769
1895
  self.render_wireframe = not self.render_wireframe
1896
+ if symbol == pyglet.window.key.T:
1897
+ self.render_depth = not self.render_depth
1770
1898
  if symbol == pyglet.window.key.B:
1771
1899
  self.enable_backface_culling = not self.enable_backface_culling
1772
1900
 
1901
+ for cb in self._key_callbacks:
1902
+ cb(symbol, modifiers)
1903
+
1904
+ def register_key_press_callback(self, callback):
1905
+ self._key_callbacks.append(callback)
1906
+
1773
1907
  def _window_resize_callback(self, width, height):
1774
1908
  self._first_mouse = True
1775
1909
  self.screen_width, self.screen_height = self.window.get_framebuffer_size()
@@ -1861,7 +1995,7 @@ Instances: {len(self._instances)}"""
1861
1995
  gl.glDeleteBuffers(1, self._instance_color1_buffer)
1862
1996
  gl.glDeleteBuffers(1, self._instance_color2_buffer)
1863
1997
 
1864
- # Create instance buffer and bind it as an instanced array
1998
+ # create instance buffer and bind it as an instanced array
1865
1999
  self._instance_transform_gl_buffer = gl.GLuint()
1866
2000
  gl.glGenBuffers(1, self._instance_transform_gl_buffer)
1867
2001
  gl.glBindBuffer(gl.GL_ARRAY_BUFFER, self._instance_transform_gl_buffer)
@@ -1869,7 +2003,7 @@ Instances: {len(self._instances)}"""
1869
2003
  transforms = np.tile(np.diag(np.ones(4, dtype=np.float32)), (len(self._instances), 1, 1))
1870
2004
  gl.glBufferData(gl.GL_ARRAY_BUFFER, transforms.nbytes, transforms.ctypes.data, gl.GL_DYNAMIC_DRAW)
1871
2005
 
1872
- # Create CUDA buffer for instance transforms
2006
+ # create CUDA buffer for instance transforms
1873
2007
  self._instance_transform_cuda_buffer = wp.RegisteredGLBuffer(
1874
2008
  int(self._instance_transform_gl_buffer.value), self._device
1875
2009
  )
@@ -1897,7 +2031,7 @@ Instances: {len(self._instances)}"""
1897
2031
  gl.glBindBuffer(gl.GL_ARRAY_BUFFER, self._instance_color2_buffer)
1898
2032
  gl.glBufferData(gl.GL_ARRAY_BUFFER, colors2.nbytes, colors2.ctypes.data, gl.GL_STATIC_DRAW)
1899
2033
 
1900
- # Set up instance attribute pointers
2034
+ # set up instance attribute pointers
1901
2035
  matrix_size = transforms[0].nbytes
1902
2036
 
1903
2037
  instance_ids = []
@@ -2018,9 +2152,27 @@ Instances: {len(self._instances)}"""
2018
2152
  self.clear()
2019
2153
  self.app.event_loop.exit()
2020
2154
 
2021
- def get_pixels(self, target_image: wp.array, split_up_tiles=True):
2155
+ def get_pixels(self, target_image: wp.array, split_up_tiles=True, mode="rgb"):
2156
+ """
2157
+ Read the pixels from the frame buffer (RGB or depth are supported) into the given array.
2158
+
2159
+ If `split_up_tiles` is False, array must be of shape (screen_height, screen_width, 3) for RGB mode or
2160
+ (screen_height, screen_width, 1) for depth mode.
2161
+ If `split_up_tiles` is True, the pixels will be split up into tiles (see :attr:`tile_width` and :attr:`tile_height` for dimensions):
2162
+ array must be of shape (num_tiles, tile_height, tile_width, 3) for RGB mode or (num_tiles, tile_height, tile_width, 1) for depth mode.
2163
+
2164
+ Args:
2165
+ target_image (array): The array to read the pixels into. Must have float32 as dtype and be on a CUDA device.
2166
+ split_up_tiles (bool): Whether to split up the viewport into tiles, see :meth:`setup_tiled_rendering`.
2167
+ mode (str): can be either "rgb" or "depth"
2168
+
2169
+ Returns:
2170
+ bool: Whether the pixels were successfully read.
2171
+ """
2022
2172
  from pyglet import gl
2023
2173
 
2174
+ channels = 3 if mode == "rgb" else 1
2175
+
2024
2176
  if split_up_tiles:
2025
2177
  assert (
2026
2178
  self._tile_width is not None and self._tile_height is not None
@@ -2035,20 +2187,26 @@ Instances: {len(self._instances)}"""
2035
2187
  self.num_tiles,
2036
2188
  self._tile_height,
2037
2189
  self._tile_width,
2038
- 3,
2039
- ), f"Shape of `target_image` array does not match {self.num_tiles} x {self.screen_height} x {self.screen_width} x 3"
2190
+ channels,
2191
+ ), f"Shape of `target_image` array does not match {self.num_tiles} x {self.screen_height} x {self.screen_width} x {channels}"
2040
2192
  else:
2041
2193
  assert target_image.shape == (
2042
2194
  self.screen_height,
2043
2195
  self.screen_width,
2044
- 3,
2045
- ), f"Shape of `target_image` array does not match {self.screen_height} x {self.screen_width} x 3"
2196
+ channels,
2197
+ ), f"Shape of `target_image` array does not match {self.screen_height} x {self.screen_width} x {channels}"
2046
2198
 
2047
2199
  gl.glBindBuffer(gl.GL_PIXEL_PACK_BUFFER, self._frame_pbo)
2048
- gl.glBindTexture(gl.GL_TEXTURE_2D, self._frame_texture)
2200
+ if mode == "rgb":
2201
+ gl.glBindTexture(gl.GL_TEXTURE_2D, self._frame_texture)
2202
+ if mode == "depth":
2203
+ gl.glBindTexture(gl.GL_TEXTURE_2D, self._frame_depth_texture)
2049
2204
  try:
2050
2205
  # read screen texture into PBO
2051
- gl.glGetTexImage(gl.GL_TEXTURE_2D, 0, gl.GL_RGB, gl.GL_UNSIGNED_BYTE, ctypes.c_void_p(0))
2206
+ if mode == "rgb":
2207
+ gl.glGetTexImage(gl.GL_TEXTURE_2D, 0, gl.GL_RGB, gl.GL_UNSIGNED_BYTE, ctypes.c_void_p(0))
2208
+ elif mode == "depth":
2209
+ gl.glGetTexImage(gl.GL_TEXTURE_2D, 0, gl.GL_DEPTH_COMPONENT, gl.GL_FLOAT, ctypes.c_void_p(0))
2052
2210
  except gl.GLException:
2053
2211
  # this can happen if the window is closed/being moved to a different display
2054
2212
  gl.glBindTexture(gl.GL_TEXTURE_2D, 0)
@@ -2061,63 +2219,54 @@ Instances: {len(self._instances)}"""
2061
2219
  int(self._frame_pbo.value), self._device, wp.RegisteredGLBuffer.WRITE_DISCARD
2062
2220
  )
2063
2221
  screen_size = self.screen_height * self.screen_width
2064
- img = pbo_buffer.map(dtype=wp.uint8, shape=(screen_size * 3))
2222
+ if mode == "rgb":
2223
+ img = pbo_buffer.map(dtype=wp.uint8, shape=(screen_size * channels))
2224
+ elif mode == "depth":
2225
+ img = pbo_buffer.map(dtype=wp.float32, shape=(screen_size * channels))
2065
2226
  img = img.to(target_image.device)
2066
2227
  if split_up_tiles:
2067
2228
  positions = wp.array(self._tile_viewports, ndim=2, dtype=wp.int32, device=target_image.device)
2068
- wp.launch(
2069
- copy_frame_tiles,
2070
- dim=(self.num_tiles, self._tile_width, self._tile_height),
2071
- inputs=[img, positions, self.screen_width, self.screen_height, self._tile_height],
2072
- outputs=[target_image],
2073
- device=target_image.device,
2074
- )
2229
+ if mode == "rgb":
2230
+ wp.launch(
2231
+ copy_rgb_frame_tiles,
2232
+ dim=(self.num_tiles, self._tile_width, self._tile_height),
2233
+ inputs=[img, positions, self.screen_width, self.screen_height, self._tile_height],
2234
+ outputs=[target_image],
2235
+ device=target_image.device,
2236
+ )
2237
+ elif mode == "depth":
2238
+ wp.launch(
2239
+ copy_depth_frame_tiles,
2240
+ dim=(self.num_tiles, self._tile_width, self._tile_height),
2241
+ inputs=[
2242
+ img,
2243
+ positions,
2244
+ self.screen_width,
2245
+ self.screen_height,
2246
+ self._tile_height,
2247
+ self.camera_near_plane,
2248
+ self.camera_far_plane,
2249
+ ],
2250
+ outputs=[target_image],
2251
+ device=target_image.device,
2252
+ )
2075
2253
  else:
2076
- wp.launch(
2077
- copy_frame,
2078
- dim=(self.screen_width, self.screen_height),
2079
- inputs=[img, self.screen_width, self.screen_height],
2080
- outputs=[target_image],
2081
- device=target_image.device,
2082
- )
2083
- pbo_buffer.unmap()
2084
- return True
2085
-
2086
- def get_tile_pixels(self, tile_id: int, target_image: wp.array):
2087
- from pyglet import gl
2088
-
2089
- viewport = self._tile_viewports[tile_id]
2090
- assert target_image.shape == (
2091
- viewport[3],
2092
- viewport[2],
2093
- 3,
2094
- ), f"Shape of `target_image` array does not match {viewport[3]} x {viewport[2]} x 3"
2095
- gl.glBindBuffer(gl.GL_PIXEL_PACK_BUFFER, self._frame_pbo)
2096
- gl.glBindTexture(gl.GL_TEXTURE_2D, self._frame_texture)
2097
- try:
2098
- # read screen texture into PBO
2099
- gl.glGetTexImage(gl.GL_TEXTURE_2D, 0, gl.GL_RGB, gl.GL_UNSIGNED_BYTE, ctypes.c_void_p(0))
2100
- except gl.GLException:
2101
- # this can happen if the window is closed/being moved to a different display
2102
- gl.glBindTexture(gl.GL_TEXTURE_2D, 0)
2103
- gl.glBindBuffer(gl.GL_PIXEL_PACK_BUFFER, 0)
2104
- return False
2105
- gl.glBindTexture(gl.GL_TEXTURE_2D, 0)
2106
- gl.glBindBuffer(gl.GL_PIXEL_PACK_BUFFER, 0)
2107
-
2108
- pbo_buffer = wp.RegisteredGLBuffer(
2109
- int(self._frame_pbo.value), self._device, wp.RegisteredGLBuffer.WRITE_DISCARD
2110
- )
2111
- screen_size = self.screen_height * self.screen_width
2112
- img = pbo_buffer.map(dtype=wp.uint8, shape=(screen_size * 3))
2113
- img = img.to(target_image.device)
2114
- wp.launch(
2115
- copy_frame_tiles,
2116
- dim=(self.num_tiles, self._tile_width, self._tile_height),
2117
- inputs=[img, viewport[0], viewport[1], self.screen_width, self.screen_height, self._tile_height],
2118
- outputs=[target_image],
2119
- device=target_image.device,
2120
- )
2254
+ if mode == "rgb":
2255
+ wp.launch(
2256
+ copy_rgb_frame,
2257
+ dim=(self.screen_width, self.screen_height),
2258
+ inputs=[img, self.screen_width, self.screen_height],
2259
+ outputs=[target_image],
2260
+ device=target_image.device,
2261
+ )
2262
+ elif mode == "depth":
2263
+ wp.launch(
2264
+ copy_depth_frame,
2265
+ dim=(self.screen_width, self.screen_height),
2266
+ inputs=[img, self.screen_width, self.screen_height, self.camera_near_plane, self.camera_far_plane],
2267
+ outputs=[target_image],
2268
+ device=target_image.device,
2269
+ )
2121
2270
  pbo_buffer.unmap()
2122
2271
  return True
2123
2272
 
@@ -2570,7 +2719,7 @@ Instances: {len(self._instances)}"""
2570
2719
  if name not in self._shape_instancers:
2571
2720
  instancer = ShapeInstancer(self._shape_shader, self._device)
2572
2721
  vertices, indices = self._create_capsule_mesh(radius, 0.5)
2573
- if color is None or isinstance(color, list):
2722
+ if color is None or isinstance(color, list) and len(color) > 0 and isinstance(color[0], list):
2574
2723
  color = tab10_color_map(len(self._shape_geo_hash))
2575
2724
  instancer.register_shape(vertices, indices, color, color)
2576
2725
  instancer.allocate_instances(np.zeros((len(lines), 3)))
@@ -2640,7 +2789,12 @@ Instances: {len(self._instances)}"""
2640
2789
  cuda_buffer.unmap()
2641
2790
 
2642
2791
  @staticmethod
2643
- def _create_sphere_mesh(radius=1.0, num_latitudes=default_num_segments, num_longitudes=default_num_segments, reverse_winding=False):
2792
+ def _create_sphere_mesh(
2793
+ radius=1.0,
2794
+ num_latitudes=default_num_segments,
2795
+ num_longitudes=default_num_segments,
2796
+ reverse_winding=False,
2797
+ ):
2644
2798
  vertices = []
2645
2799
  indices = []
2646
2800
 
@@ -2754,7 +2908,7 @@ Instances: {len(self._instances)}"""
2754
2908
  top_radius = radius
2755
2909
  side_slope = -np.arctan2(top_radius - radius, 2 * half_height)
2756
2910
 
2757
- # Create the cylinder base and top vertices
2911
+ # create the cylinder base and top vertices
2758
2912
  for j in (-1, 1):
2759
2913
  center_index = max(j, 0)
2760
2914
  if j == 1:
@@ -2782,12 +2936,10 @@ Instances: {len(self._instances)}"""
2782
2936
  vertex = np.hstack([position[[x_dir, y_dir, z_dir]], normal[[x_dir, y_dir, z_dir]], uv])
2783
2937
  cap_vertices.append(vertex)
2784
2938
 
2785
- indices.extend(
2786
- [center_index, i + center_index * segments + 2,
2787
- (i + 1) % segments + center_index * segments + 2][::-j]
2788
- )
2939
+ cs = center_index * segments
2940
+ indices.extend([center_index, i + cs + 2, (i + 1) % segments + cs + 2][::-j])
2789
2941
 
2790
- # Create the cylinder side indices
2942
+ # create the cylinder side indices
2791
2943
  for i in range(segments):
2792
2944
  index1 = len(cap_vertices) + i + segments
2793
2945
  index2 = len(cap_vertices) + ((i + 1) % segments) + segments
warp/sim/__init__.py CHANGED
@@ -47,5 +47,4 @@ from .articulation import eval_fk, eval_ik
47
47
  from .import_mjcf import parse_mjcf
48
48
  from .import_urdf import parse_urdf
49
49
  from .import_snu import parse_snu
50
- from .import_usd import parse_usd
51
-
50
+ from .import_usd import parse_usd, resolve_usd_from_url