Backport 4a8819b0bd7517cf8ad0fe1eed0666b324cadc14 (MeshDrawer fixes and improvements)

* Fix random number generator on Windows (LP 1663895)
* Assert instead of crash when passing in non-Camera to begin() (LP 1663900)
* Prevent repeated calls to generator()/set_budget() from leaking GeomNodes (LP 1663903)
* Make the generator more efficient
This commit is contained in:
rdb 2017-03-10 15:44:47 +01:00
parent 94641c83a0
commit 20085d182a

View File

@ -34,7 +34,7 @@
TypeHandle MeshDrawer::_type_handle; TypeHandle MeshDrawer::_type_handle;
PN_stdfloat randFloat() { PN_stdfloat randFloat() {
return ((PN_stdfloat) rand() / (PN_stdfloat) 0x7fffffff); return ((PN_stdfloat)rand() / (PN_stdfloat)RAND_MAX);
} }
//////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////
@ -45,39 +45,43 @@ PN_stdfloat randFloat() {
void MeshDrawer::generator(int budget) { void MeshDrawer::generator(int budget) {
// create enough triangles for budget: // create enough triangles for budget:
_vdata = new GeomVertexData(_root.get_name(), GeomVertexFormat::get_v3n3c4t2(), Geom::UH_static);//UH_dynamic); _vdata = new GeomVertexData(_root.get_name(), GeomVertexFormat::get_v3n3c4t2(), Geom::UH_static);//UH_dynamic);
GeomVertexWriter *tvertex = new GeomVertexWriter(_vdata, "vertex"); _vdata->unclean_set_num_rows(budget * 3);
GeomVertexWriter *tnormal = new GeomVertexWriter(_vdata, "normal");
GeomVertexWriter *tuv = new GeomVertexWriter(_vdata, "texcoord");
GeomVertexWriter *tcolor = new GeomVertexWriter(_vdata, "color");
_prim = new GeomTriangles(Geom::UH_static);
// iterate and fill _up a geom with random data so that it will {
// not be optimized out by panda3d system GeomVertexWriter tvertex(_vdata, "vertex");
for(int i = 0; i < budget; i++) { GeomVertexWriter tnormal(_vdata, "normal");
for( int vert = 0; vert < 3; vert++) { GeomVertexWriter tuv(_vdata, "texcoord");
LVector3 vec3 = LVector3(randFloat()+1000,randFloat(),randFloat())*.001; GeomVertexWriter tcolor(_vdata, "color");
LVector4 vec4 = LVector4(1,1,1,randFloat());
LVector2 vec2 = LVector2(0,randFloat()); // iterate and fill _up a geom with random data so that it will not be
tvertex->add_data3(vec3); // optimized out by panda3d system
tcolor->add_data4(vec4); for (int i = 0; i < budget; i++) {
tuv->add_data2(vec2); for (int vert = 0; vert < 3; vert++) {
tnormal->add_data3(vec3); LVector3 vec3 = LVector3(randFloat()+1000,randFloat(),randFloat())*.001;
LVector4 vec4 = LVector4(1,1,1,randFloat());
LVector2 vec2 = LVector2(0,randFloat());
tvertex.set_data3(vec3);
tcolor.set_data4(vec4);
tuv.set_data2(vec2);
tnormal.set_data3(vec3);
}
} }
_prim->add_vertices(i * 3, i * 3 + 1, i * 3 + 2);
} }
// create our node and attach it to this node path // create our node and attach it to this node path
_prim = new GeomTriangles(Geom::UH_static);
_prim->add_next_vertices(budget * 3);
_prim->close_primitive(); _prim->close_primitive();
_geom = new Geom(_vdata); _geom = new Geom(_vdata);
_geom->add_primitive(_prim); _geom->add_primitive(_prim);
_geomnode = new GeomNode("__MeshDrawer_GeomNode"); if (_geomnode == NULL) {
_geomnode = new GeomNode("__MeshDrawer_GeomNode");
_root.attach_new_node(_geomnode);
} else {
_geomnode->remove_all_geoms();
}
_geomnode->add_geom(_geom); _geomnode->add_geom(_geom);
_root.attach_new_node(_geomnode);
_last_clear_index = budget; _last_clear_index = budget;
delete tvertex;
delete tnormal;
delete tuv;
delete tcolor;
} }
//////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////
@ -492,8 +496,9 @@ link_segment(const LVector3 &pos, const LVector4 &frame,
LVector3 cam_stop3d = _camera.get_relative_point(_render, stop); LVector3 cam_stop3d = _camera.get_relative_point(_render, stop);
LPoint2 cam_stop2d = LVector2(); LPoint2 cam_stop2d = LVector2();
PT(Camera) camera = DCAST(Camera, _camera.node()); const Camera *camera;
PT(Lens) lens = camera->get_lens(); DCAST_INTO_V(camera, _camera.node());
const Lens *lens = camera->get_lens();
lens->project(cam_start3d, cam_start2d); lens->project(cam_start3d, cam_start2d);
lens->project(cam_stop3d, cam_stop2d); lens->project(cam_stop3d, cam_stop2d);