Mercurial > touhou
annotate stageviewer.py @ 13:58bc264aba38
Refactor
author | Thibaut Girka <thib@sitedethib.com> |
---|---|
date | Fri, 05 Aug 2011 13:23:33 +0200 |
parents | 548662d70860 |
children | 07a7f28c8aaa |
rev | line source |
---|---|
4 | 1 #!/usr/bin/env python |
2 | |
3 import sys | |
4 import os | |
5 | |
6 import struct | |
7 from math import degrees, radians | |
8 from io import BytesIO | |
9 from itertools import chain | |
10 | |
11 import pygame | |
12 | |
13 | 13 from pytouhou.formats.pbg3 import PBG3 |
14 from pytouhou.game.background import Background | |
15 | |
4 | 16 import OpenGL |
17 OpenGL.FORWARD_COMPATIBLE_ONLY = True | |
18 from OpenGL.GL import * | |
19 from OpenGL.GLU import * | |
20 | |
21 | |
22 def load_texture(image, alpha_image=None): | |
13 | 23 #TODO: move elsewhere |
4 | 24 textureSurface = pygame.image.load(image).convert_alpha() |
25 | |
26 if alpha_image: | |
27 alphaSurface = pygame.image.load(alpha_image) | |
28 assert textureSurface.get_size() == alphaSurface.get_size() | |
29 for x in range(alphaSurface.get_width()): | |
30 for y in range(alphaSurface.get_height()): | |
31 r, g, b, a = textureSurface.get_at((x, y)) | |
32 color2 = alphaSurface.get_at((x, y)) | |
33 textureSurface.set_at((x, y), (r, g, b, color2[0])) | |
34 | |
35 textureData = pygame.image.tostring(textureSurface, 'RGBA', 1) | |
36 | |
37 width = textureSurface.get_width() | |
38 height = textureSurface.get_height() | |
39 | |
40 texture = glGenTextures(1) | |
41 glBindTexture(GL_TEXTURE_2D, texture) | |
42 | |
43 glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, width, height, 0, GL_RGBA, | |
44 GL_UNSIGNED_BYTE, textureData) | |
45 | |
46 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR) | |
47 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR) | |
48 | |
49 return texture, width, height | |
50 | |
51 | |
52 def main(path, stage_num): | |
53 # Initialize pygame | |
54 pygame.init() | |
55 window = pygame.display.set_mode((384, 448), pygame.OPENGL | pygame.DOUBLEBUF) | |
56 | |
57 # Initialize OpenGL | |
5
aa201d8cfc19
Fix camera handling, thanks, elghinn!
Thibaut Girka <thib@sitedethib.com>
parents:
4
diff
changeset
|
58 glMatrixMode(GL_PROJECTION) |
aa201d8cfc19
Fix camera handling, thanks, elghinn!
Thibaut Girka <thib@sitedethib.com>
parents:
4
diff
changeset
|
59 glLoadIdentity() |
10
059ea0ea8d38
Use the original game's near and far planes.
Thibaut Girka <thib@sitedethib.com>
parents:
9
diff
changeset
|
60 gluPerspective(30, float(window.get_width())/window.get_height(), 101010101./2010101., 101010101./10101.) |
5
aa201d8cfc19
Fix camera handling, thanks, elghinn!
Thibaut Girka <thib@sitedethib.com>
parents:
4
diff
changeset
|
61 |
7
02a5f5314a19
Add preliminary fog support
Thibaut Girka <thib@sitedethib.com>
parents:
6
diff
changeset
|
62 glHint(GL_FOG_HINT, GL_NICEST) |
4 | 63 glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST) |
64 glEnable(GL_DEPTH_TEST) | |
65 glEnable(GL_BLEND) | |
66 glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA) | |
67 glEnable(GL_TEXTURE_2D) | |
7
02a5f5314a19
Add preliminary fog support
Thibaut Girka <thib@sitedethib.com>
parents:
6
diff
changeset
|
68 glEnable(GL_FOG) |
4 | 69 glEnableClientState(GL_VERTEX_ARRAY) |
70 glEnableClientState(GL_TEXTURE_COORD_ARRAY) | |
71 | |
72 # Load data | |
73 with open(path, 'rb') as file: | |
74 archive = PBG3.read(file) | |
13 | 75 background = Background(archive, stage_num) |
4 | 76 |
13 | 77 texture = load_texture(*background.texture_components) |
4 | 78 |
13 | 79 print(background.stage.name) |
8 | 80 |
4 | 81 frame = 0 |
82 | |
83 # Main loop | |
84 clock = pygame.time.Clock() | |
85 while True: | |
13 | 86 # Check events |
4 | 87 for event in pygame.event.get(): |
88 if event.type == pygame.QUIT or (event.type == pygame.KEYDOWN and event.key in (pygame.K_ESCAPE, pygame.K_q)): | |
89 sys.exit(0) | |
90 elif event.type == pygame.KEYDOWN: | |
91 if event.key == pygame.K_RETURN and event.mod & pygame.KMOD_ALT: | |
92 pygame.display.toggle_fullscreen() | |
93 | |
13 | 94 # Update game |
95 background.update(frame) | |
96 | |
97 # Draw everything | |
4 | 98 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT) |
99 | |
13 | 100 glVertexPointer(3, GL_FLOAT, 0, background._vertices) |
101 glTexCoordPointer(2, GL_FLOAT, 0, background._uvs) | |
4 | 102 |
13 | 103 fog_b, fog_g, fog_r, _, fog_start, fog_end = background.fog_interpolator.values |
104 x, y, z = background.position_interpolator.values | |
105 unknownx, dy, dz = background.position2_interpolator.values | |
7
02a5f5314a19
Add preliminary fog support
Thibaut Girka <thib@sitedethib.com>
parents:
6
diff
changeset
|
106 |
02a5f5314a19
Add preliminary fog support
Thibaut Girka <thib@sitedethib.com>
parents:
6
diff
changeset
|
107 glFogi(GL_FOG_MODE, GL_LINEAR) |
02a5f5314a19
Add preliminary fog support
Thibaut Girka <thib@sitedethib.com>
parents:
6
diff
changeset
|
108 glFogf(GL_FOG_START, fog_start) |
13 | 109 glFogf(GL_FOG_END, fog_end) |
7
02a5f5314a19
Add preliminary fog support
Thibaut Girka <thib@sitedethib.com>
parents:
6
diff
changeset
|
110 glFogfv(GL_FOG_COLOR, (fog_r / 255., fog_g / 255., fog_b / 255., 1.)) |
02a5f5314a19
Add preliminary fog support
Thibaut Girka <thib@sitedethib.com>
parents:
6
diff
changeset
|
111 |
13 | 112 #TODO |
4 | 113 glMatrixMode(GL_MODELVIEW) |
114 glLoadIdentity() | |
11
548662d70860
Add some explanations to the magic constants
Thibaut Girka <thib@sitedethib.com>
parents:
10
diff
changeset
|
115 # Some explanations on the magic constants: |
548662d70860
Add some explanations to the magic constants
Thibaut Girka <thib@sitedethib.com>
parents:
10
diff
changeset
|
116 # 192. = 384. / 2. = width / 2. |
548662d70860
Add some explanations to the magic constants
Thibaut Girka <thib@sitedethib.com>
parents:
10
diff
changeset
|
117 # 224. = 448. / 2. = height / 2. |
548662d70860
Add some explanations to the magic constants
Thibaut Girka <thib@sitedethib.com>
parents:
10
diff
changeset
|
118 # 835.979370 = 224./math.tan(math.radians(15)) = (height/2.)/math.tan(math.radians(fov/2)) |
548662d70860
Add some explanations to the magic constants
Thibaut Girka <thib@sitedethib.com>
parents:
10
diff
changeset
|
119 # This is so that objects on the (O, x, y) plane use pixel coordinates |
7
02a5f5314a19
Add preliminary fog support
Thibaut Girka <thib@sitedethib.com>
parents:
6
diff
changeset
|
120 gluLookAt(192., 224., - 835.979370 * dz, |
02a5f5314a19
Add preliminary fog support
Thibaut Girka <thib@sitedethib.com>
parents:
6
diff
changeset
|
121 192., 224. - dy, 750 - 835.979370 * dz, 0., -1., 0.) #TODO: 750 might not be accurate |
5
aa201d8cfc19
Fix camera handling, thanks, elghinn!
Thibaut Girka <thib@sitedethib.com>
parents:
4
diff
changeset
|
122 #print(glGetFloat(GL_MODELVIEW_MATRIX)) |
aa201d8cfc19
Fix camera handling, thanks, elghinn!
Thibaut Girka <thib@sitedethib.com>
parents:
4
diff
changeset
|
123 glTranslatef(-x, -y, -z) |
4 | 124 |
13 | 125 glDrawArrays(GL_QUADS, 0, background.nb_vertices) |
4 | 126 |
11
548662d70860
Add some explanations to the magic constants
Thibaut Girka <thib@sitedethib.com>
parents:
10
diff
changeset
|
127 #TODO: show the game itself |
548662d70860
Add some explanations to the magic constants
Thibaut Girka <thib@sitedethib.com>
parents:
10
diff
changeset
|
128 # It is displayed on (0, 0, 0), (0, 448, 0), (388, 448, 0), (388, 0, 0) |
548662d70860
Add some explanations to the magic constants
Thibaut Girka <thib@sitedethib.com>
parents:
10
diff
changeset
|
129 # using a camera at (192, 224, -835.979370) looking right behind itself |
548662d70860
Add some explanations to the magic constants
Thibaut Girka <thib@sitedethib.com>
parents:
10
diff
changeset
|
130 # Depth test should be disabled when rendering the game |
548662d70860
Add some explanations to the magic constants
Thibaut Girka <thib@sitedethib.com>
parents:
10
diff
changeset
|
131 |
4 | 132 pygame.display.flip() |
133 clock.tick(120) | |
134 frame += 1 | |
135 | |
136 | |
137 | |
138 try: | |
139 file_path, stage_num = sys.argv[1:] | |
140 stage_num = int(stage_num) | |
141 except ValueError: | |
142 print('Usage: %s std_dat_path stage_num' % sys.argv[0]) | |
143 else: | |
144 main(file_path, stage_num) | |
145 |