Skip to content

Instantly share code, notes, and snippets.

@pkulev
Last active March 22, 2016 12:42
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save pkulev/e0cc00806556a10e54df to your computer and use it in GitHub Desktop.
Save pkulev/e0cc00806556a10e54df to your computer and use it in GitHub Desktop.
#!/usr/bin/env python
"""Just for fun."""
import sys
from OpenGL.GL import (
glClear,
glClearColor,
glRotatef,
glLightModelfv,
glEnable,
glLightfv,
glMaterialfv,
glTranslatef,
glPushMatrix,
glPopMatrix,
GL_FRONT_AND_BACK,
GL_DIFFUSE,
GL_COLOR_BUFFER_BIT,
GL_LIGHT_MODEL_AMBIENT,
GL_LIGHTING,
GL_LIGHT0,
GL_POSITION,
)
from OpenGL.GLU import (
gluOrtho2D,
)
from OpenGL.GLUT import (
GLUT_DOUBLE,
GLUT_RGB,
glutInitDisplayMode,
glutInitWindowSize,
glutInitWindowPosition,
glutInit,
glutCreateWindow,
glutMainLoop,
glutPostRedisplay,
glutSolidCylinder,
glutSolidCone,
glutSwapBuffers,
glutDisplayFunc,
glutSpecialFunc,
GLUT_KEY_UP,
GLUT_KEY_DOWN,
GLUT_KEY_LEFT,
GLUT_KEY_RIGHT,
)
class GameObject(object):
"""Game object registry."""
_registry = {}
@staticmethod
def get(name, default=None):
"""Return object instance or default."""
return GameObject._registry.get(name, default)
@staticmethod
def set(name, instance):
"""Add instance to registry."""
GameObject._registry[name] = instance
class Entity(object):
"""Any game entity."""
def __init__(self):
self._xrot = 0.0
self._yrot = 0.0
@property
def xrot(self):
return self._xrot
@xrot.setter
def xrot(self, val):
self._xrot = val
@property
def yrot(self):
return self._yrot
@yrot.setter
def yrot(self, val):
self._yrot = val
class XmassTree(Entity):
"""Tree object."""
def __init__(self):
super(XmassTree, self).__init__()
self.ambient = (1.0, 1.0, 1.0, 1)
self.greencolor = (0.2, 0.8, 0.0, 0.8)
self.treecolor = (0.9, 0.6, 0.3, 0.8)
def rot(self):
"""Rotation."""
return self.xrot, self.yrot
def draw(self):
"""Draw handler."""
glRotatef(self._xrot, 1.0, 0.0, 0.0)
glLightfv(GL_LIGHT0, GL_POSITION, (1.0, 1.0, 1.0))
glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, self.treecolor)
glTranslatef(0.0, 0.0, -0.7)
glutSolidCylinder(0.1, 0.2, 20, 20)
glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, self.greencolor)
glTranslatef(0.0, 0.0, 0.2)
glutSolidCone(0.5, 0.5, 20, 20)
glTranslatef(0.0, 0.0, 0.3)
glutSolidCone(0.4, 0.4, 20, 20)
glTranslatef(0.0, 0.0, 0.3)
glutSolidCone(0.3, 0.3, 20, 20)
def init():
"""Initialize scene."""
xmasstree = XmassTree()
GameObject.set("xmasstree", xmasstree)
lightpos = (1.0, 1.0, 1.0)
glClearColor(0.5, 0.5, 0.5, 1.0)
gluOrtho2D(-1.0, 1.0, -1.0, 1.0)
glRotatef(-90, 1.0, 0.0, 0.0)
glLightModelfv(GL_LIGHT_MODEL_AMBIENT, xmasstree.ambient)
glEnable(GL_LIGHTING)
glEnable(GL_LIGHT0)
glLightfv(GL_LIGHT0, GL_POSITION, lightpos)
def special_keys(key, x, y):
"""Handle keys."""
xmasstree = GameObject.get("xmasstree")
if key == GLUT_KEY_UP:
xmasstree.xrot -= 2.0
if key == GLUT_KEY_DOWN:
xmasstree.xrot += 2.0
if key == GLUT_KEY_LEFT:
xmasstree.yrot -= 2.0
if key == GLUT_KEY_RIGHT:
xmasstree.yrot += 2.0
glutPostRedisplay()
def draw():
"""Draw handler."""
xmasstree = GameObject.get("xmasstree")
glClear(GL_COLOR_BUFFER_BIT)
glPushMatrix()
xmasstree.draw()
glPopMatrix()
glutSwapBuffers()
def main():
"""Entry point to program."""
glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB)
glutInitWindowSize(300, 300)
glutInitWindowPosition(50, 50)
glutInit(sys.argv)
glutCreateWindow(b"Happy New Year!")
glutDisplayFunc(draw)
glutSpecialFunc(special_keys)
init()
glutMainLoop()
if __name__ == "__main__":
main()
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment