NoUserOrg

Reto Spoerri : Game Design : Zürich

ProgrammingCodeSnippletsKeep-aspect-ratio

Filed in: Resources.ProgrammingCodeSnippletsKeep-aspect-ratio · Modified on : Fri, 31 Jul 09

keeps the aspect ratio of the panda3d window the same, even on resizes.

from direct.showbase.DirectObject import DirectObject
from pandac.PandaModules import  *

def setResolution( resolution ):
    wp = WindowProperties()
    # set resolution
    wp.setSize(resolution[0], resolution[1])
    # set fullscreen
    base.win.requestProperties(wp)

class windowHandlerClass( DirectObject ):
  def __init__( self ):

    self.active = True

    DirectObject.__init__( self )
    self.aspectRatio = [16., 9.]
    base.win.setClearColorActive( True )
    base.win.setClearColor(VBase4(1, 1, 1, 1))
    self.cameras = [base.cam, base.cam2d, base.cam2dp]

    if self.active:
      self.accept( 'window-event', self.onResize)

  def onResize( self, window=None ):
    print "onResize"
    if window is None:
      window = base.win

    wp = window.getProperties()
    winx = float(wp.getXSize())
    winy = float(wp.getYSize())

    drx = winy/float(self.aspectRatio[1])*float(self.aspectRatio[0])/winx
    dry = winx/float(self.aspectRatio[0])*float(self.aspectRatio[1])/winy

    dx = (1.-drx) / 2
    dy = (1.-dry) / 2.
    dim = dx , (1.-dx), dy, (1.-dy)

    reqx = round(winx*drx)
    reqy = round(winy*dry)

    reqx = winx
    reqy = round( winx/float(self.aspectRatio[0])*float(self.aspectRatio[1]) )
    if winx != reqx or winy != reqy:
      print winx, winy, reqx, reqy, reqx/float(reqy)
      setResolution( [reqx, reqy] )


if __name__ == '__main__':
  from direct.directbase import DirectStart
  windowHandler = windowHandlerClass()
  run()