Hey folks, I’m trying to draw a rectangular selection using this snippet of code and doesn’t work with render2d, I’m using QPanda3D. When I change render2d to render, it works drawing inside my scene the card but this doesn’t match mouse positions. It appears to be a problem with render2d on QPanda3D because I can create 2d objects on a vanilla Panda3D environment. Any help would be great.
https://github.com/ParisNeo/QPanda3D/tree/master/QPanda3D
from direct.showbase.DirectObject import DirectObject
from direct.task.Task import Task
from panda3d.core import CardMaker, CollisionHandlerQueue, CollisionTraverser, LineSegs, CollisionNode, CollisionRay, \
Point2, BitMask32
from view.World import World
class Select(DirectObject):
""" Class to manage all selectable objects in the screen"""
_instance = None
world = World.instance()
def __init__(self):
self.collTrav = CollisionTraverser('selector')
self.selHandler = CollisionHandlerQueue()
self.selection = set()
self.tmpSelection = set()
CM = CardMaker('sel')
CM.setFrame(0, 1, 0, 1)
self.rect = render2d.attachNewNode(CM.generate())
self.rect.setColor(0, 1, 1, .2)
self.rect.setTransparency(1)
#self.rect.hide()
LS = LineSegs()
LS.moveTo(0, 0, 0)
LS.drawTo(1, 0, 0)
LS.drawTo(1, 0, 1)
LS.drawTo(0, 0, 1)
LS.drawTo(0, 0, 0)
self.rect.attachNewNode(LS.create())
# binding the key to the click
self.accept("mouse1", self.click)
# add collision-detection for single clicks
self.clickColNP = self.world.showbase.camera.attachNewNode(CollisionNode('sel'))
self.clickColRay = CollisionRay()
self.clickColNP.node().addSolid(self.clickColRay)
# set the FROM mask to 0x10 to match the INTO mask of the balls
self.clickColNP.node().setFromCollideMask(BitMask32.bit(2))
self.clickColNP.node().setIntoCollideMask(BitMask32.allOff())
self.collTrav.addCollider(self.clickColNP, self.selHandler)
def click(self):
if not self.world.showbase.mouseWatcherNode.hasMouse():
return
self.click_start = Point2(self.world.showbase.mouseWatcherNode.getMouse())
self.rect.setPos(self.click_start[0], 0, self.click_start[1])
self.rect.show()
t = taskMgr.add(self.update_rect, "update_rect")
self.acceptOnce("mouse1-up", self.release_click, extraArgs=[t])
def release_click(self, t):
taskMgr.remove(t)
def update_rect(self, task):
if not self.world.showbase.mouseWatcherNode.hasMouse(): # check for mouse first, in case the mouse is outside the Panda window
return Task.cont
d = self.world.showbase.mouseWatcherNode.getMouse() - self.click_start
self.rect.setScale(d[0] if d[0] else 1e-3, 1, d[1] if d[1] else 1e-3)
return task.cont
@classmethod
def instance(cls):
if cls._instance is None:
cls._instance = cls()
return cls._instance