Changeset 3098

Show
Ignore:
Timestamp:
12/02/09 13:57:01 (9 months ago)
Author:
phoku
Message:

Still very much work in progress fix on #419.

The Camera.virtualScreenToScreen and screenToVirtualScreen
methods now preserve the z value, but do not use it for
calculation - this fixes them.

LayerCache?.update now calculates the viewport correctly,
however a few issues remain esp. at the borders.

Location:
branches/active/view_performance/engine/core
Files:
3 modified

Legend:

Unmodified
Added
Removed
  • branches/active/view_performance/engine/core/util/math/matrix.h

    r2515 r3098  
    224224                                return m[ind]; 
    225225                        } 
     226                        inline const T& operator[] (int ind) const { 
     227                                assert(ind > -1 && ind < 16); 
     228                                return m[ind]; 
     229                        } 
    226230 
    227231                        /** Apply the matrix dot product to this matrix 
     
    375379         */ 
    376380        template<typename T> 
    377         std::ostream& operator<<(std::ostream& os, Matrix<T>& m) { 
     381        std::ostream& operator<<(std::ostream& os, const Matrix<T>& m) { 
     382                 
    378383                return os << "\n|" << m[0] << "," << m[4] << "," << m[8] << ","  << m[12] << "|\n" << \ 
    379384                               "|" << m[1] << "," << m[5] << "," << m[9] << ","  << m[13] << "|\n" << \ 
  • branches/active/view_performance/engine/core/view/camera.cpp

    r3037 r3098  
    232232                m_inverse_matrix = m_matrix.inverse(); 
    233233 
     234                m_vs_matrix.applyTranslate(0,0,0); 
    234235                m_vs_matrix.applyRotate(-m_rotation, 0.0, 0.0, 1.0); 
    235236                m_vs_matrix.applyRotate(-m_tilt, 1.0, 0.0, 0.0); 
    236237                m_vs_inverse_matrix = m_vs_matrix.inverse(); 
     238                FL_WARN(_log, LMsg("matrix: ") << m_matrix << " vs_matrix: " << m_vs_matrix); 
    237239        } 
    238240 
     
    267269         
    268270        ScreenPoint Camera::virtualScreenToScreen(const ScreenPoint& p) { 
    269                 Point3D pt = doublePt2intPt( m_matrix * (m_vs_inverse_matrix * intPt2doublePt(p))); 
     271                Point3D pt = p; 
     272                pt.z = 0; 
     273                pt = doublePt2intPt( m_matrix * (m_vs_inverse_matrix * intPt2doublePt(pt))); 
    270274                pt.x += m_viewport.w / 2; 
    271275                pt.y += m_viewport.h / 2; 
     276                pt.z = p.z; 
    272277                return pt; 
    273278        } 
     
    277282                pt.x -= m_viewport.w / 2; 
    278283                pt.y -= m_viewport.h / 2; 
    279                 return doublePt2intPt( m_vs_matrix * (m_inverse_matrix * intPt2doublePt(pt))); 
     284                pt.z = 0; 
     285                DoublePoint3D pt2 = m_inverse_matrix * intPt2doublePt(pt); 
     286                pt2.z = 0; 
     287                pt2 = m_vs_matrix * pt2; 
     288                pt2.z = p.z; 
     289                return doublePt2intPt(pt2); 
    280290        } 
    281291 
  • branches/active/view_performance/engine/core/view/layercache.cpp

    r3037 r3098  
    246246                        fullUpdate(); 
    247247 
    248                 bool m_updated = true; 
    249248                Point3D cammove = camera_update.getCameraMovement(); 
    250249                Point3D screen_delta = m_camera->getOrigin(); 
     
    252251 
    253252                Rect viewport = camera_update.getViewport(); 
    254  
     253                Rect screen_viewport = viewport; 
     254                Point3D viewport_a = m_camera->screenToVirtualScreen(Point3D(viewport.x, viewport.y)); 
     255                Point3D viewport_b = m_camera->screenToVirtualScreen(Point3D(viewport.x, viewport.bottom())); 
     256                Point3D viewport_c = m_camera->screenToVirtualScreen(Point3D(viewport.right(), viewport.y)); 
     257                Point3D viewport_d = m_camera->screenToVirtualScreen(Point3D(viewport.right(), viewport.bottom())); 
     258                viewport.x = std::min(std::min(viewport_a.x, viewport_b.x),  std::min(viewport_c.x, viewport_d.x)); 
     259                viewport.y = std::min(std::min(viewport_a.y, viewport_b.y),  std::min(viewport_c.y, viewport_d.y)); 
     260                viewport.w = std::max(std::max(viewport_a.x, viewport_b.x),  std::max(viewport_c.x, viewport_d.x)) - viewport.x; 
     261                viewport.h = std::max(std::max(viewport_a.y, viewport_b.y),  std::max(viewport_c.y, viewport_d.y)) - viewport.y; 
     262                 
     263                FL_LOG(_log, LMsg("camera-update viewport") << viewport); 
     264                 
    255265                std::vector<int> index_list; 
    256266                collect(viewport, index_list); 
     
    280290                        } 
    281291 
    282                         if(item.cache_item.dimensions.intersects(viewport)) 
     292                        if(item.cache_item.dimensions.intersects(screen_viewport)) 
    283293                                m_renderlist.push_back(item); 
    284294                } 
    285                 FL_LOG(_log, LMsg("camera-update ") << " N=" <<m_renderlist.size() << "/" << m_instances.size()); 
     295                FL_LOG(_log, LMsg("camera-update ") << " N=" <<m_renderlist.size() << "/" << m_instances.size() << "/" << index_list.size()); 
    286296        } 
    287297