warp-lang 1.0.0b5__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.
- docs/conf.py +3 -4
- examples/env/env_ant.py +1 -1
- examples/env/env_cartpole.py +1 -1
- examples/env/env_humanoid.py +1 -1
- examples/example_dem.py +28 -26
- examples/example_diffray.py +37 -30
- examples/example_fluid.py +7 -3
- examples/example_jacobian_ik.py +1 -1
- examples/example_mesh_intersect.py +10 -7
- examples/example_nvdb.py +3 -3
- examples/example_render_opengl.py +19 -10
- examples/example_sim_cartpole.py +9 -5
- examples/example_sim_cloth.py +29 -25
- examples/example_sim_fk_grad.py +2 -2
- examples/example_sim_fk_grad_torch.py +3 -3
- examples/example_sim_grad_bounce.py +11 -8
- examples/example_sim_grad_cloth.py +12 -9
- examples/example_sim_granular.py +2 -2
- examples/example_sim_granular_collision_sdf.py +13 -13
- examples/example_sim_neo_hookean.py +3 -3
- examples/example_sim_particle_chain.py +2 -2
- examples/example_sim_quadruped.py +8 -5
- examples/example_sim_rigid_chain.py +8 -5
- examples/example_sim_rigid_contact.py +13 -10
- examples/example_sim_rigid_fem.py +2 -2
- examples/example_sim_rigid_gyroscopic.py +2 -2
- examples/example_sim_rigid_kinematics.py +1 -1
- examples/example_sim_trajopt.py +3 -2
- examples/fem/example_apic_fluid.py +5 -7
- examples/fem/example_diffusion_mgpu.py +18 -16
- warp/__init__.py +3 -2
- warp/bin/warp-clang.dll +0 -0
- warp/bin/warp.dll +0 -0
- warp/build_dll.py +29 -9
- warp/builtins.py +206 -7
- warp/codegen.py +58 -38
- warp/config.py +3 -1
- warp/context.py +234 -128
- warp/fem/__init__.py +2 -2
- warp/fem/cache.py +2 -1
- warp/fem/field/nodal_field.py +18 -17
- warp/fem/geometry/hexmesh.py +11 -6
- warp/fem/geometry/quadmesh_2d.py +16 -12
- warp/fem/geometry/tetmesh.py +19 -8
- warp/fem/geometry/trimesh_2d.py +18 -7
- warp/fem/integrate.py +341 -196
- warp/fem/quadrature/__init__.py +1 -1
- warp/fem/quadrature/pic_quadrature.py +138 -53
- warp/fem/quadrature/quadrature.py +81 -9
- warp/fem/space/__init__.py +1 -1
- warp/fem/space/basis_space.py +169 -51
- warp/fem/space/grid_2d_function_space.py +2 -2
- warp/fem/space/grid_3d_function_space.py +2 -2
- warp/fem/space/hexmesh_function_space.py +2 -2
- warp/fem/space/partition.py +9 -6
- warp/fem/space/quadmesh_2d_function_space.py +2 -2
- warp/fem/space/shape/cube_shape_function.py +27 -15
- warp/fem/space/shape/square_shape_function.py +29 -18
- warp/fem/space/tetmesh_function_space.py +2 -2
- warp/fem/space/topology.py +10 -0
- warp/fem/space/trimesh_2d_function_space.py +2 -2
- warp/fem/utils.py +10 -5
- warp/native/array.h +49 -8
- warp/native/builtin.h +31 -14
- warp/native/cuda_util.cpp +8 -3
- warp/native/cuda_util.h +1 -0
- warp/native/exports.h +1177 -1108
- warp/native/intersect.h +4 -4
- warp/native/intersect_adj.h +8 -8
- warp/native/mat.h +65 -6
- warp/native/mesh.h +126 -5
- warp/native/quat.h +28 -4
- warp/native/vec.h +76 -14
- warp/native/warp.cu +1 -6
- warp/render/render_opengl.py +261 -109
- warp/sim/import_mjcf.py +13 -7
- warp/sim/import_urdf.py +14 -14
- warp/sim/inertia.py +17 -18
- warp/sim/model.py +67 -67
- warp/sim/render.py +1 -1
- warp/sparse.py +6 -6
- warp/stubs.py +19 -81
- warp/tape.py +1 -1
- warp/tests/__main__.py +3 -6
- warp/tests/{test_class_kernel.py → aux_test_class_kernel.py} +9 -1
- warp/tests/aux_test_conditional_unequal_types_kernels.py +21 -0
- warp/tests/{test_dependent.py → aux_test_dependent.py} +2 -2
- warp/tests/{test_reference.py → aux_test_reference.py} +1 -1
- warp/tests/aux_test_unresolved_func.py +14 -0
- warp/tests/aux_test_unresolved_symbol.py +14 -0
- warp/tests/{test_kinematics.py → disabled_kinematics.py} +10 -12
- warp/tests/run_coverage_serial.py +31 -0
- warp/tests/test_adam.py +102 -106
- warp/tests/test_arithmetic.py +39 -40
- warp/tests/test_array.py +46 -48
- warp/tests/test_array_reduce.py +25 -19
- warp/tests/test_atomic.py +62 -26
- warp/tests/test_bool.py +16 -11
- warp/tests/test_builtins_resolution.py +1292 -0
- warp/tests/test_bvh.py +9 -12
- warp/tests/test_closest_point_edge_edge.py +53 -57
- warp/tests/test_codegen.py +164 -134
- warp/tests/test_compile_consts.py +13 -19
- warp/tests/test_conditional.py +30 -32
- warp/tests/test_copy.py +9 -12
- warp/tests/test_ctypes.py +90 -98
- warp/tests/test_dense.py +20 -14
- warp/tests/test_devices.py +34 -35
- warp/tests/test_dlpack.py +74 -75
- warp/tests/test_examples.py +215 -97
- warp/tests/test_fabricarray.py +15 -21
- warp/tests/test_fast_math.py +14 -11
- warp/tests/test_fem.py +280 -97
- warp/tests/test_fp16.py +19 -15
- warp/tests/test_func.py +177 -194
- warp/tests/test_generics.py +71 -77
- warp/tests/test_grad.py +83 -32
- warp/tests/test_grad_customs.py +7 -9
- warp/tests/test_hash_grid.py +6 -10
- warp/tests/test_import.py +9 -23
- warp/tests/test_indexedarray.py +19 -21
- warp/tests/test_intersect.py +15 -9
- warp/tests/test_large.py +17 -19
- warp/tests/test_launch.py +14 -17
- warp/tests/test_lerp.py +63 -63
- warp/tests/test_lvalue.py +84 -35
- warp/tests/test_marching_cubes.py +9 -13
- warp/tests/test_mat.py +388 -3004
- warp/tests/test_mat_lite.py +9 -12
- warp/tests/test_mat_scalar_ops.py +2889 -0
- warp/tests/test_math.py +10 -11
- warp/tests/test_matmul.py +104 -100
- warp/tests/test_matmul_lite.py +72 -98
- warp/tests/test_mesh.py +35 -32
- warp/tests/test_mesh_query_aabb.py +18 -25
- warp/tests/test_mesh_query_point.py +39 -23
- warp/tests/test_mesh_query_ray.py +9 -21
- warp/tests/test_mlp.py +8 -9
- warp/tests/test_model.py +89 -93
- warp/tests/test_modules_lite.py +15 -25
- warp/tests/test_multigpu.py +87 -114
- warp/tests/test_noise.py +10 -12
- warp/tests/test_operators.py +14 -21
- warp/tests/test_options.py +10 -11
- warp/tests/test_pinned.py +16 -18
- warp/tests/test_print.py +16 -20
- warp/tests/test_quat.py +121 -88
- warp/tests/test_rand.py +12 -13
- warp/tests/test_reload.py +27 -32
- warp/tests/test_rounding.py +7 -10
- warp/tests/test_runlength_encode.py +105 -106
- warp/tests/test_smoothstep.py +8 -9
- warp/tests/test_snippet.py +13 -22
- warp/tests/test_sparse.py +30 -29
- warp/tests/test_spatial.py +179 -174
- warp/tests/test_streams.py +100 -107
- warp/tests/test_struct.py +98 -67
- warp/tests/test_tape.py +11 -17
- warp/tests/test_torch.py +89 -86
- warp/tests/test_transient_module.py +9 -12
- warp/tests/test_types.py +328 -50
- warp/tests/test_utils.py +217 -218
- warp/tests/test_vec.py +133 -2133
- warp/tests/test_vec_lite.py +8 -11
- warp/tests/test_vec_scalar_ops.py +2099 -0
- warp/tests/test_volume.py +391 -382
- warp/tests/test_volume_write.py +122 -135
- warp/tests/unittest_serial.py +35 -0
- warp/tests/unittest_suites.py +291 -0
- warp/tests/{test_base.py → unittest_utils.py} +138 -25
- warp/tests/{test_misc.py → unused_test_misc.py} +13 -5
- warp/tests/{test_debug.py → walkthough_debug.py} +2 -15
- warp/thirdparty/unittest_parallel.py +257 -54
- warp/types.py +119 -98
- warp/utils.py +14 -0
- {warp_lang-1.0.0b5.dist-info → warp_lang-1.0.0b6.dist-info}/METADATA +2 -1
- {warp_lang-1.0.0b5.dist-info → warp_lang-1.0.0b6.dist-info}/RECORD +183 -179
- {warp_lang-1.0.0b5.dist-info → warp_lang-1.0.0b6.dist-info}/WHEEL +1 -1
- warp/tests/test_all.py +0 -239
- warp/tests/test_conditional_unequal_types_kernels.py +0 -14
- warp/tests/test_coverage.py +0 -38
- warp/tests/test_unresolved_func.py +0 -7
- warp/tests/test_unresolved_symbol.py +0 -7
- /warp/tests/{test_compile_consts_dummy.py → aux_test_compile_consts_dummy.py} +0 -0
- /warp/tests/{test_reference_reference.py → aux_test_reference_reference.py} +0 -0
- /warp/tests/{test_square.py → aux_test_square.py} +0 -0
- {warp_lang-1.0.0b5.dist-info → warp_lang-1.0.0b6.dist-info}/LICENSE.md +0 -0
- {warp_lang-1.0.0b5.dist-info → warp_lang-1.0.0b6.dist-info}/top_level.txt +0 -0
warp/render/render_opengl.py
CHANGED
|
@@ -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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
772
|
-
far_plane=
|
|
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(
|
|
823
|
-
self._camera_front = PyVec3(
|
|
824
|
-
self._camera_up = PyVec3(
|
|
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
|
-
#
|
|
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
|
-
#
|
|
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
|
-
|
|
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
|
-
|
|
1356
|
-
|
|
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
|
-
|
|
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
|
-
|
|
1584
|
-
|
|
1585
|
-
|
|
1586
|
-
|
|
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
|
-
|
|
1589
|
-
|
|
1590
|
-
|
|
1591
|
-
|
|
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
|
-
#
|
|
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
|
-
#
|
|
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
|
-
#
|
|
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
|
-
|
|
2039
|
-
), f"Shape of `target_image` array does not match {self.num_tiles} x {self.screen_height} x {self.screen_width} x
|
|
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
|
-
|
|
2045
|
-
), f"Shape of `target_image` array does not match {self.screen_height} x {self.screen_width} x
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
2069
|
-
|
|
2070
|
-
|
|
2071
|
-
|
|
2072
|
-
|
|
2073
|
-
|
|
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
|
-
|
|
2077
|
-
|
|
2078
|
-
|
|
2079
|
-
|
|
2080
|
-
|
|
2081
|
-
|
|
2082
|
-
|
|
2083
|
-
|
|
2084
|
-
|
|
2085
|
-
|
|
2086
|
-
|
|
2087
|
-
|
|
2088
|
-
|
|
2089
|
-
|
|
2090
|
-
|
|
2091
|
-
|
|
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(
|
|
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
|
-
#
|
|
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
|
-
|
|
2786
|
-
|
|
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
|
-
#
|
|
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/import_mjcf.py
CHANGED
|
@@ -150,9 +150,15 @@ def parse_mjcf(
|
|
|
150
150
|
|
|
151
151
|
def parse_vec(attrib, key, default):
|
|
152
152
|
if key in attrib:
|
|
153
|
-
|
|
153
|
+
out = np.fromstring(attrib[key], sep=" ", dtype=np.float32)
|
|
154
154
|
else:
|
|
155
|
-
|
|
155
|
+
out = np.array(default, dtype=np.float32)
|
|
156
|
+
|
|
157
|
+
length = len(out)
|
|
158
|
+
if length == 1:
|
|
159
|
+
return wp.vec(len(default), wp.float32)(out[0], out[0], out[0])
|
|
160
|
+
|
|
161
|
+
return wp.vec(length, wp.float32)(out)
|
|
156
162
|
|
|
157
163
|
def parse_orientation(attrib):
|
|
158
164
|
if "quat" in attrib:
|
|
@@ -397,19 +403,19 @@ def parse_mjcf(
|
|
|
397
403
|
if "fromto" in geom_attrib:
|
|
398
404
|
geom_fromto = parse_vec(geom_attrib, "fromto", (0.0, 0.0, 0.0, 1.0, 0.0, 0.0))
|
|
399
405
|
|
|
400
|
-
start = geom_fromto[0:3] * scale
|
|
401
|
-
end = geom_fromto[3:6] * scale
|
|
406
|
+
start = wp.vec3(geom_fromto[0:3]) * scale
|
|
407
|
+
end = wp.vec3(geom_fromto[3:6]) * scale
|
|
402
408
|
|
|
403
409
|
# compute rotation to align the Warp capsule (along x-axis), with mjcf fromto direction
|
|
404
410
|
axis = wp.normalize(end - start)
|
|
405
|
-
angle = math.acos(
|
|
406
|
-
axis = wp.normalize(
|
|
411
|
+
angle = math.acos(wp.dot(axis, wp.vec3(0.0, 1.0, 0.0)))
|
|
412
|
+
axis = wp.normalize(wp.cross(axis, wp.vec3(0.0, 1.0, 0.0)))
|
|
407
413
|
|
|
408
414
|
geom_pos = (start + end) * 0.5
|
|
409
415
|
geom_rot = wp.quat_from_axis_angle(axis, -angle)
|
|
410
416
|
|
|
411
417
|
geom_radius = geom_size[0]
|
|
412
|
-
geom_height =
|
|
418
|
+
geom_height = wp.length(end - start) * 0.5
|
|
413
419
|
geom_up_axis = 1
|
|
414
420
|
|
|
415
421
|
else:
|