diff --git a/radiant/brush.h b/radiant/brush.h index d6ea27ed..bf97b001 100644 --- a/radiant/brush.h +++ b/radiant/brush.h @@ -1737,9 +1737,16 @@ void updateFiltered(){ // observer void planeChanged(){ - m_planeChanged = true; - aabbChanged(); - m_lightsChanged(); + /* m_planeChanged vs m_transformChanged relationship is important + b4 (w/o one) cycling dependency occured: + transformModifier.set ; transformChanged() ; planeChanged() ; pivotChanged() ; sceneChangeNotify() ; + sceneRender() ; localAABB ; evaluateBRep ; buildBRep() ; evaluateTransform ; !!!problem starts here!!!! planeChanged() ; pivotChanged() ; sceneChangeNotify() ; + sceneRender() ; localAABB ; evaluateBRep ; buildBRep() ; */ + if( !m_transformChanged ){ + m_planeChanged = true; + aabbChanged(); + m_lightsChanged(); + } } void shaderChanged(){ updateFiltered(); @@ -1754,16 +1761,18 @@ void evaluateBRep() const { } void transformChanged(){ - m_transformChanged = true; + //m_transformChanged = true; planeChanged(); + m_transformChanged = true; //experimental fix of cyclic dependency } typedef MemberCaller TransformChangedCaller; void evaluateTransform(){ if ( m_transformChanged ) { - m_transformChanged = false; + //m_transformChanged = false; revertTransform(); m_evaluateTransform(); + m_transformChanged = false; //experimental fix of cyclic dependency } } const Matrix4& localToParent() const { diff --git a/radiant/brush_primit.cpp b/radiant/brush_primit.cpp index 7471468e..6726b33e 100644 --- a/radiant/brush_primit.cpp +++ b/radiant/brush_primit.cpp @@ -1492,7 +1492,8 @@ std::size_t planeNormalIndex( const Vector3& normal ) { void Texdef_transformLocked( TextureProjection& projection, std::size_t width, std::size_t height, const Plane3& plane, const Matrix4& identity2transformed, const Vector3 centroid ){ if( identity2transformed == g_matrix4_identity ){ - return; //TODO FIXME !!! this (and whole pipeline?) is called with g_matrix4_identity after every transform + //globalOutputStream() << "identity2transformed == g_matrix4_identity\n"; + return; //TODO FIXME !!! this (and whole pipeline?) is called with g_matrix4_identity after every transform //now only on freezeTransform, it seems } if ( g_bp_globals.m_texdefTypeId == TEXDEFTYPEID_BRUSHPRIMITIVES ) { #if 1 diff --git a/radiant/patch.cpp b/radiant/patch.cpp index 9efe6738..ff7d1b18 100644 --- a/radiant/patch.cpp +++ b/radiant/patch.cpp @@ -302,7 +302,8 @@ void Patch::UpdateCachedData(){ } #endif - SceneChangeNotify(); + if( !m_transformChanged ) //experimental! fixing extra sceneChangeNotify call during scene rendering + SceneChangeNotify(); } void Patch::InvertMatrix(){ @@ -750,7 +751,8 @@ void Patch::AccumulateBBox(){ aabb_extend_by_point_safe( m_aabb_local, ( *i ).m_vertex ); } - m_boundsChanged(); + if( !m_transformChanged ) //experimental! fixing extra sceneChangeNotify call during scene rendering + m_boundsChanged(); m_lightsChanged(); } diff --git a/radiant/patch.h b/radiant/patch.h index bf7329e4..7348791c 100644 --- a/radiant/patch.h +++ b/radiant/patch.h @@ -619,6 +619,7 @@ const Matrix4& localToParent() const { return g_matrix4_identity; } const AABB& localAABB() const { + const_cast( this )->evaluateTransform(); //experimental! fixing extra sceneChangeNotify call during scene rendering return m_aabb_local; } VolumeIntersectionValue intersectVolume( const VolumeTest& test, const Matrix4& localToWorld ) const { @@ -673,6 +674,7 @@ void transform( const Matrix4& matrix ){ } void transformChanged(){ m_transformChanged = true; + m_boundsChanged(); //experimental! fixing extra sceneChangeNotify call during scene rendering m_lightsChanged(); SceneChangeNotify(); } @@ -680,9 +682,10 @@ typedef MemberCaller TransformChangedCaller; void evaluateTransform(){ if ( m_transformChanged ) { - m_transformChanged = false; + //m_transformChanged = false; revertTransform(); m_evaluateTransform(); + m_transformChanged = false; //experimental! fixing extra sceneChangeNotify call during scene rendering } }