Reading existing Geometry Data

hello,

I have tried to follow the article in the manual about reading from existing geometry data.
I seem to have a problem though.

here is some code

		NodePathCollection nodePathCollection = environ.find_all_matches("**/+GeomNode");

		for (int i = 0; i < nodePathCollection.size(); ++i)
		{  
			NodePath nodePath = nodePathCollection[i];
			PT(GeomNode) geomNode = nodePath.node();
			ProcessGeomNode(geomNode);
		}

and here

void ProcessPrimitive(CPT(GeomPrimitive) prim, CPT(GeomVertexData) data)
{
	GeomVertexReader vertex = GeomVertexReader(data, "vertex");

	prim = prim->decompose();

	for (int p = 0; p < prim->get_num_primitives(); ++p)
	{
		
		int start = prim->get_primitive_start(p);
		int end = prim->get_primitive_end(p);

		for (int i = start; i < end; ++i)
		{
			int vertID = prim->get_vertex(i);
			vertex.set_row(vertID);
			std::cout << "primitive" << p << "has vertex " << vertID << "\n";
		}	
	}
}

void ProcessVertexData(CPT(GeomVertexData) data)
{
	GeomVertexReader vertex = GeomVertexReader(data, "vertex");
	GeomVertexReader texcoord = GeomVertexReader(data, "texcoord");

	unsigned int index = 0;
	while (!vertex.is_at_end())
	{
		const LVecBase3f& v = vertex.get_data3f();
		const LVecBase2f& t = texcoord.get_data2f();

		std::cout << "v" << index << "[" << v.get_x() << "," << v.get_y() << "," << v.get_z() << "]\n";
		++index;
	}
}

void ProcessGeom(CPT(Geom) geom)
{
	CPT(GeomVertexData) vdata = geom->get_vertex_data();
	ProcessVertexData(vdata);

	for (int i = 0; i < geom->get_num_primitives(); ++i)
	{
		CPT(GeomPrimitive) prim = geom->get_primitive(i);
		ProcessPrimitive(prim, vdata);
	}
}

void ProcessGeomNode(PT(GeomNode) geomNode)
{
	for (int i = 0; i < geomNode->get_num_geoms(); ++i)
	{
		CPT(Geom) geom = geomNode->get_geom(i);
		ProcessGeom(geom);
	}
}

this fails with

error C2440: ‘initializing’ : cannot convert from ‘PandaNode *’ to ‘PointerTo’

on this line PT(GeomNode) geomNode = nodePath.node();

i was wondering if I need to do it like this instead

GeomNode* geomNode = static_cast<GeomNode*>(nodePath.node());

also anyone knows if my code looks correct ?

Chrys

I think the right cast is:
PT(GeomNode) geomNode = DCAST(GeomNode, nodePath.node());

you were right , that worked and the debug spew seems to confirm that the routines indeed seem to work :slight_smile:

thanks