keep triangles together in base 3d engine

This commit is contained in:
Laura Klünder 2017-11-09 20:04:25 +01:00
parent 37e9dcc1f6
commit b2da4df1c4
2 changed files with 8 additions and 7 deletions

View file

@ -1,9 +1,10 @@
from itertools import chain from itertools import chain
from typing import Optional
import numpy as np import numpy as np
from c3nav.mapdata.render.data import HybridGeometry from c3nav.mapdata.render.data import HybridGeometry
from c3nav.mapdata.render.engines.base import RenderEngine from c3nav.mapdata.render.engines.base import FillAttribs, RenderEngine, StrokeAttribs
class Base3DEngine(RenderEngine): class Base3DEngine(RenderEngine):
@ -22,13 +23,13 @@ class Base3DEngine(RenderEngine):
def _append_to_vertices(self, vertices, append=None): def _append_to_vertices(self, vertices, append=None):
if append is not None: if append is not None:
append = np.array(append, dtype=np.float32).flatten() append = np.array(append, dtype=np.float32).flatten()
vertices = np.hstack(( vertices = np.dstack((
vertices, vertices,
append.reshape(1, append.size).repeat(vertices.shape[0], 0) append.reshape(1, append.size).repeat(vertices.shape[0]*3, 0).reshape((-1, 3, append.size))
)) ))
return vertices return vertices
def _place_geometry(self, geometry: HybridGeometry, append=None): def _place_geometry(self, geometry: HybridGeometry, append=None):
faces = np.vstack(tuple(chain(geometry.faces, *geometry.add_faces.values()))) faces = np.vstack(tuple(chain(geometry.faces, *geometry.add_faces.values())))
vertices = faces.reshape(-1, 3) * self.np_scale + self.np_offset vertices = faces * self.np_scale + self.np_offset
return self._append_to_vertices(vertices, append).flatten() return self._append_to_vertices(vertices, append).flatten()

View file

@ -166,10 +166,10 @@ class OpenGLEngine(Base3DEngine):
lines = unary_union(lines).buffer(width, cap_style=CAP_STYLE.flat, join_style=JOIN_STYLE.mitre) lines = unary_union(lines).buffer(width, cap_style=CAP_STYLE.flat, join_style=JOIN_STYLE.mitre)
vertices, faces = triangulate_polygon(lines) vertices, faces = triangulate_polygon(lines)
triangles = np.hstack((vertices[faces.flatten()], np.full((faces.size, 1), fill_value=altitude))) triangles = np.dstack((vertices[faces], np.full((faces.size, 1), fill_value=altitude).reshape((-1, 3, 1))))
vertices = np.vstack(triangles).astype(np.float32) * self.np_scale + self.np_offset triangles = triangles.astype(np.float32) * self.np_scale + self.np_offset
return self._append_to_vertices(vertices, append).flatten() return self._append_to_vertices(triangles, append).flatten()
worker = OpenGLWorker() worker = OpenGLWorker()