resizing window - how to keep fonts in original aspect ratio?

132 views
Skip to first unread message

Andreas

unread,
Jul 4, 2012, 9:54:14 AM7/4/12
to pyglet...@googlegroups.com
Hi,

I'm trying to figure out how I can keep the aspect ratio of my rendered objects constant, without distorting labels / text in my scene. In my 'on_resize()' function I call 'label.begin_update()' and 'label.end_update()', assuming that these calls will prevent the label from getting scaled. However this does not work - I'm probably doing something wrong here.
Does anybody have a suggestion on how to preserve the text / label? I'm using pyglet 1.1.4.

thanks!
andreas


import pyglet
from pyglet.gl import *

class myWindow(pyglet.window.Window):

def __init__(self, *args, **kwargs):
pyglet.window.Window.__init__(self, *args, **kwargs)


def setup(self):

self.labels = []
self.labels.append(pyglet.text.Label(
  """dummy text""",
  font_size=12,
  x=130, y=130, anchor_x = 'left', anchor_y = 'center'))

glClearColor(0, 0, 0, 1.0)
glPointSize(5)


def draw_square(self):
  glLineWidth(1)
  glBegin(GL_LINE_LOOP)
  glVertex2f(100, 100)
  glVertex2f(400, 100)
  glVertex2f(400, 400)
  glVertex2f(100, 400)
  glEnd()


def on_draw(self):

glEnable(GL_NORMALIZE)
glPushMatrix()
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT)

# draw the square and the text label
self.draw_square()
for label in self.labels:
label.draw()

glPopMatrix()


def on_resize(self, w, h):
# set viewport to new view dimensions but don't scale text labels
for label in self.labels:
label.begin_update()

glViewport(0, 0, w, h)

glMatrixMode(GL_PROJECTION)
glLoadIdentity()
glOrtho(0, W, 0, H, -1.0, 1.0)
glMatrixMode(GL_MODELVIEW)

for label in self.labels:
label.end_update()


if __name__ == "__main__":

H = 600
W = 500

my_win = myWindow(width=W, height=H, resizable=True)
my_win.setup()

pyglet.app.run()

Petr Viktorin

unread,
Jul 7, 2012, 11:47:26 AM7/7/12
to pyglet...@googlegroups.com
Hello,

By calling glOrtho(0, 600, 0, 500, -1, 1), you're saying that the
window's coordinates are not in pixels, but they run from (0, 0) in
the lower-left corner to (600, 500) in the upper left. If the window
is not 6:5, a square in these coordinates won't be a square on screen.

There are two possibilities here: either you wanted to say glOrtho(0,
w, 0, h, -1, 1) ­­-- note the lowercase -- and use pixel coordinates;
or you want to use the coordinates you have, in which case you'll need
to temporarily undo the scaling before drawing each label.
> --
> You received this message because you are subscribed to the Google Groups
> "pyglet-users" group.
> To view this discussion on the web visit
> https://groups.google.com/d/msg/pyglet-users/-/L18wTS8I3lkJ.
> To post to this group, send email to pyglet...@googlegroups.com.
> To unsubscribe from this group, send email to
> pyglet-users...@googlegroups.com.
> For more options, visit this group at
> http://groups.google.com/group/pyglet-users?hl=en.
Reply all
Reply to author
Forward
0 new messages