main.py 5.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172
  1. #!/usr/bin/env python
  2. '''
  3. Demonstrate different mouse modes
  4. '''
  5. # from panda3d.core import loadPrcFileData
  6. #
  7. # loadPrcFileData("", "notify-level-x11display debug")
  8. # loadPrcFileData("", "notify-level-windisplay debug")
  9. #
  10. # loadPrcFileData("", "load-display p3tinydisplay")
  11. from panda3d.core import WindowProperties, TextNode
  12. from direct.task.TaskManagerGlobal import taskMgr
  13. from direct.gui.OnscreenText import OnscreenText
  14. from direct.task import Task
  15. from direct.showbase.ShowBase import ShowBase
  16. import sys
  17. class App(ShowBase):
  18. def __init__(self):
  19. ShowBase.__init__(self)
  20. self.base = self
  21. self.setup()
  22. def genLabelText(self, text, i):
  23. text = OnscreenText(text = text, pos = (-1.3, .5-.05*i), fg=(0,1,0,1),
  24. align = TextNode.ALeft, scale = .05)
  25. return text
  26. def setup(self):
  27. # Disable the camera trackball controls.
  28. self.disableMouse()
  29. self.mouseMagnitude = 144
  30. self.rotateX, self.rotateY = 0, 0
  31. self.genLabelText("[0] Absolute mode, [1] Relative mode, [2] Confined mode", 0)
  32. self.base.accept('0', lambda: self.setMouseMode(WindowProperties.M_absolute))
  33. self.base.accept('1', lambda: self.setMouseMode(WindowProperties.M_relative))
  34. self.base.accept('2', lambda: self.setMouseMode(WindowProperties.M_confined))
  35. self.genLabelText("[C] Manually re-center mouse on each tick", 1)
  36. self.base.accept('C', lambda: self.toggleRecenter())
  37. self.base.accept('c', lambda: self.toggleRecenter())
  38. self.genLabelText("[S] Show mouse", 2)
  39. self.base.accept('S', lambda: self.toggleMouse())
  40. self.base.accept('s', lambda: self.toggleMouse())
  41. self.base.accept('escape', sys.exit, [0])
  42. self.mouseText = self.genLabelText("", 5)
  43. self.deltaText = self.genLabelText("", 6)
  44. self.positionText = self.genLabelText("", 8)
  45. self.lastMouseX, self.lastMouseY = None, None
  46. self.hideMouse = False
  47. self.setMouseMode(WindowProperties.M_absolute)
  48. self.manualRecenterMouse = True
  49. # make a box to move with the mouse
  50. self.model = self.loader.loadModel("box.egg")
  51. self.model.reparentTo(self.render)
  52. self.cam.setPos(0, -5, 0)
  53. self.cam.lookAt(0, 0, 0)
  54. self.mouseTask = taskMgr.add(self.mouseTask, "Mouse Task")
  55. def setMouseMode(self, mode):
  56. print "Changing mode to",mode
  57. self.mouseMode = mode
  58. wp = WindowProperties()
  59. wp.setMouseMode(mode)
  60. self.base.win.requestProperties(wp)
  61. # these changes may require a tick to apply
  62. self.base.taskMgr.doMethodLater(0, self.resolveMouse, "Resolve mouse setting")
  63. def resolveMouse(self, t):
  64. wp = self.base.win.getProperties()
  65. actualMode = wp.getMouseMode()
  66. if self.mouseMode != actualMode:
  67. print "ACTUAL MOUSE MODE:", actualMode
  68. self.mouseMode = actualMode
  69. self.rotateX, self.rotateY = -.5, -.5
  70. self.lastMouseX, self.lastMouseY = None, None
  71. self.recenterMouse()
  72. def recenterMouse(self):
  73. self.base.win.movePointer(0,
  74. int(self.base.win.getProperties().getXSize() / 2),
  75. int(self.base.win.getProperties().getYSize() / 2))
  76. def toggleRecenter(self):
  77. print "Toggling re-center behavior"
  78. self.manualRecenterMouse = not self.manualRecenterMouse
  79. def toggleMouse(self):
  80. print "Toggling mouse visibility"
  81. self.hideMouse = not self.hideMouse
  82. wp = WindowProperties()
  83. wp.setCursorHidden(self.hideMouse)
  84. self.base.win.requestProperties(wp)
  85. def mouseTask(self, task):
  86. mw = self.base.mouseWatcherNode
  87. hasMouse = mw.hasMouse()
  88. if hasMouse:
  89. # get the window manager's idea of the mouse position
  90. x, y = mw.getMouseX(), mw.getMouseY()
  91. if self.lastMouseX is not None:
  92. # get the delta
  93. if self.manualRecenterMouse:
  94. # when recentering, the position IS the delta
  95. # since the center is reported as 0, 0
  96. dx, dy = x, y
  97. else:
  98. dx, dy = x - self.lastMouseX, y - self.lastMouseY
  99. else:
  100. # no data to compare with yet
  101. dx, dy = 0, 0
  102. self.lastMouseX, self.lastMouseY = x, y
  103. else:
  104. x, y, dx, dy = 0, 0, 0, 0
  105. if self.manualRecenterMouse:
  106. # move mouse back to center
  107. self.recenterMouse()
  108. # scale position and delta to pixels for user
  109. w, h = self.win.getSize()
  110. self.mouseText.setText("Mode: {0}, Recenter: {1} | Mouse: {2}, {3} | hasMouse: {4}".format(
  111. self.mouseMode, self.manualRecenterMouse,
  112. int(x*w), int(y*h),
  113. hasMouse))
  114. self.deltaText.setText("Delta: {0}, {1}".format(
  115. int(dx*w), int(dy*h)))
  116. # rotate box by delta
  117. self.rotateX += dx * 10
  118. self.rotateY += dy * 10
  119. self.positionText.setText("Model rotation: {0}, {1}".format(
  120. int(self.rotateX*1000)/1000., int(self.rotateY*1000)/1000.))
  121. self.model.setH(self.rotateX)
  122. self.model.setP(self.rotateY)
  123. return Task.cont
  124. app = App()
  125. app.run()