diff --git a/panda/src/display/graphicsStateGuardian.cxx b/panda/src/display/graphicsStateGuardian.cxx index 35603fcea6..18d35d7f78 100644 --- a/panda/src/display/graphicsStateGuardian.cxx +++ b/panda/src/display/graphicsStateGuardian.cxx @@ -2196,7 +2196,10 @@ begin_draw_primitives(const GeomPipelineReader *geom_reader, bool force) { _munger = munger; _data_reader = data_reader; - return _data_reader->has_vertex(); + + // Always draw if we have a shader, since the shader might use a different + // mechanism for fetching vertex data. + return _data_reader->has_vertex() || (_target_shader && _target_shader->has_shader()); } /** diff --git a/panda/src/gobj/geomPrimitive.cxx b/panda/src/gobj/geomPrimitive.cxx index 67b65689e1..6f918eefdb 100644 --- a/panda/src/gobj/geomPrimitive.cxx +++ b/panda/src/gobj/geomPrimitive.cxx @@ -2231,7 +2231,8 @@ get_num_primitives() const { */ bool GeomPrimitivePipelineReader:: check_valid(const GeomVertexDataPipelineReader *data_reader) const { - if (get_num_vertices() != 0 && + if (get_num_vertices() != 0 && + data_reader->get_num_arrays() > 0 && get_max_vertex() >= data_reader->get_num_rows()) { #ifndef NDEBUG diff --git a/panda/src/gobj/geomVertexFormat.I b/panda/src/gobj/geomVertexFormat.I index e9d4110820..2879599cc5 100644 --- a/panda/src/gobj/geomVertexFormat.I +++ b/panda/src/gobj/geomVertexFormat.I @@ -235,6 +235,15 @@ get_morph_delta(size_t n) const { return _morphs[n]._delta; } +/** + * Returns a standard vertex format containing no arrays at all, useful for + * pull-style vertex rendering. + */ +INLINE const GeomVertexFormat *GeomVertexFormat:: +get_empty() { + return get_registry()->_empty; +} + /** * Returns a standard vertex format with just a 3-component vertex position. */ diff --git a/panda/src/gobj/geomVertexFormat.cxx b/panda/src/gobj/geomVertexFormat.cxx index 99b0ecfcc7..0b1795c093 100644 --- a/panda/src/gobj/geomVertexFormat.cxx +++ b/panda/src/gobj/geomVertexFormat.cxx @@ -890,6 +890,8 @@ Registry() { */ void GeomVertexFormat::Registry:: make_standard_formats() { + _empty = register_format(new GeomVertexFormat); + _v3 = register_format(new GeomVertexArrayFormat (InternalName::get_vertex(), 3, NT_stdfloat, C_point)); @@ -1011,10 +1013,6 @@ register_format(GeomVertexFormat *format) { new_format = (*fi); if (!new_format->is_registered()) { new_format->do_register(); - if (new_format->get_num_arrays() == 0) { - gobj_cat.warning() - << "Empty GeomVertexFormat registered.\n"; - } } } diff --git a/panda/src/gobj/geomVertexFormat.h b/panda/src/gobj/geomVertexFormat.h index 68ce5dda8b..cfafdfddde 100644 --- a/panda/src/gobj/geomVertexFormat.h +++ b/panda/src/gobj/geomVertexFormat.h @@ -125,6 +125,8 @@ PUBLISHED: void write_with_data(ostream &out, int indent_level, const GeomVertexData *data) const; + INLINE static const GeomVertexFormat *get_empty(); + // Some standard vertex formats. No particular requirement to use one of // these, but the DirectX renderers can use these formats directly, whereas // any other format will have to be converted first. @@ -227,6 +229,8 @@ private: Formats _formats; LightReMutex _lock; + CPT(GeomVertexFormat) _empty; + CPT(GeomVertexFormat) _v3; CPT(GeomVertexFormat) _v3n3; CPT(GeomVertexFormat) _v3t2;