Ugh, looks like QPanda3D renders to a separate texture buffer instead of to the regular window, so any new display regions need to be added to that buffer. Another problem (likely for the same reason) seems to be that neither the window-event
nor the aspectRatioChanged
event gets thrown when the window is resized.
The way to solve this is to not use QPanda3D change the code in AxisTripod.py
as follows:
class AxisTripod:
def __init__(self, showbase):
self._buffer = showbase.buff
self._dr_pixel_size = 68 # size of display region in pixels
dr = self._buffer.make_display_region(0, 1., 0., 1.)
dr.sort = 2
lens = OrthographicLens()
lens.film_size = .235
self._cam_target = cam_target = NodePath("tripod_cam_target")
cam_target.set_compass(showbase.cam)
cam_node = Camera("tripod_cam")
camera = cam_target.attach_new_node(cam_node)
camera.node().set_lens(lens)
dr.camera = camera
dr.set_clear_color_active(False)
dr.set_clear_depth_active(True)
self._display_region = dr
self._root = camera.attach_new_node("world_axes")
self._root.set_y(10.)
self.model = self.__create_model()
node = self._root.node()
node.set_bounds(OmniBoundingVolume())
node.final = True
self._buffer_size = (0, 0)
showbase.task_mgr.do_method_later(.2, self.__update_region_size, "update_region_size")
def __create_model(self):
vertex_format = GeomVertexFormat.get_v3c4()
vertex_data = GeomVertexData("axis_tripod_data", vertex_format, Geom.UH_static)
pos_writer = GeomVertexWriter(vertex_data, "vertex")
col_writer = GeomVertexWriter(vertex_data, "color")
lines = GeomLines(Geom.UH_static)
for i in range(3):
v_pos = VBase3()
pos_writer.add_data3(v_pos)
v_pos[i] = .1
pos_writer.add_data3(v_pos)
color = VBase4(0., 0., 0., 1.)
color[i] = 1.
col_writer.add_data4(color)
col_writer.add_data4(color)
lines.add_vertices(i * 2, i * 2 + 1)
geom = Geom(vertex_data)
geom.add_primitive(lines)
node = GeomNode("axis_tripod")
node.add_geom(geom)
model = self._root.attach_new_node(node)
return model
def __update_region_size(self, task):
win_w, win_h = self._buffer.size
if self._buffer_size == (win_w, win_h):
return task.again
aspect_ratio = win_w / win_h
size_h = self._dr_pixel_size / win_w
size_v = size_h * aspect_ratio
self._buffer_size = (win_w, win_h)
self._display_region.dimensions = (0., size_h, 0., size_v)
return task.again
So __update_region_size
has now become a task which runs every 0.2 seconds such that it doesn’t impact performance too much.