Last active
March 22, 2016 12:42
-
-
Save pkulev/e0cc00806556a10e54df to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/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