Skip to content

Commit a50fc7f

Browse files
Add template project to examples.
This provides an easy to modify template for simple PyGLy apps. It is not recommended to use this for serious applications, it is just for rapid prototyping.
1 parent 978bebe commit a50fc7f

File tree

2 files changed

+348
-0
lines changed

2 files changed

+348
-0
lines changed

examples/template/common.py

Lines changed: 227 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,227 @@
1+
import math
2+
import time
3+
import random
4+
5+
from pyglet.gl import *
6+
import pyglet
7+
import numpy
8+
9+
import pygly.window
10+
import pygly.gl
11+
from pygly.ratio_viewport import RatioViewport
12+
from pygly.projection_view_matrix import ProjectionViewMatrix
13+
from pygly.scene_node import SceneNode
14+
from pygly.camera_node import CameraNode
15+
from pygly.render_callback_node import RenderCallbackNode
16+
from pygly.input.keyboard import Keyboard
17+
from pygly.input.mouse import Mouse
18+
19+
import pyrr
20+
21+
# over-ride the default pyglet idle loop
22+
import pygly.monkey_patch
23+
pygly.monkey_patch.patch_idle_loop()
24+
25+
26+
class BaseApplication( object ):
27+
28+
def __init__( self ):
29+
super( BaseApplication, self ).__init__()
30+
31+
self.setup()
32+
33+
def setup( self ):
34+
self.setup_window()
35+
self.setup_input()
36+
self.setup_ui()
37+
self.setup_scene_root()
38+
self.setup_camera()
39+
self.setup_scene()
40+
self.setup_events()
41+
42+
def setup_window( self ):
43+
# setup our opengl requirements
44+
config = pyglet.gl.Config(
45+
depth_size = 16,
46+
double_buffer = True
47+
)
48+
49+
# create our window
50+
self.window = pyglet.window.Window(
51+
fullscreen = False,
52+
width = 1024,
53+
height = 768,
54+
resizable = True,
55+
config = config
56+
)
57+
58+
# listen for on_draw events
59+
self.window.push_handlers(
60+
on_draw = self.on_draw
61+
)
62+
63+
# create a viewport
64+
self.viewport = RatioViewport(
65+
self.window,
66+
[ [0.0, 0.0], [1.0, 1.0] ]
67+
)
68+
69+
def setup_input( self ):
70+
# create our keyboard device
71+
self.keyboard = Keyboard( self.window )
72+
73+
# register for keypresses
74+
self.keyboard.digital.push_handlers(
75+
on_digital_input = self.on_key_event
76+
)
77+
78+
# create our mouse device
79+
self.mouse = Mouse( self.window )
80+
81+
def setup_events( self ):
82+
# setup our update loop the app
83+
# we'll render at 60 fps
84+
frequency = 60.0
85+
self.update_delta = 1.0 / frequency
86+
87+
# use a pyglet callback for our render loop
88+
pyglet.clock.schedule_interval(
89+
self.step,
90+
self.update_delta
91+
)
92+
93+
def setup_ui( self ):
94+
# create an fps display
95+
self.fps_display = pyglet.clock.ClockDisplay()
96+
97+
def setup_scene_root( self ):
98+
# create a list of renderables
99+
self.renderables = []
100+
101+
# create a scene
102+
self.scene_node = SceneNode( 'root' )
103+
104+
def setup_camera( self ):
105+
# create a camera and a view matrix
106+
self.view_matrix = ProjectionViewMatrix(
107+
self.viewport.aspect_ratio,
108+
fov = 45.0,
109+
near_clip = 1.0,
110+
far_clip = 200.0
111+
)
112+
# create a camera
113+
self.camera = CameraNode(
114+
'camera',
115+
self.view_matrix
116+
)
117+
self.scene_node.add_child( self.camera )
118+
119+
def setup_scene( self ):
120+
# CREATE SCENE HERE
121+
pass
122+
123+
def run( self ):
124+
pyglet.app.run()
125+
126+
def step( self, dt ):
127+
# update our mouse
128+
self.update_mouse( dt )
129+
130+
# update the scene here
131+
self.update_scene( dt )
132+
133+
# manually dispatch the on_draw event
134+
# as we patched it out of the idle loop
135+
self.window.dispatch_event( 'on_draw' )
136+
137+
# display the frame buffer
138+
self.window.flip()
139+
140+
def update_mouse( self, dt ):
141+
# USE MOUSE VALUES HERE
142+
pass
143+
144+
# reset the relative position of the mouse
145+
self.mouse.clear_delta()
146+
147+
def on_key_event( self, digital, event, key ):
148+
# HANDLE KEYBOARD INPUT HERE
149+
pass
150+
151+
def update_scene( self, dt ):
152+
# UPDATE SCENE HERE
153+
pass
154+
155+
def on_draw( self ):
156+
# render the scene
157+
self.render()
158+
159+
# render the fps
160+
self.fps_display.draw()
161+
162+
def render( self ):
163+
#
164+
# setup
165+
#
166+
167+
# set our window
168+
self.window.switch_to()
169+
170+
# activate our viewport
171+
self.viewport.switch_to()
172+
173+
# scissor to our viewport
174+
self.viewport.scissor_to_viewport()
175+
176+
# setup our viewport properties
177+
glPushAttrib( GL_ALL_ATTRIB_BITS )
178+
179+
# update the view matrix aspect ratio
180+
self.camera.view_matrix.aspect_ratio = self.viewport.aspect_ratio
181+
182+
# apply our view matrix and camera translation
183+
self.camera.view_matrix.push_view_matrix()
184+
self.camera.push_model_view()
185+
186+
#
187+
# render
188+
#
189+
190+
# clear our frame buffer and depth buffer
191+
glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT )
192+
193+
self.render_3d()
194+
195+
#
196+
# tear down
197+
#
198+
199+
# pop our view matrix and camera translation
200+
self.camera.pop_model_view()
201+
self.camera.view_matrix.pop_view_matrix()
202+
203+
# pop our viewport attributes
204+
glPopAttrib()
205+
206+
#
207+
# reset state
208+
#
209+
210+
# set our viewport to the entire window
211+
pygly.gl.set_scissor(
212+
pygly.window.create_rectangle( self.window )
213+
)
214+
pygly.gl.set_viewport(
215+
pygly.window.create_rectangle( self.window )
216+
)
217+
218+
#
219+
# render 2d
220+
#
221+
222+
self.render_2d()
223+
224+
def render_2d( self ):
225+
# render the fps
226+
self.fps_display.draw()
227+

examples/template/main.py

Lines changed: 121 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,121 @@
1+
import math
2+
import time
3+
import random
4+
5+
from pyglet.gl import *
6+
import pyglet
7+
import numpy
8+
9+
import pygly.gl
10+
import pygly.sorter
11+
from pygly.scene_node import SceneNode
12+
from pygly.camera_node import CameraNode
13+
14+
from common import BaseApplication
15+
16+
17+
18+
class Application( BaseApplication ):
19+
20+
def __init__( self ):
21+
super( Application, self ).__init__()
22+
23+
def setup_camera( self ):
24+
super( Application, self ).setup_camera()
25+
26+
# move the camera so we can see the grid
27+
self.camera.transform.inertial.translate(
28+
[ 0.0, 10.0, 20.0 ]
29+
)
30+
# rotate the camera so it is pointing down
31+
self.camera.transform.object.rotate_x( -math.pi / 4.0 )
32+
33+
def setup_ui( self ):
34+
super( Application, self ).setup_ui()
35+
36+
self.help_label = pyglet.text.HTMLLabel(
37+
"""
38+
<b>PyGLy Template</b>
39+
""",
40+
multiline = True,
41+
x = 10,
42+
y = 50,
43+
width = 500,
44+
anchor_x = 'left',
45+
anchor_y = 'bottom',
46+
)
47+
self.help_label.color = (255,255,255,255)
48+
49+
def setup_scene( self ):
50+
super( Application, self ).setup_scene()
51+
52+
# set our gl clear colour
53+
glClearColor( 0.2, 0.2, 0.2, 1.0 )
54+
55+
# CREATE SCENE HERE
56+
pass
57+
58+
def update_mouse( self, dt ):
59+
# USE MOUSE VALUES HERE
60+
pass
61+
62+
# reset the relative position of the mouse
63+
super( Application, self ).update_mouse( dt )
64+
65+
def on_key_event( self, digital, event, key ):
66+
# HANDLE KEYBOARD INPUT HERE
67+
pass
68+
69+
def update_scene( self, dt ):
70+
# UPDATE SCENE HERE
71+
pass
72+
73+
def render_3d( self ):
74+
# enable z buffer
75+
glEnable( GL_DEPTH_TEST )
76+
77+
# enable smooth shading
78+
glShadeModel( GL_SMOOTH )
79+
80+
# rescale only normals for lighting
81+
glEnable( GL_RESCALE_NORMAL )
82+
83+
# enable scissoring for viewports
84+
glEnable( GL_SCISSOR_TEST )
85+
86+
# enable back face culling
87+
glEnable( GL_CULL_FACE )
88+
glCullFace( GL_BACK )
89+
90+
# sort our renderables
91+
positions = [ obj.world_transform.translation for obj in self.renderables ]
92+
93+
sort_function = pygly.sorter.sort_radius_back_to_front
94+
95+
sorted_renderables = sort_function(
96+
self.camera.world_transform.translation,
97+
-(self.camera.transform.object.z),
98+
self.renderables,
99+
positions
100+
)
101+
102+
# render each object
103+
for renderable in sorted_renderables:
104+
renderable.render()
105+
106+
def render_2d( self ):
107+
super( Application, self ).render_2d()
108+
109+
self.help_label.draw()
110+
111+
112+
def main():
113+
# create app
114+
app = Application()
115+
app.run()
116+
app.window.close()
117+
118+
119+
if __name__ == "__main__":
120+
main()
121+

0 commit comments

Comments
 (0)