Skip to content

Commit 20085d1

Browse files
committed
Backport 4a8819b (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
1 parent 94641c8 commit 20085d1

File tree

1 file changed

+33
-28
lines changed

1 file changed

+33
-28
lines changed

panda/src/grutil/meshDrawer.cxx

Lines changed: 33 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@
3434
TypeHandle MeshDrawer::_type_handle;
3535

3636
PN_stdfloat randFloat() {
37-
return ((PN_stdfloat) rand() / (PN_stdfloat) 0x7fffffff);
37+
return ((PN_stdfloat)rand() / (PN_stdfloat)RAND_MAX);
3838
}
3939

4040
////////////////////////////////////////////////////////////////////
@@ -45,39 +45,43 @@ PN_stdfloat randFloat() {
4545
void MeshDrawer::generator(int budget) {
4646
// create enough triangles for budget:
4747
_vdata = new GeomVertexData(_root.get_name(), GeomVertexFormat::get_v3n3c4t2(), Geom::UH_static);//UH_dynamic);
48-
GeomVertexWriter *tvertex = new GeomVertexWriter(_vdata, "vertex");
49-
GeomVertexWriter *tnormal = new GeomVertexWriter(_vdata, "normal");
50-
GeomVertexWriter *tuv = new GeomVertexWriter(_vdata, "texcoord");
51-
GeomVertexWriter *tcolor = new GeomVertexWriter(_vdata, "color");
52-
_prim = new GeomTriangles(Geom::UH_static);
53-
54-
// iterate and fill _up a geom with random data so that it will
55-
// not be optimized out by panda3d system
56-
for(int i = 0; i < budget; i++) {
57-
for( int vert = 0; vert < 3; vert++) {
58-
LVector3 vec3 = LVector3(randFloat()+1000,randFloat(),randFloat())*.001;
59-
LVector4 vec4 = LVector4(1,1,1,randFloat());
60-
LVector2 vec2 = LVector2(0,randFloat());
61-
tvertex->add_data3(vec3);
62-
tcolor->add_data4(vec4);
63-
tuv->add_data2(vec2);
64-
tnormal->add_data3(vec3);
48+
_vdata->unclean_set_num_rows(budget * 3);
49+
50+
{
51+
GeomVertexWriter tvertex(_vdata, "vertex");
52+
GeomVertexWriter tnormal(_vdata, "normal");
53+
GeomVertexWriter tuv(_vdata, "texcoord");
54+
GeomVertexWriter tcolor(_vdata, "color");
55+
56+
// iterate and fill _up a geom with random data so that it will not be
57+
// optimized out by panda3d system
58+
for (int i = 0; i < budget; i++) {
59+
for (int vert = 0; vert < 3; vert++) {
60+
LVector3 vec3 = LVector3(randFloat()+1000,randFloat(),randFloat())*.001;
61+
LVector4 vec4 = LVector4(1,1,1,randFloat());
62+
LVector2 vec2 = LVector2(0,randFloat());
63+
tvertex.set_data3(vec3);
64+
tcolor.set_data4(vec4);
65+
tuv.set_data2(vec2);
66+
tnormal.set_data3(vec3);
67+
}
6568
}
66-
_prim->add_vertices(i * 3, i * 3 + 1, i * 3 + 2);
6769
}
70+
6871
// create our node and attach it to this node path
72+
_prim = new GeomTriangles(Geom::UH_static);
73+
_prim->add_next_vertices(budget * 3);
6974
_prim->close_primitive();
7075
_geom = new Geom(_vdata);
7176
_geom->add_primitive(_prim);
72-
_geomnode = new GeomNode("__MeshDrawer_GeomNode");
77+
if (_geomnode == NULL) {
78+
_geomnode = new GeomNode("__MeshDrawer_GeomNode");
79+
_root.attach_new_node(_geomnode);
80+
} else {
81+
_geomnode->remove_all_geoms();
82+
}
7383
_geomnode->add_geom(_geom);
74-
_root.attach_new_node(_geomnode);
7584
_last_clear_index = budget;
76-
77-
delete tvertex;
78-
delete tnormal;
79-
delete tuv;
80-
delete tcolor;
8185
}
8286

8387
////////////////////////////////////////////////////////////////////
@@ -492,8 +496,9 @@ link_segment(const LVector3 &pos, const LVector4 &frame,
492496
LVector3 cam_stop3d = _camera.get_relative_point(_render, stop);
493497
LPoint2 cam_stop2d = LVector2();
494498

495-
PT(Camera) camera = DCAST(Camera, _camera.node());
496-
PT(Lens) lens = camera->get_lens();
499+
const Camera *camera;
500+
DCAST_INTO_V(camera, _camera.node());
501+
const Lens *lens = camera->get_lens();
497502

498503
lens->project(cam_start3d, cam_start2d);
499504
lens->project(cam_stop3d, cam_stop2d);

0 commit comments

Comments
 (0)
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy