Mercurial > touhou
annotate stageviewer.py @ 57:694f25881d0f
Fix move_to interpolation, add support for a few ANM and ECL instructions
author | Thibaut Girka <thib@sitedethib.com> |
---|---|
date | Tue, 23 Aug 2011 19:27:24 +0200 |
parents | ab826bc29aa2 |
children | 3da4de9decd0 |
rev | line source |
---|---|
4 | 1 #!/usr/bin/env python |
52
ab826bc29aa2
Add some documentation, GPLv3 headers, README and COPYING file.
Thibaut Girka <thib@sitedethib.com>
parents:
45
diff
changeset
|
2 # -*- encoding: utf-8 -*- |
ab826bc29aa2
Add some documentation, GPLv3 headers, README and COPYING file.
Thibaut Girka <thib@sitedethib.com>
parents:
45
diff
changeset
|
3 ## |
ab826bc29aa2
Add some documentation, GPLv3 headers, README and COPYING file.
Thibaut Girka <thib@sitedethib.com>
parents:
45
diff
changeset
|
4 ## Copyright (C) 2011 Thibaut Girka <thib@sitedethib.com> |
ab826bc29aa2
Add some documentation, GPLv3 headers, README and COPYING file.
Thibaut Girka <thib@sitedethib.com>
parents:
45
diff
changeset
|
5 ## |
ab826bc29aa2
Add some documentation, GPLv3 headers, README and COPYING file.
Thibaut Girka <thib@sitedethib.com>
parents:
45
diff
changeset
|
6 ## This program is free software; you can redistribute it and/or modify |
ab826bc29aa2
Add some documentation, GPLv3 headers, README and COPYING file.
Thibaut Girka <thib@sitedethib.com>
parents:
45
diff
changeset
|
7 ## it under the terms of the GNU General Public License as published |
ab826bc29aa2
Add some documentation, GPLv3 headers, README and COPYING file.
Thibaut Girka <thib@sitedethib.com>
parents:
45
diff
changeset
|
8 ## by the Free Software Foundation; version 3 only. |
ab826bc29aa2
Add some documentation, GPLv3 headers, README and COPYING file.
Thibaut Girka <thib@sitedethib.com>
parents:
45
diff
changeset
|
9 ## |
ab826bc29aa2
Add some documentation, GPLv3 headers, README and COPYING file.
Thibaut Girka <thib@sitedethib.com>
parents:
45
diff
changeset
|
10 ## This program is distributed in the hope that it will be useful, |
ab826bc29aa2
Add some documentation, GPLv3 headers, README and COPYING file.
Thibaut Girka <thib@sitedethib.com>
parents:
45
diff
changeset
|
11 ## but WITHOUT ANY WARRANTY; without even the implied warranty of |
ab826bc29aa2
Add some documentation, GPLv3 headers, README and COPYING file.
Thibaut Girka <thib@sitedethib.com>
parents:
45
diff
changeset
|
12 ## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
ab826bc29aa2
Add some documentation, GPLv3 headers, README and COPYING file.
Thibaut Girka <thib@sitedethib.com>
parents:
45
diff
changeset
|
13 ## GNU General Public License for more details. |
ab826bc29aa2
Add some documentation, GPLv3 headers, README and COPYING file.
Thibaut Girka <thib@sitedethib.com>
parents:
45
diff
changeset
|
14 ## |
4 | 15 |
16 import sys | |
17 import os | |
18 | |
19 import struct | |
20 from math import degrees, radians | |
21 from io import BytesIO | |
22 from itertools import chain | |
23 | |
24 import pygame | |
25 | |
13 | 26 from pytouhou.formats.pbg3 import PBG3 |
15 | 27 from pytouhou.formats.std import Stage |
28 from pytouhou.formats.anm0 import Animations | |
21
bf225780973f
Small refactoring, and Rumia \o/
Thibaut Girka <thib@sitedethib.com>
parents:
16
diff
changeset
|
29 from pytouhou.game.sprite import AnmWrapper |
13 | 30 from pytouhou.game.background import Background |
16
66ce9bb440ac
Refactor in order to support multiple textures
Thibaut Girka <thib@sitedethib.com>
parents:
15
diff
changeset
|
31 from pytouhou.opengl.texture import TextureManager |
13 | 32 |
4 | 33 import OpenGL |
34 OpenGL.FORWARD_COMPATIBLE_ONLY = True | |
35 from OpenGL.GL import * | |
36 from OpenGL.GLU import * | |
37 | |
38 | |
39 def main(path, stage_num): | |
40 # Initialize pygame | |
41 pygame.init() | |
42 window = pygame.display.set_mode((384, 448), pygame.OPENGL | pygame.DOUBLEBUF) | |
43 | |
44 # Initialize OpenGL | |
5
aa201d8cfc19
Fix camera handling, thanks, elghinn!
Thibaut Girka <thib@sitedethib.com>
parents:
4
diff
changeset
|
45 glMatrixMode(GL_PROJECTION) |
aa201d8cfc19
Fix camera handling, thanks, elghinn!
Thibaut Girka <thib@sitedethib.com>
parents:
4
diff
changeset
|
46 glLoadIdentity() |
10
059ea0ea8d38
Use the original game's near and far planes.
Thibaut Girka <thib@sitedethib.com>
parents:
9
diff
changeset
|
47 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
|
48 |
4 | 49 glEnable(GL_DEPTH_TEST) |
50 glEnable(GL_BLEND) | |
51 glEnable(GL_TEXTURE_2D) | |
7
02a5f5314a19
Add preliminary fog support
Thibaut Girka <thib@sitedethib.com>
parents:
6
diff
changeset
|
52 glEnable(GL_FOG) |
14 | 53 glHint(GL_FOG_HINT, GL_NICEST) |
54 glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST) | |
55 glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA) | |
37
a10e3f44a883
Add alpha (anm0 instruction 3) support
Thibaut Girka <thib@sitedethib.com>
parents:
21
diff
changeset
|
56 glEnableClientState(GL_COLOR_ARRAY) |
4 | 57 glEnableClientState(GL_VERTEX_ARRAY) |
58 glEnableClientState(GL_TEXTURE_COORD_ARRAY) | |
59 | |
60 # Load data | |
61 with open(path, 'rb') as file: | |
62 archive = PBG3.read(file) | |
16
66ce9bb440ac
Refactor in order to support multiple textures
Thibaut Girka <thib@sitedethib.com>
parents:
15
diff
changeset
|
63 texture_manager = TextureManager(archive) |
66ce9bb440ac
Refactor in order to support multiple textures
Thibaut Girka <thib@sitedethib.com>
parents:
15
diff
changeset
|
64 |
15 | 65 stage = Stage.read(BytesIO(archive.extract('stage%d.std' % stage_num)), stage_num) |
66 background_anim = Animations.read(BytesIO(archive.extract('stg%dbg.anm' % stage_num))) | |
21
bf225780973f
Small refactoring, and Rumia \o/
Thibaut Girka <thib@sitedethib.com>
parents:
16
diff
changeset
|
67 background = Background(stage, AnmWrapper((background_anim,))) |
4 | 68 |
16
66ce9bb440ac
Refactor in order to support multiple textures
Thibaut Girka <thib@sitedethib.com>
parents:
15
diff
changeset
|
69 print(background.stage.name) |
8 | 70 |
16
66ce9bb440ac
Refactor in order to support multiple textures
Thibaut Girka <thib@sitedethib.com>
parents:
15
diff
changeset
|
71 frame = 0 |
4 | 72 |
16
66ce9bb440ac
Refactor in order to support multiple textures
Thibaut Girka <thib@sitedethib.com>
parents:
15
diff
changeset
|
73 # Main loop |
66ce9bb440ac
Refactor in order to support multiple textures
Thibaut Girka <thib@sitedethib.com>
parents:
15
diff
changeset
|
74 clock = pygame.time.Clock() |
66ce9bb440ac
Refactor in order to support multiple textures
Thibaut Girka <thib@sitedethib.com>
parents:
15
diff
changeset
|
75 while True: |
66ce9bb440ac
Refactor in order to support multiple textures
Thibaut Girka <thib@sitedethib.com>
parents:
15
diff
changeset
|
76 # Check events |
66ce9bb440ac
Refactor in order to support multiple textures
Thibaut Girka <thib@sitedethib.com>
parents:
15
diff
changeset
|
77 for event in pygame.event.get(): |
66ce9bb440ac
Refactor in order to support multiple textures
Thibaut Girka <thib@sitedethib.com>
parents:
15
diff
changeset
|
78 if event.type == pygame.QUIT or (event.type == pygame.KEYDOWN and event.key in (pygame.K_ESCAPE, pygame.K_q)): |
66ce9bb440ac
Refactor in order to support multiple textures
Thibaut Girka <thib@sitedethib.com>
parents:
15
diff
changeset
|
79 sys.exit(0) |
66ce9bb440ac
Refactor in order to support multiple textures
Thibaut Girka <thib@sitedethib.com>
parents:
15
diff
changeset
|
80 elif event.type == pygame.KEYDOWN: |
66ce9bb440ac
Refactor in order to support multiple textures
Thibaut Girka <thib@sitedethib.com>
parents:
15
diff
changeset
|
81 if event.key == pygame.K_RETURN and event.mod & pygame.KMOD_ALT: |
66ce9bb440ac
Refactor in order to support multiple textures
Thibaut Girka <thib@sitedethib.com>
parents:
15
diff
changeset
|
82 pygame.display.toggle_fullscreen() |
4 | 83 |
16
66ce9bb440ac
Refactor in order to support multiple textures
Thibaut Girka <thib@sitedethib.com>
parents:
15
diff
changeset
|
84 # Update game |
66ce9bb440ac
Refactor in order to support multiple textures
Thibaut Girka <thib@sitedethib.com>
parents:
15
diff
changeset
|
85 background.update(frame) |
13 | 86 |
16
66ce9bb440ac
Refactor in order to support multiple textures
Thibaut Girka <thib@sitedethib.com>
parents:
15
diff
changeset
|
87 # Draw everything |
66ce9bb440ac
Refactor in order to support multiple textures
Thibaut Girka <thib@sitedethib.com>
parents:
15
diff
changeset
|
88 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT) |
4 | 89 |
16
66ce9bb440ac
Refactor in order to support multiple textures
Thibaut Girka <thib@sitedethib.com>
parents:
15
diff
changeset
|
90 fog_b, fog_g, fog_r, _, fog_start, fog_end = background.fog_interpolator.values |
66ce9bb440ac
Refactor in order to support multiple textures
Thibaut Girka <thib@sitedethib.com>
parents:
15
diff
changeset
|
91 x, y, z = background.position_interpolator.values |
45
e01e88b06a13
Fix camera handling, should be much closer to the original, now
Thibaut Girka <thib@sitedethib.com>
parents:
37
diff
changeset
|
92 dx, dy, dz = background.position2_interpolator.values |
4 | 93 |
16
66ce9bb440ac
Refactor in order to support multiple textures
Thibaut Girka <thib@sitedethib.com>
parents:
15
diff
changeset
|
94 glFogi(GL_FOG_MODE, GL_LINEAR) |
66ce9bb440ac
Refactor in order to support multiple textures
Thibaut Girka <thib@sitedethib.com>
parents:
15
diff
changeset
|
95 glFogf(GL_FOG_START, fog_start) |
66ce9bb440ac
Refactor in order to support multiple textures
Thibaut Girka <thib@sitedethib.com>
parents:
15
diff
changeset
|
96 glFogf(GL_FOG_END, fog_end) |
66ce9bb440ac
Refactor in order to support multiple textures
Thibaut Girka <thib@sitedethib.com>
parents:
15
diff
changeset
|
97 glFogfv(GL_FOG_COLOR, (fog_r / 255., fog_g / 255., fog_b / 255., 1.)) |
7
02a5f5314a19
Add preliminary fog support
Thibaut Girka <thib@sitedethib.com>
parents:
6
diff
changeset
|
98 |
16
66ce9bb440ac
Refactor in order to support multiple textures
Thibaut Girka <thib@sitedethib.com>
parents:
15
diff
changeset
|
99 #TODO |
66ce9bb440ac
Refactor in order to support multiple textures
Thibaut Girka <thib@sitedethib.com>
parents:
15
diff
changeset
|
100 glMatrixMode(GL_MODELVIEW) |
66ce9bb440ac
Refactor in order to support multiple textures
Thibaut Girka <thib@sitedethib.com>
parents:
15
diff
changeset
|
101 glLoadIdentity() |
66ce9bb440ac
Refactor in order to support multiple textures
Thibaut Girka <thib@sitedethib.com>
parents:
15
diff
changeset
|
102 # Some explanations on the magic constants: |
66ce9bb440ac
Refactor in order to support multiple textures
Thibaut Girka <thib@sitedethib.com>
parents:
15
diff
changeset
|
103 # 192. = 384. / 2. = width / 2. |
66ce9bb440ac
Refactor in order to support multiple textures
Thibaut Girka <thib@sitedethib.com>
parents:
15
diff
changeset
|
104 # 224. = 448. / 2. = height / 2. |
66ce9bb440ac
Refactor in order to support multiple textures
Thibaut Girka <thib@sitedethib.com>
parents:
15
diff
changeset
|
105 # 835.979370 = 224./math.tan(math.radians(15)) = (height/2.)/math.tan(math.radians(fov/2)) |
66ce9bb440ac
Refactor in order to support multiple textures
Thibaut Girka <thib@sitedethib.com>
parents:
15
diff
changeset
|
106 # This is so that objects on the (O, x, y) plane use pixel coordinates |
66ce9bb440ac
Refactor in order to support multiple textures
Thibaut Girka <thib@sitedethib.com>
parents:
15
diff
changeset
|
107 gluLookAt(192., 224., - 835.979370 * dz, |
45
e01e88b06a13
Fix camera handling, should be much closer to the original, now
Thibaut Girka <thib@sitedethib.com>
parents:
37
diff
changeset
|
108 192. + dx, 224. - dy, 0., 0., -1., 0.) |
16
66ce9bb440ac
Refactor in order to support multiple textures
Thibaut Girka <thib@sitedethib.com>
parents:
15
diff
changeset
|
109 #print(glGetFloat(GL_MODELVIEW_MATRIX)) |
66ce9bb440ac
Refactor in order to support multiple textures
Thibaut Girka <thib@sitedethib.com>
parents:
15
diff
changeset
|
110 glTranslatef(-x, -y, -z) |
4 | 111 |
37
a10e3f44a883
Add alpha (anm0 instruction 3) support
Thibaut Girka <thib@sitedethib.com>
parents:
21
diff
changeset
|
112 for texture_key, (nb_vertices, vertices, uvs, colors) in background.objects_by_texture.items(): |
16
66ce9bb440ac
Refactor in order to support multiple textures
Thibaut Girka <thib@sitedethib.com>
parents:
15
diff
changeset
|
113 glBindTexture(GL_TEXTURE_2D, texture_manager[texture_key]) |
66ce9bb440ac
Refactor in order to support multiple textures
Thibaut Girka <thib@sitedethib.com>
parents:
15
diff
changeset
|
114 glVertexPointer(3, GL_FLOAT, 0, vertices) |
66ce9bb440ac
Refactor in order to support multiple textures
Thibaut Girka <thib@sitedethib.com>
parents:
15
diff
changeset
|
115 glTexCoordPointer(2, GL_FLOAT, 0, uvs) |
37
a10e3f44a883
Add alpha (anm0 instruction 3) support
Thibaut Girka <thib@sitedethib.com>
parents:
21
diff
changeset
|
116 glColorPointer(4, GL_UNSIGNED_BYTE, 0, colors) |
16
66ce9bb440ac
Refactor in order to support multiple textures
Thibaut Girka <thib@sitedethib.com>
parents:
15
diff
changeset
|
117 glDrawArrays(GL_QUADS, 0, nb_vertices) |
4 | 118 |
16
66ce9bb440ac
Refactor in order to support multiple textures
Thibaut Girka <thib@sitedethib.com>
parents:
15
diff
changeset
|
119 #TODO: show the game itself |
66ce9bb440ac
Refactor in order to support multiple textures
Thibaut Girka <thib@sitedethib.com>
parents:
15
diff
changeset
|
120 # It is displayed on (0, 0, 0), (0, 448, 0), (388, 448, 0), (388, 0, 0) |
66ce9bb440ac
Refactor in order to support multiple textures
Thibaut Girka <thib@sitedethib.com>
parents:
15
diff
changeset
|
121 # using a camera at (192, 224, -835.979370) looking right behind itself |
66ce9bb440ac
Refactor in order to support multiple textures
Thibaut Girka <thib@sitedethib.com>
parents:
15
diff
changeset
|
122 # Depth test should be disabled when rendering the game |
11
548662d70860
Add some explanations to the magic constants
Thibaut Girka <thib@sitedethib.com>
parents:
10
diff
changeset
|
123 |
16
66ce9bb440ac
Refactor in order to support multiple textures
Thibaut Girka <thib@sitedethib.com>
parents:
15
diff
changeset
|
124 pygame.display.flip() |
66ce9bb440ac
Refactor in order to support multiple textures
Thibaut Girka <thib@sitedethib.com>
parents:
15
diff
changeset
|
125 clock.tick(120) |
66ce9bb440ac
Refactor in order to support multiple textures
Thibaut Girka <thib@sitedethib.com>
parents:
15
diff
changeset
|
126 frame += 1 |
4 | 127 |
128 | |
129 | |
130 try: | |
131 file_path, stage_num = sys.argv[1:] | |
132 stage_num = int(stage_num) | |
133 except ValueError: | |
134 print('Usage: %s std_dat_path stage_num' % sys.argv[0]) | |
135 else: | |
136 main(file_path, stage_num) | |
137 |