support dynamic geoms properly with display lists

This commit is contained in:
David Rose 2004-03-30 22:02:29 +00:00
parent 0f5c46313c
commit ad9a03da5c
5 changed files with 66 additions and 79 deletions

View File

@ -17,6 +17,30 @@
////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////
// Function: CLP(GraphicsStateGuardian)::draw_display_list
// Access: Public
// Description: If the GeomContext is non-NULL and contains a valid
// display list, uses it to draw the geometry if
// appropriate, and returns true. If the display list
// is absent or cannot be used for some reason, does
// nothing and returns false.
////////////////////////////////////////////////////////////////////
INLINE bool CLP(GraphicsStateGuardian)::
draw_display_list(GeomContext *gc) {
if (gc != (GeomContext *)NULL && _vertex_colors_enabled) {
_draw_primitive_pcollector.start();
CLP(GeomContext) *ggc = DCAST(CLP(GeomContext), gc);
GLP(CallList)(ggc->_index);
#ifdef DO_PSTATS
_vertices_display_list_pcollector.add_level(ggc->_num_verts);
#endif
_draw_primitive_pcollector.stop();
return true;
}
return false;
}
////////////////////////////////////////////////////////////////////
// Function: CLP(GraphicsStateGuardian)::report_errors
// Access: Public, Static

View File

@ -652,14 +652,7 @@ draw_point(GeomPoint *geom, GeomContext *gc) {
GLCAT.spam() << "draw_point()" << endl;
#endif
if (gc != (GeomContext *)NULL) {
_draw_primitive_pcollector.start();
CLP(GeomContext) *ggc = DCAST(CLP(GeomContext), gc);
GLP(CallList)(ggc->_index);
#ifdef DO_PSTATS
_vertices_display_list_pcollector.add_level(ggc->_num_verts);
#endif
_draw_primitive_pcollector.stop();
if (draw_display_list(gc)) {
return;
}
@ -725,14 +718,7 @@ draw_line(GeomLine *geom, GeomContext *gc) {
GLCAT.spam() << "draw_line()" << endl;
#endif
if (gc != (GeomContext *)NULL) {
_draw_primitive_pcollector.start();
CLP(GeomContext) *ggc = DCAST(CLP(GeomContext), gc);
GLP(CallList)(ggc->_index);
#ifdef DO_PSTATS
_vertices_display_list_pcollector.add_level(ggc->_num_verts);
#endif
_draw_primitive_pcollector.stop();
if (draw_display_list(gc)) {
return;
}
@ -808,14 +794,7 @@ draw_linestrip(GeomLinestrip *geom, GeomContext *gc) {
GLCAT.spam() << "draw_linestrip()" << endl;
#endif
if (gc != (GeomContext *)NULL) {
_draw_primitive_pcollector.start();
CLP(GeomContext) *ggc = DCAST(CLP(GeomContext), gc);
GLP(CallList)(ggc->_index);
#ifdef DO_PSTATS
_vertices_display_list_pcollector.add_level(ggc->_num_verts);
#endif
_draw_primitive_pcollector.stop();
if (draw_display_list(gc)) {
return;
}
@ -1190,14 +1169,7 @@ draw_polygon(GeomPolygon *geom, GeomContext *gc) {
GLCAT.spam() << "draw_polygon()" << endl;
#endif
if (gc != (GeomContext *)NULL) {
_draw_primitive_pcollector.start();
CLP(GeomContext) *ggc = DCAST(CLP(GeomContext), gc);
GLP(CallList)(ggc->_index);
#ifdef DO_PSTATS
_vertices_display_list_pcollector.add_level(ggc->_num_verts);
#endif
_draw_primitive_pcollector.stop();
if (draw_display_list(gc)) {
return;
}
@ -1280,14 +1252,7 @@ draw_tri(GeomTri *geom, GeomContext *gc) {
GLCAT.spam() << "draw_tri()" << endl;
#endif
if (gc != (GeomContext *)NULL) {
_draw_primitive_pcollector.start();
CLP(GeomContext) *ggc = DCAST(CLP(GeomContext), gc);
GLP(CallList)(ggc->_index);
#ifdef DO_PSTATS
_vertices_display_list_pcollector.add_level(ggc->_num_verts);
#endif
_draw_primitive_pcollector.stop();
if (draw_display_list(gc)) {
return;
}
@ -1367,14 +1332,7 @@ draw_quad(GeomQuad *geom, GeomContext *gc) {
GLCAT.spam() << "draw_quad()" << endl;
#endif
if (gc != (GeomContext *)NULL) {
_draw_primitive_pcollector.start();
CLP(GeomContext) *ggc = DCAST(CLP(GeomContext), gc);
GLP(CallList)(ggc->_index);
#ifdef DO_PSTATS
_vertices_display_list_pcollector.add_level(ggc->_num_verts);
#endif
_draw_primitive_pcollector.stop();
if (draw_display_list(gc)) {
return;
}
@ -1452,14 +1410,7 @@ draw_tristrip(GeomTristrip *geom, GeomContext *gc) {
GLCAT.spam() << "draw_tristrip()" << endl;
#endif
if (gc != (GeomContext *)NULL) {
_draw_primitive_pcollector.start();
CLP(GeomContext) *ggc = DCAST(CLP(GeomContext), gc);
GLP(CallList)(ggc->_index);
#ifdef DO_PSTATS
_vertices_display_list_pcollector.add_level(ggc->_num_verts);
#endif
_draw_primitive_pcollector.stop();
if (draw_display_list(gc)) {
return;
}
@ -1560,14 +1511,7 @@ draw_trifan(GeomTrifan *geom, GeomContext *gc) {
GLCAT.spam() << "draw_trifan()" << endl;
#endif
if (gc != (GeomContext *)NULL) {
_draw_primitive_pcollector.start();
CLP(GeomContext) *ggc = DCAST(CLP(GeomContext), gc);
GLP(CallList)(ggc->_index);
#ifdef DO_PSTATS
_vertices_display_list_pcollector.add_level(ggc->_num_verts);
#endif
_draw_primitive_pcollector.stop();
if (draw_display_list(gc)) {
return;
}
@ -1668,14 +1612,7 @@ draw_sphere(GeomSphere *geom, GeomContext *gc) {
GLCAT.spam() << "draw_sphere()" << endl;
#endif
if (gc != (GeomContext *)NULL) {
_draw_primitive_pcollector.start();
CLP(GeomContext) *ggc = DCAST(CLP(GeomContext), gc);
GLP(CallList)(ggc->_index);
#ifdef DO_PSTATS
_vertices_display_list_pcollector.add_level(ggc->_num_verts);
#endif
_draw_primitive_pcollector.stop();
if (draw_display_list(gc)) {
return;
}
@ -1841,6 +1778,20 @@ release_texture(TextureContext *tc) {
////////////////////////////////////////////////////////////////////
GeomContext *CLP(GraphicsStateGuardian)::
prepare_geom(Geom *geom) {
if (!_vertex_colors_enabled) {
// We can't build a display list (or play back a display list) if
// its color is overridden with a scene graph color. Maybe if we
// take advantage of the OpenGL color matrix we can do this, but
// for now we'll just ignore it.
return NULL;
}
if (geom->is_dynamic()) {
// If the Geom is dynamic in some way, we shouldn't try to
// display-list it.
return NULL;
}
CLP(GeomContext) *ggc = new CLP(GeomContext)(geom);
ggc->_index = GLP(GenLists)(1);
if (GLCAT.is_debug()) {
@ -1854,16 +1805,12 @@ prepare_geom(Geom *geom) {
return NULL;
}
/*
// We need to temporarily force normals and UV's on, so the display
// list will have them built in.
bool old_normals_enabled = _normals_enabled;
bool old_texturing_enabled = _texturing_enabled;
bool old_vertex_colors_enabled = _vertex_colors_enabled;
_normals_enabled = true;
_texturing_enabled = true;
_vertex_colors_enabled = true;
*/
#ifdef DO_PSTATS
// Count up the number of vertices we're about to render, by
@ -1891,11 +1838,8 @@ prepare_geom(Geom *geom) {
ggc->_num_verts = (int)(num_verts + 0.5);
#endif
/*
_normals_enabled = old_normals_enabled;
_texturing_enabled = old_texturing_enabled;
_vertex_colors_enabled = old_vertex_colors_enabled;
*/
report_my_gl_errors();
return ggc;

View File

@ -66,6 +66,8 @@ public:
virtual void draw_trifan(GeomTrifan *geom, GeomContext *gc);
virtual void draw_sphere(GeomSphere *geom, GeomContext *gc);
INLINE bool draw_display_list(GeomContext *gc);
virtual TextureContext *prepare_texture(Texture *tex);
virtual void apply_texture(TextureContext *tc);
virtual void release_texture(TextureContext *tc);

View File

@ -82,6 +82,21 @@ draw_immediate(GraphicsStateGuardianBase *gsg, GeomContext *gc) {
gsg->draw_sprite(this, gc);
}
////////////////////////////////////////////////////////////////////
// Function: GeomSprite::is_dynamic
// Access: Public, Virtual
// Description: Returns true if the Geom has any dynamic properties
// that are expected to change from one frame to the
// next, or false if the Geom is largely static. For
// now, this is the same thing as asking whether its
// vertices are indexed.
////////////////////////////////////////////////////////////////////
bool GeomSprite::
is_dynamic() const {
// Sprites are always dynamic.
return true;
}
////////////////////////////////////////////////////////////////////
// Function: GeomSprite::write_datagram
// Access: Public

View File

@ -43,6 +43,8 @@ public:
virtual Geom *explode() const {
return new GeomSprite(*this); }
virtual bool is_dynamic() const;
static float get_frustum_top() { return 1.0f; }
static float get_frustum_bottom() { return -1.0f; }
static float get_frustum_left() { return -1.0f; }