something something triangles

This commit is contained in:
Laura Klünder 2017-11-06 14:51:59 +01:00
parent a05c7a5a3c
commit 1a0fc522cf
4 changed files with 38 additions and 4 deletions

View file

@ -53,6 +53,10 @@ class RenderEngine(ABC):
# render the image to png. # render the image to png.
pass pass
@staticmethod
def hex_to_rgb(hexcolor):
return tuple(int(hexcolor[i:i + 2], 16)/255 for i in range(1, 6, 2))
def clip_altitudes(self, new_geometry, new_altitude=None): def clip_altitudes(self, new_geometry, new_altitude=None):
# register new geometry with an altitude # register new geometry with an altitude
# a geometry with no altitude will reset the altitude information of its area as if nothing was ever there # a geometry with no altitude will reset the altitude information of its area as if nothing was ever there

View file

@ -1,10 +1,15 @@
import io import io
from collections import deque
from typing import Union
import ModernGL import ModernGL
import numpy as np import numpy as np
from PIL import Image from PIL import Image
from shapely.geometry import MultiPolygon, Polygon
from trimesh.creation import triangulate_polygon
from c3nav.mapdata.render.engines.base import RenderEngine from c3nav.mapdata.render.engines.base import RenderEngine
from c3nav.mapdata.utils.geometry import assert_multipolygon
class OpenGLEngine(RenderEngine): class OpenGLEngine(RenderEngine):
@ -15,8 +20,7 @@ class OpenGLEngine(RenderEngine):
self.ctx = ModernGL.create_standalone_context() self.ctx = ModernGL.create_standalone_context()
self.color_rbo = self.ctx.renderbuffer((self.width, self.height)) self.color_rbo = self.ctx.renderbuffer((self.width, self.height))
self.depth_rbo = self.ctx.depth_renderbuffer((self.width, self.height)) self.fbo = self.ctx.framebuffer([self.color_rbo])
self.fbo = self.ctx.framebuffer([self.color_rbo], self.depth_rbo)
self.fbo.use() self.fbo.use()
self.ctx.clear(*(i/255 for i in self.background_rgb)) self.ctx.clear(*(i/255 for i in self.background_rgb))
@ -42,12 +46,36 @@ class OpenGLEngine(RenderEngine):
'''), '''),
]) ])
scale_x = self.scale / self.width * 2
scale_y = self.scale / self.height * 2
self.np_scale = np.array((scale_x, -scale_y))
self.np_offset = np.array((-self.minx * scale_x - 1, self.maxy * scale_y - 1))
def _create_geometry(self, geometry: Union[Polygon, MultiPolygon], append=None):
triangles = deque()
for i, polygon in enumerate(assert_multipolygon(geometry)):
vertices, faces = triangulate_polygon(polygon)
triangles.append(vertices[faces.flatten()])
vertices = np.vstack(triangles).astype(np.float32)
vertices = vertices * self.np_scale + self.np_offset
if append is not None:
append = np.array(append, dtype=np.float32).flatten()
vertices = np.hstack((
vertices,
append.reshape(1, append.size).repeat(vertices.shape[0], 0)
))
return vertices.flatten()
def _add_geometry(self, geometry, fill=None, stroke=None, altitude=None, height=None, shape_cache_key=None): def _add_geometry(self, geometry, fill=None, stroke=None, altitude=None, height=None, shape_cache_key=None):
pass if fill is not None:
self.vertices.append(self._create_geometry(geometry, self.hex_to_rgb(fill.color)))
def get_png(self) -> bytes: def get_png(self) -> bytes:
if self.vertices: if self.vertices:
vbo = self.ctx.buffer(np.hstack(self.vertices).tobytes()) vbo = self.ctx.buffer(np.hstack(self.vertices).astype(np.float32).tobytes())
# We control the 'in_vert' and `in_color' variables # We control the 'in_vert' and `in_color' variables
vao = self.ctx.simple_vertex_array(self.prog, vbo, ['in_vert', 'in_color']) vao = self.ctx.simple_vertex_array(self.prog, vbo, ['in_vert', 'in_color'])

View file

@ -0,0 +1 @@
ModernGL>=4.2,<4.3

View file

@ -5,6 +5,7 @@ csscompressor
djangorestframework>=3.6,<3.7 djangorestframework>=3.6,<3.7
django-filter>=1.0,<1.1 django-filter>=1.0,<1.1
shapely>=1.5,<1.6 shapely>=1.5,<1.6
trimesh>=2.20,<2.21
rtree>=0.8,<0.9 rtree>=0.8,<0.9
celery>=4.0,<4.1 celery>=4.0,<4.1
requests>=2.17,<2.18 requests>=2.17,<2.18