def setTrianglePointIndex(self, triangleIndex, pointIndex, newVertexIndex): triangleArry = self.primitives.modifyVertices() triangleArry = triangleArry.modifyHandle(Thread.getCurrentThread()) # releases the array when deleted bytesPerVert = triangleArry.getArrayFormat().getTotalBytes() # BLOG C string to Python struct conversion https://docs.python.org/2/library/struct.html#format-characters fmtStr = triangleArry.getArrayFormat().getFormatString(False) # True pads the bytes if fmtStr[0] != '=': fmtStr = '=' + fmtStr # use standard sizing w/ = or native w/ @ readerWriter = struct.Struct(fmtStr) # creating the class instance saves on compiling the format string packed = readerWriter.pack(newVertexIndex) triangleArry.setSubdata(triangleIndex * bytesPerVert * 3 + pointIndex * bytesPerVert, bytesPerVert, packed)
def make_cloud_node(pts, col=LColorf(1.0, 0.0, 0.0, 1.0)): ptCloudData = GeomVertexData("PointCloudData", GeomVertexFormat.getV3c4(), GeomEnums.UH_static) vertexWriter = GeomVertexWriter(ptCloudData, Thread.getCurrentThread()) vertexWriter.setColumn("vertex") colorWriter = GeomVertexWriter(ptCloudData, Thread.getCurrentThread()) colorWriter.setColumn("color") for (x, y, z) in pts: vertexWriter.addData3(x, y, z) colorWriter.addData4(col) geomPts = GeomPoints(GeomEnums.UH_static) geomPts.addConsecutiveVertices(0, len(pts)) geomPts.closePrimitive() geom = Geom(ptCloudData) geom.addPrimitive(geomPts) node = GeomNode("PointCloudNode") node.addGeom(geom, RenderState.makeEmpty()) return node
def make_patch_node(pts, col=LColorf(0.0, 1.0, 0.0, 1.0)): splinePatchData = GeomVertexData("SplinePatchData", GeomVertexFormat.getV3c4(), GeomEnums.UH_static) vertexWriter = GeomVertexWriter(splinePatchData, Thread.getCurrentThread()) vertexWriter.setColumn("vertex") colorWriter = GeomVertexWriter(splinePatchData, Thread.getCurrentThread()) colorWriter.setColumn("color") for (x, y, z) in pts: vertexWriter.addData3(x, y, z) colorWriter.addData4(col) geomLines = GeomLines(GeomEnums.UH_static) geomLines.addConsecutiveVertices(0, len(pts)) geomLines.addVertex(0) geomLines.closePrimitive() geom = Geom(splinePatchData) geom.addPrimitive(geomLines) node = GeomNode("SplinePatchNode") node.addGeom(geom, RenderState.makeEmpty()) return node
def setTrianglePointIndex(self, triangleIndex, pointIndex, newVertexIndex): triangleArry = self.primitives.modifyVertices() triangleArry = triangleArry.modifyHandle( Thread.getCurrentThread()) # releases the array when deleted bytesPerVert = triangleArry.getArrayFormat().getTotalBytes() # BLOG C string to Python struct conversion https://docs.python.org/2/library/struct.html#format-characters fmtStr = triangleArry.getArrayFormat().getFormatString( False) # True pads the bytes if fmtStr[0] != '=': fmtStr = '=' + fmtStr # use standard sizing w/ = or native w/ @ readerWriter = struct.Struct( fmtStr ) # creating the class instance saves on compiling the format string packed = readerWriter.pack(newVertexIndex) triangleArry.setSubdata( triangleIndex * bytesPerVert * 3 + pointIndex * bytesPerVert, bytesPerVert, packed)
def render_patch(self, pts): nodePath = NodePath(make_patch_node(pts), Thread.getCurrentThread()) nodePath.reparentTo(self.render) nodePath.setRenderModeThickness(0.2) nodePath.setRenderModePerspective(True)
def render_cloud(self, pts): nodePath = NodePath(make_cloud_node(pts), Thread.getCurrentThread()) nodePath.reparentTo(self.render) nodePath.setRenderModeThickness(0.15) nodePath.setRenderModePerspective(False)