Skip to content

Commit 9c105d7

Browse files
committed
Add terrain example to README
1 parent 1548ccb commit 9c105d7

File tree

3 files changed

+36
-5
lines changed

3 files changed

+36
-5
lines changed

examples/README.md

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -119,3 +119,16 @@ python manage.py runeffect examples.raymaching
119119
```
120120

121121
![screenshot](https://raw.githubusercontent.com/Contraz/demosys-py/master/examples/images/raymarching.png)
122+
123+
Terrain
124+
-------
125+
126+
Simple tessellation example using a height map. The original vertex buffer is a 8 x 8 reolution
127+
grid with 128 triangles. Each triangle is tessellated using inner and outer level of 64
128+
giving us around 780.000 triangles. We toggle the draw mode between textured and wireframe over time.
129+
130+
```bash
131+
python manage.py runeffect examples.terrain
132+
```
133+
134+
![screenshot](https://raw.githubusercontent.com/Contraz/demosys-py/master/examples/images/terrain.png)

examples/images/terrain.png

428 KB
Loading

examples/terrain/effects.py

Lines changed: 23 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,24 @@
1+
import math
12
import moderngl
23

34
from demosys.effects import effect
45
from demosys import geometry
56
from pyrr import matrix44
67

78

8-
class Empty(effect.Effect):
9+
def calculate_triangles(n: int):
10+
"""
11+
Calculate the number of triangles for the barycentric subdivision of a
12+
single triangle (where the inner and outer subdivision is equal
13+
"""
14+
if n < 0:
15+
return 1
16+
if n == 0:
17+
return 0
18+
return ((2 * n -2) * 3) + calculate_triangles(n - 2)
19+
20+
21+
class TerrainTessellation(effect.Effect):
922

1023
def __init__(self):
1124
self.terrain = geometry.plane_xz(size=(400, 400), resolution=(8, 8))
@@ -20,6 +33,12 @@ def __init__(self):
2033
self.heights = self.program['heightmap']
2134

2235
self.sys_camera.velocity = 50.0
36+
self.tess_level = 64
37+
38+
original_triangles = 8 * 8 * 2
39+
tess_triangles = calculate_triangles(self.tess_level)
40+
print("Number of triangles:", original_triangles)
41+
print("Total triangles with tessellation:", original_triangles * tess_triangles)
2342

2443
def draw(self, time, frametime, target):
2544
self.ctx.enable_only(moderngl.DEPTH_TEST)
@@ -29,15 +48,14 @@ def draw(self, time, frametime, target):
2948
m_mv = matrix44.multiply(m_mv, self.sys_camera.view_matrix)
3049

3150
self.ctx.patch_vertices = 3
32-
# self.ctx.wireframe = True
51+
self.ctx.wireframe = True if math.fmod(time, 10) < 5.0 else False
3352

3453
self.heightmap.use(location=0)
3554
self.heights.value = 0
3655
self.proj_matrix.write(m_proj.astype('f4').tobytes())
3756
self.mv_matrix.write(m_mv.astype('f4').tobytes())
3857

39-
tess_level = 64.0
40-
self.program['TessLevelInner'].value = tess_level
41-
self.program['TessLevelOuter'].value = tess_level
58+
self.program['TessLevelInner'].value = self.tess_level
59+
self.program['TessLevelOuter'].value = self.tess_level
4260

4361
self.terrain.render(self.program, mode=moderngl.PATCHES)

0 commit comments

Comments
 (0)