mirror of
https://github.com/panda3d/panda3d.git
synced 2025-10-02 18:03:56 -04:00
Fix circular reference in shader context preventing shader states from being cleared
This commit is contained in:
parent
bdf91e206d
commit
1628238222
@ -424,43 +424,44 @@ set_state_and_transform(const RenderState *target_rs,
|
||||
altered |= Shader::SSD_projection;
|
||||
}
|
||||
|
||||
if (_state_rs != target_rs) {
|
||||
if (_state_rs == NULL) {
|
||||
// We haven't set any state yet.
|
||||
altered |= Shader::SSD_general;
|
||||
} else {
|
||||
if (_state_rs->get_attrib(ColorAttrib::get_class_slot()) !=
|
||||
target_rs->get_attrib(ColorAttrib::get_class_slot())) {
|
||||
altered |= Shader::SSD_color;
|
||||
}
|
||||
if (_state_rs->get_attrib(ColorScaleAttrib::get_class_slot()) !=
|
||||
target_rs->get_attrib(ColorScaleAttrib::get_class_slot())) {
|
||||
altered |= Shader::SSD_colorscale;
|
||||
}
|
||||
if (_state_rs->get_attrib(MaterialAttrib::get_class_slot()) !=
|
||||
target_rs->get_attrib(MaterialAttrib::get_class_slot())) {
|
||||
altered |= Shader::SSD_material;
|
||||
}
|
||||
if (_state_rs->get_attrib(ShaderAttrib::get_class_slot()) !=
|
||||
target_rs->get_attrib(ShaderAttrib::get_class_slot())) {
|
||||
altered |= Shader::SSD_shaderinputs;
|
||||
}
|
||||
if (_state_rs->get_attrib(FogAttrib::get_class_slot()) !=
|
||||
target_rs->get_attrib(FogAttrib::get_class_slot())) {
|
||||
altered |= Shader::SSD_fog;
|
||||
}
|
||||
if (_state_rs->get_attrib(LightAttrib::get_class_slot()) !=
|
||||
target_rs->get_attrib(LightAttrib::get_class_slot())) {
|
||||
altered |= Shader::SSD_light;
|
||||
}
|
||||
if (_state_rs->get_attrib(ClipPlaneAttrib::get_class_slot()) !=
|
||||
target_rs->get_attrib(ClipPlaneAttrib::get_class_slot())) {
|
||||
altered |= Shader::SSD_clip_planes;
|
||||
}
|
||||
if (_state_rs->get_attrib(TexMatrixAttrib::get_class_slot()) !=
|
||||
target_rs->get_attrib(TexMatrixAttrib::get_class_slot())) {
|
||||
altered |= Shader::SSD_tex_matrix;
|
||||
}
|
||||
if (_state_rs.was_deleted() || _state_rs == (const RenderState *)NULL) {
|
||||
// Reset all of the state.
|
||||
altered |= Shader::SSD_general;
|
||||
_state_rs = target_rs;
|
||||
|
||||
} else if (_state_rs != target_rs) {
|
||||
// The state has changed since last time.
|
||||
if (_state_rs->get_attrib(ColorAttrib::get_class_slot()) !=
|
||||
target_rs->get_attrib(ColorAttrib::get_class_slot())) {
|
||||
altered |= Shader::SSD_color;
|
||||
}
|
||||
if (_state_rs->get_attrib(ColorScaleAttrib::get_class_slot()) !=
|
||||
target_rs->get_attrib(ColorScaleAttrib::get_class_slot())) {
|
||||
altered |= Shader::SSD_colorscale;
|
||||
}
|
||||
if (_state_rs->get_attrib(MaterialAttrib::get_class_slot()) !=
|
||||
target_rs->get_attrib(MaterialAttrib::get_class_slot())) {
|
||||
altered |= Shader::SSD_material;
|
||||
}
|
||||
if (_state_rs->get_attrib(ShaderAttrib::get_class_slot()) !=
|
||||
target_rs->get_attrib(ShaderAttrib::get_class_slot())) {
|
||||
altered |= Shader::SSD_shaderinputs;
|
||||
}
|
||||
if (_state_rs->get_attrib(FogAttrib::get_class_slot()) !=
|
||||
target_rs->get_attrib(FogAttrib::get_class_slot())) {
|
||||
altered |= Shader::SSD_fog;
|
||||
}
|
||||
if (_state_rs->get_attrib(LightAttrib::get_class_slot()) !=
|
||||
target_rs->get_attrib(LightAttrib::get_class_slot())) {
|
||||
altered |= Shader::SSD_light;
|
||||
}
|
||||
if (_state_rs->get_attrib(ClipPlaneAttrib::get_class_slot()) !=
|
||||
target_rs->get_attrib(ClipPlaneAttrib::get_class_slot())) {
|
||||
altered |= Shader::SSD_clip_planes;
|
||||
}
|
||||
if (_state_rs->get_attrib(TexMatrixAttrib::get_class_slot()) !=
|
||||
target_rs->get_attrib(TexMatrixAttrib::get_class_slot())) {
|
||||
altered |= Shader::SSD_tex_matrix;
|
||||
}
|
||||
_state_rs = target_rs;
|
||||
}
|
||||
|
@ -77,7 +77,7 @@ private:
|
||||
|
||||
pvector<CGparameter> _cg_parameter_map;
|
||||
|
||||
CPT(RenderState) _state_rs;
|
||||
WCPT(RenderState) _state_rs;
|
||||
CPT(TransformState) _modelview_transform;
|
||||
CPT(TransformState) _projection_transform;
|
||||
GLint _frame_number;
|
||||
|
@ -1613,43 +1613,44 @@ set_state_and_transform(const RenderState *target_rs,
|
||||
altered |= Shader::SSD_projection;
|
||||
}
|
||||
|
||||
if (_state_rs != target_rs) {
|
||||
if (_state_rs == NULL) {
|
||||
// We haven't set any state yet.
|
||||
altered |= Shader::SSD_general;
|
||||
} else {
|
||||
if (_state_rs->get_attrib(ColorAttrib::get_class_slot()) !=
|
||||
target_rs->get_attrib(ColorAttrib::get_class_slot())) {
|
||||
altered |= Shader::SSD_color;
|
||||
}
|
||||
if (_state_rs->get_attrib(ColorScaleAttrib::get_class_slot()) !=
|
||||
target_rs->get_attrib(ColorScaleAttrib::get_class_slot())) {
|
||||
altered |= Shader::SSD_colorscale;
|
||||
}
|
||||
if (_state_rs->get_attrib(MaterialAttrib::get_class_slot()) !=
|
||||
target_rs->get_attrib(MaterialAttrib::get_class_slot())) {
|
||||
altered |= Shader::SSD_material;
|
||||
}
|
||||
if (_state_rs->get_attrib(ShaderAttrib::get_class_slot()) !=
|
||||
target_rs->get_attrib(ShaderAttrib::get_class_slot())) {
|
||||
altered |= Shader::SSD_shaderinputs;
|
||||
}
|
||||
if (_state_rs->get_attrib(FogAttrib::get_class_slot()) !=
|
||||
target_rs->get_attrib(FogAttrib::get_class_slot())) {
|
||||
altered |= Shader::SSD_fog;
|
||||
}
|
||||
if (_state_rs->get_attrib(LightAttrib::get_class_slot()) !=
|
||||
target_rs->get_attrib(LightAttrib::get_class_slot())) {
|
||||
altered |= Shader::SSD_light;
|
||||
}
|
||||
if (_state_rs->get_attrib(ClipPlaneAttrib::get_class_slot()) !=
|
||||
target_rs->get_attrib(ClipPlaneAttrib::get_class_slot())) {
|
||||
altered |= Shader::SSD_clip_planes;
|
||||
}
|
||||
if (_state_rs->get_attrib(TexMatrixAttrib::get_class_slot()) !=
|
||||
target_rs->get_attrib(TexMatrixAttrib::get_class_slot())) {
|
||||
altered |= Shader::SSD_tex_matrix;
|
||||
}
|
||||
if (_state_rs.was_deleted() || _state_rs == (const RenderState *)NULL) {
|
||||
// Reset all of the state.
|
||||
altered |= Shader::SSD_general;
|
||||
_state_rs = target_rs;
|
||||
|
||||
} else if (_state_rs != target_rs) {
|
||||
// The state has changed since last time.
|
||||
if (_state_rs->get_attrib(ColorAttrib::get_class_slot()) !=
|
||||
target_rs->get_attrib(ColorAttrib::get_class_slot())) {
|
||||
altered |= Shader::SSD_color;
|
||||
}
|
||||
if (_state_rs->get_attrib(ColorScaleAttrib::get_class_slot()) !=
|
||||
target_rs->get_attrib(ColorScaleAttrib::get_class_slot())) {
|
||||
altered |= Shader::SSD_colorscale;
|
||||
}
|
||||
if (_state_rs->get_attrib(MaterialAttrib::get_class_slot()) !=
|
||||
target_rs->get_attrib(MaterialAttrib::get_class_slot())) {
|
||||
altered |= Shader::SSD_material;
|
||||
}
|
||||
if (_state_rs->get_attrib(ShaderAttrib::get_class_slot()) !=
|
||||
target_rs->get_attrib(ShaderAttrib::get_class_slot())) {
|
||||
altered |= Shader::SSD_shaderinputs;
|
||||
}
|
||||
if (_state_rs->get_attrib(FogAttrib::get_class_slot()) !=
|
||||
target_rs->get_attrib(FogAttrib::get_class_slot())) {
|
||||
altered |= Shader::SSD_fog;
|
||||
}
|
||||
if (_state_rs->get_attrib(LightAttrib::get_class_slot()) !=
|
||||
target_rs->get_attrib(LightAttrib::get_class_slot())) {
|
||||
altered |= Shader::SSD_light;
|
||||
}
|
||||
if (_state_rs->get_attrib(ClipPlaneAttrib::get_class_slot()) !=
|
||||
target_rs->get_attrib(ClipPlaneAttrib::get_class_slot())) {
|
||||
altered |= Shader::SSD_clip_planes;
|
||||
}
|
||||
if (_state_rs->get_attrib(TexMatrixAttrib::get_class_slot()) !=
|
||||
target_rs->get_attrib(TexMatrixAttrib::get_class_slot())) {
|
||||
altered |= Shader::SSD_tex_matrix;
|
||||
}
|
||||
_state_rs = target_rs;
|
||||
}
|
||||
|
@ -69,7 +69,7 @@ private:
|
||||
typedef pvector<GLuint> GLSLShaders;
|
||||
GLSLShaders _glsl_shaders;
|
||||
|
||||
CPT(RenderState) _state_rs;
|
||||
WCPT(RenderState) _state_rs;
|
||||
CPT(TransformState) _modelview_transform;
|
||||
CPT(TransformState) _projection_transform;
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user