class _Camera_: key_map = {} mouse_map = {} # Public. def set_focus(self, obj): if self.FOCUS and obj is self.FOCUS: return self.FOCUS = obj self.focus_pos.set(0, obj.radius*12, 0) obj_state = self.env.client.SIM.get_object_state(obj.name, ["sys_pos"]) obj.sys_pos = LVector3d(*obj_state['sys_pos']) self.sys_pos = obj.sys_pos - self.focus_pos # Setup. def __init__(self, env): self.env = env self.cam_node = Camera(self.__class__.__name__.lower()) self.cam_node.setScene(env.NP) self.NP = NodePath(self.cam_node) self.NP.reparentTo(env.NP) self.LENS = self.cam_node.getLens() self.LENS.setFar(_cam.FAR) self.LENS.setFov(base.camLens.getFov()) self.FOCUS = None self.focus_pos = LVector3d(0,0,0) self.sys_pos = LVector3d(0,0,0)
class _Camera_: key_map = {} mouse_map = {} # Public. def set_focus(self, obj): if self.FOCUS and obj is self.FOCUS: return self.FOCUS = obj self.focus_pos.set(0, obj.radius * 12, 0) obj_state = self.env.client.SIM.get_object_state(obj.name, ["sys_pos"]) obj.sys_pos = LVector3d(*obj_state['sys_pos']) self.sys_pos = obj.sys_pos - self.focus_pos # Setup. def __init__(self, env): self.env = env self.cam_node = Camera(self.__class__.__name__.lower()) self.cam_node.setScene(env.NP) self.NP = NodePath(self.cam_node) self.NP.reparentTo(env.NP) self.LENS = self.cam_node.getLens() self.LENS.setFar(_cam.FAR) self.LENS.setFov(base.camLens.getFov()) self.FOCUS = None self.focus_pos = LVector3d(0, 0, 0) self.sys_pos = LVector3d(0, 0, 0)
def _initDepthCapture(self): for camera in self.cameras: camNode = Camera('Depth camera') camNode.setCameraMask(self.cameraMask) lens = PerspectiveLens() lens.setFov(self.fov) lens.setAspectRatio(float(self.size[0]) / float(self.size[1])) lens.setNear(self.zNear) lens.setFar(self.zFar) camNode.setLens(lens) camNode.setScene(self.scene.scene) cam = camera.attachNewNode(camNode) winprops = WindowProperties.size(self.size[0], self.size[1]) fbprops = FrameBufferProperties.getDefault() fbprops = FrameBufferProperties(fbprops) fbprops.setRgbColor(False) fbprops.setRgbaBits(0, 0, 0, 0) fbprops.setStencilBits(0) fbprops.setMultisamples(0) fbprops.setBackBuffers(0) fbprops.setDepthBits(16) flags = GraphicsPipe.BFFbPropsOptional if self.mode == 'onscreen': flags = flags | GraphicsPipe.BFRequireWindow elif self.mode == 'offscreen': flags = flags | GraphicsPipe.BFRefuseWindow else: raise Exception('Unsupported rendering mode: %s' % (self.mode)) buf = self.graphicsEngine.makeOutput(self.pipe, 'Depth buffer', 0, fbprops, winprops, flags) if buf is None: raise Exception('Unable to create depth buffer') # Set to render at the end buf.setSort(10000) dr = buf.makeDisplayRegion() dr.setSort(0) dr.setCamera(cam) dr = camNode.getDisplayRegion(0) tex = Texture() tex.setFormat(Texture.FDepthComponent) tex.setComponentType(Texture.TFloat) buf.addRenderTexture(tex, GraphicsOutput.RTMCopyRam, GraphicsOutput.RTPDepth) # XXX: should use tex.setMatchFramebufferFormat(True)? agent = camera.getParent() self.depthBuffers[agent.getName()] = buf self.depthTextures[agent.getName()] = tex
def _initRgbCapture(self): for camera in self.cameras: camNode = Camera('Semantic camera') camNode.setCameraMask(self.cameraMask) lens = PerspectiveLens() lens.setFov(self.fov) lens.setAspectRatio(float(self.size[0]) / float(self.size[1])) lens.setNear(self.zNear) lens.setFar(self.zFar) camNode.setLens(lens) camNode.setScene(self.scene.scene) cam = camera.attachNewNode(camNode) winprops = WindowProperties.size(self.size[0], self.size[1]) fbprops = FrameBufferProperties.getDefault() fbprops = FrameBufferProperties(fbprops) fbprops.setRgbaBits(8, 8, 8, 8) flags = GraphicsPipe.BFFbPropsOptional if self.mode == 'onscreen': flags = flags | GraphicsPipe.BFRequireWindow elif self.mode == 'offscreen': flags = flags | GraphicsPipe.BFRefuseWindow else: raise Exception('Unsupported rendering mode: %s' % (self.mode)) buf = self.graphicsEngine.makeOutput(self.pipe, 'RGB-buffer-Semantics', 0, fbprops, winprops, flags) if buf is None: raise Exception('Unable to create RGB buffer') # Set to render at the end buf.setSort(10000) dr = buf.makeDisplayRegion() dr.setSort(0) dr.setCamera(cam) dr = camNode.getDisplayRegion(0) tex = Texture() tex.setFormat(Texture.FRgba8) tex.setComponentType(Texture.TUnsignedByte) buf.addRenderTexture(tex, GraphicsOutput.RTMCopyRam, GraphicsOutput.RTPColor) # XXX: should use tex.setMatchFramebufferFormat(True)? self.rgbBuffers[camera.getNetTag('agent-id')] = buf self.rgbTextures[camera.getNetTag('agent-id')] = tex
def makeCamera(self, win, sort=0, scene=None, displayRegion=(0, 1, 0, 1), stereo=None, aspectRatio=None, clearDepth=0, clearColor=None, lens=None, camName='cam', mask=None, useCamera=None): """ Makes a new 3-d camera associated with the indicated window, and creates a display region in the indicated subrectangle. If stereo is True, then a stereo camera is created, with a pair of DisplayRegions. If stereo is False, then a standard camera is created. If stereo is None or omitted, a stereo camera is created if the window says it can render in stereo. If useCamera is not None, it is a NodePath to be used as the camera to apply to the window, rather than creating a new camera. """ # self.camera is the parent node of all cameras: a node that # we can move around to move all cameras as a group. if self.camera == None: # We make it a ModelNode with the PTLocal flag, so that # a wayward flatten operations won't attempt to mangle the # camera. self.camera = self.render.attachNewNode(ModelNode('camera')) self.camera.node().setPreserveTransform(ModelNode.PTLocal) builtins.camera = self.camera self.mouse2cam.node().setNode(self.camera.node()) if useCamera: # Use the existing camera node. cam = useCamera camNode = useCamera.node() assert (isinstance(camNode, Camera)) lens = camNode.getLens() cam.reparentTo(self.camera) else: # Make a new Camera node. camNode = Camera(camName) if lens == None: lens = PerspectiveLens() if aspectRatio == None: aspectRatio = self.getAspectRatio(win) lens.setAspectRatio(aspectRatio) cam = self.camera.attachNewNode(camNode) if lens != None: camNode.setLens(lens) if scene != None: camNode.setScene(scene) if mask != None: if (isinstance(mask, int)): mask = BitMask32(mask) camNode.setCameraMask(mask) if self.cam == None: self.cam = cam self.camNode = camNode self.camLens = lens self.camList.append(cam) # Now, make a DisplayRegion for the camera. if stereo is not None: if stereo: dr = win.makeStereoDisplayRegion(*displayRegion) else: dr = win.makeMonoDisplayRegion(*displayRegion) else: dr = win.makeDisplayRegion(*displayRegion) dr.setSort(sort) dr.disableClears() # By default, we do not clear 3-d display regions (the entire # window will be cleared, which is normally sufficient). But # we will if clearDepth is specified. if clearDepth: dr.setClearDepthActive(1) if clearColor: dr.setClearColorActive(1) dr.setClearColor(clearColor) dr.setCamera(cam) return cam