ctypes

で、Python をインストールしようとしたら、バージョン 2.5 ってのがリリースされていたので
早速入れてみたのですが、2.5 用の PyOpenGL がなかったのであれこれ探したところ、
ctypes モジュールを使えば DLL とかを直接使えるみたいです。


実験コード。


#!/bin/env python
# -*- coding: utf-8 -*-

import sys
import os
import codecs
from ctypes import *
from ctypes.util import find_library
from ctypes.test import is_resource_enabled
import pygame
import psyco

psyco.full()

path = find_library("OpenGL32")
gl   = windll.LoadLibrary(path)
path = find_library("Glu32")
glu  = windll.LoadLibrary(path)
glut = windll.LoadLibrary("D:\\libs\\glut\\glut32.dll")  # XXX
#glut = find_library("glut32")  # XXX

#
sys.stdout = codecs.getwriter('utf_8')(sys.stdout)

#
gl.glTranslatef.argtypes = [c_float, c_float, c_float]
gl.glRotatef.argtypes = [c_float, c_float, c_float, c_float]
glu.gluPerspective.argtypes = [c_double, c_double, c_double, c_double]
glut.glutSolidTeapot.argtypes = [c_double]

# defilnes
# Matrix Mode
GL_MATRIX_MODE = 0x0BA0
GL_MODELVIEW   = 0x1700
GL_PROJECTION  = 0x1701
GL_TEXTURE     = 0x1702
# Depth buffer
GL_DEPTH_TEST = 0x0B71
# Lighting
GL_FLAT   = 0x1D00
GL_SMOOTH = 0x1D01
# glPush/PopAttrib bits
GL_DEPTH_BUFFER_BIT = 0x00000100
GL_COLOR_BUFFER_BIT = 0x00004000


def main():
    """ Main """
    width = 640
    height = 480

    pygame.init()
    pygame.display.set_mode((width, height), pygame.OPENGL | pygame.DOUBLEBUF)

    gl.glMatrixMode(GL_PROJECTION)
    gl.glLoadIdentity()
    glu.gluPerspective(90.0, width/height, 1.0, 100.0)
    gl.glMatrixMode(GL_MODELVIEW)
    gl.glShadeModel(GL_FLAT)
    gl.glEnable(GL_DEPTH_TEST)

    quit = False
    angle = 0
    while not quit:
        for e in pygame.event.get():
            if e.type in (pygame.QUIT, pygame.KEYDOWN):
                quit = True
        gl.glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT)
        gl.glLoadIdentity()
        gl.glTranslatef(0.0, 0.0, -2.5)
        gl.glRotatef(angle, 0.0, 1.0, 0.0)
        glut.glutSolidTeapot(1.0)
        angle += 0.1
        if angle >= 360.0:
            angle = 0.0
        pygame.display.flip()
        pygame.time.wait(33)

# main()
if __name__ == "__main__":
    main()
    print "End."

# EOF

pygame のサンプルとか検索してでてきたコードとかを切り貼りしました。
Vista には GLUT がなかったので拾ってきました。


まあそんなこんなで急須が回転しているのでちゃんと動いているのでしょう。これはヴォースゲー。
すごいと言うか、とんでもなく凄いんじゃないかしら。夢がひろがりんぐ。