Because of performance issues, I want to remove some vertex from a vertex_data rather than copying all the vertex I want to keep.
From what I had read here: https://discourse.panda3d.org/viewtopic.php?t=7777, I decided to try playing with the setSubdata.
But it doesn’t seems to work the way I expected it.
When executing this code:
import direct.directbase.DirectStart
from pandac.PandaModules import *
def test_setSubdata():
geomNode = GeomNode('line')
node = NodePath(geomNode)
vertex_format = GeomVertexFormat.getV3()
vertex_data = GeomVertexData('hf_vertices', vertex_format, Geom.UHStatic)
geom = Geom(vertex_data)
geomNode.addGeom(geom)
index_buffer = GeomLines(Geom.UHStatic)
geom.addPrimitive(index_buffer)
node.reparentTo(render)
# ==
fill_vertex_data(vertex_data, index_buffer)
# ==
display_vertex_data(vertex_data)
# ==
start = 0
array = vertex_data.modifyArray(0)
handle = array.modifyHandle()
length = array.getArrayFormat().getStride()
handle.setSubdata(start*length, length*2, '')
# ==
display_vertex_data(vertex_data)
def fill_vertex_data(vertex_data, index_buffer):
vertex_coord = GeomVertexWriter(vertex_data, 'vertex')
vertex_coord.addData3f(0,0,0)
vertex_coord.addData3f(10,0,0)
index_buffer.closePrimitive()
vertex_coord.addData3f(20,0,0)
vertex_coord.addData3f(30,0,0)
index_buffer.closePrimitive()
def display_vertex_data(vertex_data):
print '-'*20
vertex_reader = GeomVertexReader(vertex_data,'vertex')
index = 0
vertex_reader.setRow(0)
while index<vertex_data.getNumRows():
index = index+1
print vertex_reader.getData3f()
if __name__ == '__main__':
test_setSubdata()
I get:
--------------------
VBase3(0, 0, 0)
VBase3(10, 0, 0)
VBase3(20, 0, 0)
VBase3(30, 0, 0)
--------------------
VBase3(0, 0, 0)
VBase3(10, 0, 0)
Where I would I have expected
VBase3(20, 0, 0)
VBase3(30, 0, 0)
in the second print.
Did I miss something, or is there an actual issue with setSubdata?
If so, is there another efficient way to remove vertex without recreating the whole vertexData?