def geom_node(): array = GeomVertexArrayFormat() array.add_column("vertex", 3, Geom.NT_float32, Geom.C_point) array.add_column("normal", 3, Geom.NT_float32, Geom.C_normal) array.add_column("color", 3, Geom.NT_float32, Geom.C_color) array.add_column("texcoord", 3, Geom.NT_float32, Geom.C_texcoord) format = GeomVertexFormat() format.add_array(array) format = GeomVertexFormat.register_format(format) vdata = GeomVertexData("test", format, Geom.UH_static) vdata.set_num_rows(4) vertex = GeomVertexWriter(vdata, 'vertex') normal = GeomVertexWriter(vdata, 'normal') color = GeomVertexWriter(vdata, 'color') texcoord = GeomVertexWriter(vdata, 'texcoord') vertex.add_data3f(1, 0, 0) normal.add_data3f(0, 0, 1) color.add_data4f(0, 0, 1, 1) texcoord.add_data2f(1, 0) vertex.add_data3f(1, 1, 0) normal.add_data3f(0, 1, 1) color.add_data4f(1, 0, 1, 1) texcoord.add_data2f(1, 1) geom = Geom(vdata) node = GeomNode('gnode') node.add_geom(geom) return node
class VertexDataWriter(object): def __init__(self, vdata): self.count = 0 self.vertex = GeomVertexWriter(vdata, 'vertex') self.normal = GeomVertexWriter(vdata, 'normal') self.color = GeomVertexWriter(vdata, 'color') self.texcoord = GeomVertexWriter(vdata, 'texcoord') def add_vertex(self, point, normal, color, texcoord): self.vertex.add_data3f(point) self.normal.add_data3f(normal) self.color.add_data4f(*color) self.texcoord.add_data2f(*texcoord) self.count += 1
class VertexDataWriter (object): def __init__(self, vdata): self.count = 0 self.vertex = GeomVertexWriter(vdata, 'vertex') self.normal = GeomVertexWriter(vdata, 'normal') self.color = GeomVertexWriter(vdata, 'color') self.texcoord = GeomVertexWriter(vdata, 'texcoord') def add_vertex(self, point, normal, color, texcoord): self.vertex.add_data3f(point) self.normal.add_data3f(normal) self.color.add_data4f(*color) self.texcoord.add_data2f(*texcoord) self.count += 1
def _generate_mesh(node: Node) -> Geom: """Generate mesh for a Node.""" size = len(node.geometry.polygon) vertex_data = GeomVertexData(str(node.id), VERTEX_FORMAT, Geom.UH_static) vertex_data.set_num_rows(size) vertex_writer = GeomVertexWriter(vertex_data, 'vertex') normal_writer = GeomVertexWriter(vertex_data, 'normal') texcoord_writer = GeomVertexWriter(vertex_data, 'texcoord') indexes = [range(i - 1, i + 2) for i in range(0, size, 2)] triangles = [[node.geometry.polygon[j] for j in t] for t in indexes] for point in node.geometry.polygon: vertex_writer.add_data3f(point.x, point.y, LEVEL_HEIGHT * node.level) normal_writer.add_data3f(0.0, 0.0, 1.0) texcoord_writer.add_data2f(point.x / LANE_WIDTH, point.y / LANE_WIDTH) indexes = [ i for i, t in zip(indexes, triangles) if not t[0].close_to(t[1]) and not t[1].close_to(t[2]) ] geom = Geom(vertex_data) primitive = GeomTriangles(Geom.UH_static) for index in chain.from_iterable(indexes): primitive.add_vertex(index % size) primitive.close_primitive() geom.add_primitive(primitive) if size > 4: primitive = GeomTristrips(Geom.UH_static) for index in (i if i % 2 else -i - 1 for i in range(size // 2)): primitive.add_vertex(index % size) primitive.close_primitive() geom.add_primitive(primitive) return geom
def _generate_mesh(radius: float, count: int) -> Geom: """Generate mesh for the ground plane.""" vertex_data = GeomVertexData('ground', VERTEX_FORMAT, Geom.UH_static) vertex_data.set_num_rows(count**2) vertex_writer = GeomVertexWriter(vertex_data, 'vertex') normal_writer = GeomVertexWriter(vertex_data, 'normal') texcoord_writer = GeomVertexWriter(vertex_data, 'texcoord') step = 2 * radius / count for i, j in product(range(count + 1), repeat=2): vertex_writer.add_data3f(i * step - radius, j * step - radius, 0.0) normal_writer.add_data3f(0.0, 0.0, 1.0) texcoord_writer.add_data2f(i * 512, j * 512) geom = Geom(vertex_data) primitive = GeomTristrips(Geom.UH_static) for j in range(count): rows = range(count + 1) if j % 2 else reversed(range(count + 1)) for i in rows: primitive.add_vertex((j + (j + 1) % 2) * (count + 1) + i) primitive.add_vertex((j + j % 2) * (count + 1) + i) primitive.close_primitive() geom.add_primitive(primitive) return geom
def _generate_mesh(way: Way) -> Geom: """Generate mesh for a Way.""" geometry = way.geometry rows = 2 * len(geometry.segments) + 2 vertex_data = GeomVertexData(str(way.id), VERTEX_FORMAT, Geom.UH_static) vertex_data.set_num_rows(rows) vertex_writer = GeomVertexWriter(vertex_data, 'vertex') normal_writer = GeomVertexWriter(vertex_data, 'normal') texcoord_writer = GeomVertexWriter(vertex_data, 'texcoord') start_z = way.start.level * LEVEL_HEIGHT end_z = way.end.level * LEVEL_HEIGHT lanes_float = float(way.total_lane_count) segment = geometry.segments[0] for vertex in (segment.start_left, segment.start_right): vertex_writer.add_data3f(vertex.x, vertex.y, start_z) normal_writer.add_data3f(0.0, 0.0, 1.0) texture_v = 0.0 texcoord_writer.add_data2f(0.0, texture_v) texcoord_writer.add_data2f(lanes_float, texture_v) lengths = [s.length() for s in geometry.segments] total_len = sum(lengths) for segment, acc_len in zip(geometry.segments, accumulate(lengths)): height = start_z + (end_z - start_z) * acc_len / total_len for vertex in (segment.end_left, segment.end_right): vertex_writer.add_data3f(vertex.x, vertex.y, height) normal_writer.add_data3f(0.0, 0.0, 1.0) texture_v = acc_len / LANE_WIDTH texcoord_writer.add_data2f(0.0, texture_v) texcoord_writer.add_data2f(lanes_float, texture_v) primitive = GeomTristrips(Geom.UH_static) primitive.add_consecutive_vertices(0, rows) primitive.close_primitive() geom = Geom(vertex_data) geom.add_primitive(primitive) return geom