draw strokes in OpenGLEngine
This commit is contained in:
parent
1a0fc522cf
commit
1fd7c51c21
1 changed files with 20 additions and 1 deletions
|
@ -1,11 +1,13 @@
|
||||||
import io
|
import io
|
||||||
from collections import deque
|
from collections import deque
|
||||||
|
from itertools import chain
|
||||||
from typing import Union
|
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 shapely.geometry import CAP_STYLE, JOIN_STYLE, LinearRing, LineString, MultiLineString, MultiPolygon, Polygon
|
||||||
|
from shapely.ops import unary_union
|
||||||
from trimesh.creation import triangulate_polygon
|
from trimesh.creation import triangulate_polygon
|
||||||
|
|
||||||
from c3nav.mapdata.render.engines.base import RenderEngine
|
from c3nav.mapdata.render.engines.base import RenderEngine
|
||||||
|
@ -73,6 +75,23 @@ class OpenGLEngine(RenderEngine):
|
||||||
if fill is not None:
|
if fill is not None:
|
||||||
self.vertices.append(self._create_geometry(geometry, self.hex_to_rgb(fill.color)))
|
self.vertices.append(self._create_geometry(geometry, self.hex_to_rgb(fill.color)))
|
||||||
|
|
||||||
|
if stroke is not None and stroke.color.startswith('#'):
|
||||||
|
if isinstance(geometry, MultiLineString):
|
||||||
|
lines = (geometry, )
|
||||||
|
elif isinstance(geometry, (LinearRing, LineString)):
|
||||||
|
lines = (geometry, )
|
||||||
|
elif isinstance(geometry, (Polygon, MultiPolygon)):
|
||||||
|
lines = tuple(chain(*((polygon.exterior, *polygon.interiors)
|
||||||
|
for polygon in assert_multipolygon(geometry))))
|
||||||
|
else:
|
||||||
|
raise ValueError('Unknown geometry for add_geometry!')
|
||||||
|
|
||||||
|
self.vertices.append(self._create_geometry(
|
||||||
|
unary_union(lines).buffer(max(stroke.width, (stroke.min_px or 0) / self.scale)/2,
|
||||||
|
cap_style=CAP_STYLE.flat, join_style=JOIN_STYLE.mitre),
|
||||||
|
self.hex_to_rgb(stroke.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).astype(np.float32).tobytes())
|
vbo = self.ctx.buffer(np.hstack(self.vertices).astype(np.float32).tobytes())
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue