Skip to content

Commit ef9908c

Browse files
committed
More robust Cg support on non-NVIDIA card + automatically enable hardware skinning in Shader Generator
1 parent 1088cde commit ef9908c

14 files changed

+656
-213
lines changed

panda/src/display/graphicsStateGuardian.cxx

Lines changed: 9 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -814,17 +814,12 @@ dispatch_compute(int num_groups_x, int num_groups_y, int num_groups_z) {
814814
////////////////////////////////////////////////////////////////////
815815
PT(GeomMunger) GraphicsStateGuardian::
816816
get_geom_munger(const RenderState *state, Thread *current_thread) {
817-
// We can cast the RenderState to a non-const object because we are
818-
// only updating a cache within the RenderState, not really changing
819-
// any of its properties.
820-
RenderState *nc_state = ((RenderState *)state);
821-
822817
// Before we even look up the map, see if the _last_mi value points
823818
// to this GSG. This is likely because we tend to visit the same
824819
// state multiple times during a frame. Also, this might well be
825820
// the only GSG in the world anyway.
826-
if (!nc_state->_mungers.empty()) {
827-
RenderState::Mungers::const_iterator mi = nc_state->_last_mi;
821+
if (!state->_mungers.empty()) {
822+
RenderState::Mungers::const_iterator mi = state->_last_mi;
828823
if (!(*mi).first.was_deleted() && (*mi).first == this) {
829824
if ((*mi).second->is_registered()) {
830825
return (*mi).second;
@@ -833,23 +828,23 @@ get_geom_munger(const RenderState *state, Thread *current_thread) {
833828
}
834829

835830
// Nope, we have to look it up in the map.
836-
RenderState::Mungers::iterator mi = nc_state->_mungers.find(this);
837-
if (mi != nc_state->_mungers.end() && !(*mi).first.was_deleted()) {
831+
RenderState::Mungers::iterator mi = state->_mungers.find(this);
832+
if (mi != state->_mungers.end() && !(*mi).first.was_deleted()) {
838833
if ((*mi).second->is_registered()) {
839-
nc_state->_last_mi = mi;
834+
state->_last_mi = mi;
840835
return (*mi).second;
841836
}
842837
// This GeomMunger is no longer registered. Remove it from the
843838
// map.
844-
nc_state->_mungers.erase(mi);
839+
state->_mungers.erase(mi);
845840
}
846841

847842
// Nothing in the map; create a new entry.
848-
PT(GeomMunger) munger = make_geom_munger(nc_state, current_thread);
843+
PT(GeomMunger) munger = make_geom_munger(state, current_thread);
849844
nassertr(munger != (GeomMunger *)NULL && munger->is_registered(), munger);
850845

851-
mi = nc_state->_mungers.insert(RenderState::Mungers::value_type(this, munger)).first;
852-
nc_state->_last_mi = mi;
846+
mi = state->_mungers.insert(RenderState::Mungers::value_type(this, munger)).first;
847+
state->_last_mi = mi;
853848

854849
return munger;
855850
}

panda/src/display/standardMunger.cxx

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -131,7 +131,8 @@ munge_data_impl(const GeomVertexData *data) {
131131
}
132132

133133
GeomVertexAnimationSpec animation = new_data->get_format()->get_animation();
134-
if (_shader_skinning) {
134+
if (_shader_skinning || (_auto_shader && hardware_animated_vertices &&
135+
!basic_shaders_only && animation.get_animation_type() == AT_panda)) {
135136
animation.set_hardware(4, true);
136137

137138
} else if (hardware_animated_vertices &&
@@ -387,7 +388,17 @@ munge_state_impl(const RenderState *state) {
387388
}
388389
if (shader_state->_generated_shader == NULL) {
389390
// Cache the generated ShaderAttrib on the shader state.
390-
shader_state->_generated_shader = shader_generator->synthesize_shader(shader_state);
391+
GeomVertexAnimationSpec spec;
392+
393+
// Currently we overload this flag to request vertex animation
394+
// for the shader generator.
395+
const ShaderAttrib *sattr;
396+
shader_state->get_attrib_def(sattr);
397+
if (sattr->get_flag(ShaderAttrib::F_hardware_skinning)) {
398+
spec.set_hardware(4, true);
399+
}
400+
401+
shader_state->_generated_shader = shader_generator->synthesize_shader(shader_state, spec);
391402
}
392403
munged_state = munged_state->set_attrib(shader_state->_generated_shader);
393404
}

0 commit comments

Comments
 (0)