Changeset 6109
- Timestamp:
- 02/07/07 17:32:14
- Files:
-
- OpenSceneGraph/trunk/include/osg/CullStack (modified) (2 diffs)
- OpenSceneGraph/trunk/include/osg/Transform (modified) (2 diffs)
- OpenSceneGraph/trunk/src/osg/CollectOccludersVisitor.cpp (modified) (1 diff)
- OpenSceneGraph/trunk/src/osg/CullStack.cpp (modified) (4 diffs)
- OpenSceneGraph/trunk/src/osg/Transform.cpp (modified) (1 diff)
- OpenSceneGraph/trunk/src/osgPlugins/osg/Transform.cpp (modified) (3 diffs)
- OpenSceneGraph/trunk/src/osgPlugins/txp/TXPNode.cpp (modified) (2 diffs)
- OpenSceneGraph/trunk/src/osgUtil/CullVisitor.cpp (modified) (3 diffs)
- OpenSceneGraph/trunk/src/osgUtil/IntersectVisitor.cpp (modified) (2 diffs)
- OpenSceneGraph/trunk/src/osgUtil/Optimizer.cpp (modified) (1 diff)
- OpenSceneGraph/trunk/src/osgUtil/SceneView.cpp (modified) (2 diffs)
Legend:
- Unmodified
- Added
- Removed
- Modified
- Copied
- Moved
OpenSceneGraph/trunk/include/osg/CullStack
r5821 r6109 19 19 #include <osg/Viewport> 20 20 #include <osg/fast_back_stack> 21 #include <osg/Transform> 21 22 22 23 namespace osg { … … 48 49 void popProjectionMatrix(); 49 50 50 void pushModelViewMatrix(osg::RefMatrix* matrix );51 void pushModelViewMatrix(osg::RefMatrix* matrix, Transform::ReferenceFrame referenceFrame); 51 52 void popModelViewMatrix(); 52 53 OpenSceneGraph/trunk/include/osg/Transform
r5757 r6109 91 91 { 92 92 RELATIVE_RF, 93 ABSOLUTE_RF 93 ABSOLUTE_RF, 94 ABSOLUTE_RF_INHERIT_VIEWPOINT 94 95 }; 95 96 … … 105 106 * absolute Transforms at the top of the scene, for such things as 106 107 * heads up displays. 108 * ABSOLUTE_RF_INHERIT_VIEWPOINT is the same as ABSOLUTE_RF except it 109 * adds the ability to use the parents view points position in world coordinates 110 * as its local viewpoint in the new coordinates frame. This is useful for 111 * Render to texture Cameras that wish to use the main views LOD range computation 112 * (which uses the viewpoint rather than the eye point) rather than use the local 113 * eye point defined by the this Transforms' abosolute view matrix. 107 114 */ 108 115 void setReferenceFrame(ReferenceFrame rf); OpenSceneGraph/trunk/src/osg/CollectOccludersVisitor.cpp
r5821 r6109 90 90 ref_ptr<osg::RefMatrix> matrix = createOrReuseMatrix(getModelViewMatrix()); 91 91 node.computeLocalToWorldMatrix(*matrix,this); 92 pushModelViewMatrix(matrix.get() );92 pushModelViewMatrix(matrix.get(), node.getReferenceFrame()); 93 93 94 94 handle_cull_callbacks_and_traverse(node); OpenSceneGraph/trunk/src/osg/CullStack.cpp
r5821 r6109 14 14 #include <osg/Timer> 15 15 16 #include <osg/Notify> 17 #include <osg/io_utils> 18 16 19 using namespace osg; 17 20 … … 188 191 } 189 192 190 void CullStack::pushModelViewMatrix(RefMatrix* matrix) 191 { 193 void CullStack::pushModelViewMatrix(RefMatrix* matrix, Transform::ReferenceFrame referenceFrame) 194 { 195 osg::RefMatrix* originalModelView = _modelviewStack.empty() ? 0 : _modelviewStack.back().get(); 196 192 197 _modelviewStack.push_back(matrix); 193 198 … … 197 202 inv.invert(*matrix); 198 203 199 _eyePointStack.push_back(inv.getTrans()); 200 _viewPointStack.push_back(getReferenceViewPoint() * inv); 204 205 switch(referenceFrame) 206 { 207 case(Transform::RELATIVE_RF): 208 _eyePointStack.push_back(inv.getTrans()); 209 _referenceViewPoints.push_back(getReferenceViewPoint()); 210 _viewPointStack.push_back(getReferenceViewPoint() * inv); 211 break; 212 case(Transform::ABSOLUTE_RF): 213 _eyePointStack.push_back(inv.getTrans()); 214 _referenceViewPoints.push_back(osg::Vec3(0.0,0.0,0.0)); 215 _viewPointStack.push_back(_eyePointStack.back()); 216 break; 217 case(Transform::ABSOLUTE_RF_INHERIT_VIEWPOINT): 218 { 219 _eyePointStack.push_back(inv.getTrans()); 220 221 osg::Vec3 referenceViewPoint = getReferenceViewPoint(); 222 if (originalModelView) 223 { 224 osg::Matrix viewPointTransformMatrix; 225 viewPointTransformMatrix.invert(*originalModelView); 226 viewPointTransformMatrix.postMult(*matrix); 227 referenceViewPoint = referenceViewPoint * viewPointTransformMatrix; 228 } 229 230 _referenceViewPoints.push_back(referenceViewPoint); 231 _viewPointStack.push_back(getReferenceViewPoint() * inv); 232 break; 233 } 234 } 201 235 202 236 … … 216 250 217 251 _eyePointStack.pop_back(); 252 _referenceViewPoints.pop_back(); 218 253 _viewPointStack.pop_back(); 219 254 OpenSceneGraph/trunk/src/osg/Transform.cpp
r5757 r6109 69 69 const osg::Camera* camera = dynamic_cast<const osg::Camera*>(*ritr); 70 70 if (camera && 71 (camera->getReferenceFrame() ==osg::Transform::ABSOLUTE_RF || camera->getParents().empty()))71 (camera->getReferenceFrame()!=osg::Transform::RELATIVE_RF || camera->getParents().empty())) 72 72 { 73 73 break; OpenSceneGraph/trunk/src/osgPlugins/osg/Transform.cpp
r3776 r6109 51 51 if (fr[0].matchWord("referenceFrame")) 52 52 { 53 if (fr[1].matchWord("RELATIVE_TO_ABSOLUTE") || fr[1].matchWord("ABSOLUTE") )53 if (fr[1].matchWord("RELATIVE_TO_ABSOLUTE") || fr[1].matchWord("ABSOLUTE") || fr[1].matchWord("ABSOLUTE_RF")) 54 54 { 55 55 transform.setReferenceFrame(Transform::ABSOLUTE_RF); … … 57 57 iteratorAdvanced = true; 58 58 } 59 if (fr[1].matchWord("RELATIVE_TO_PARENTS") || fr[1].matchWord("RELATIVE")) 59 if (fr[1].matchWord("RELATIVE_TO_ABSOLUTE") || fr[1].matchWord("ABSOLUTE_RF_INHERIT_VIEWPOINT") ) 60 { 61 transform.setReferenceFrame(Transform::ABSOLUTE_RF_INHERIT_VIEWPOINT); 62 fr += 2; 63 iteratorAdvanced = true; 64 } 65 if (fr[1].matchWord("RELATIVE_TO_PARENTS") || fr[1].matchWord("RELATIVE") || fr[1].matchWord("RELATIVE_RF")) 60 66 { 61 67 transform.setReferenceFrame(Transform::RELATIVE_RF); … … 79 85 fw << "ABSOLUTE\n"; 80 86 break; 87 case Transform::ABSOLUTE_RF_INHERIT_VIEWPOINT: 88 fw << "ABSOLUTE_RF_INHERIT_VIEWPOINT\n"; 89 break; 81 90 case Transform::RELATIVE_RF: 82 91 default: OpenSceneGraph/trunk/src/osgPlugins/txp/TXPNode.cpp
r5188 r6109 104 104 osg::ref_ptr<TileMapper> tileMapper = new TileMapper; 105 105 tileMapper->setLODScale(cv->getLODScale()); 106 tileMapper->pushReferenceViewPoint(cv->getReferenceViewPoint()); 106 107 tileMapper->pushViewport(cv->getViewport()); 107 108 tileMapper->pushProjectionMatrix(&(cv->getProjectionMatrix())); 108 tileMapper->pushModelViewMatrix(&(cv->getModelViewMatrix()) );109 tileMapper->pushModelViewMatrix(&(cv->getModelViewMatrix()), osg::Transform::RELATIVE_RF); 109 110 110 111 // traverse the scene graph to search for valid tiles … … 114 115 tileMapper->popProjectionMatrix(); 115 116 tileMapper->popViewport(); 117 tileMapper->popReferenceViewPoint(); 116 118 117 119 //std::cout<<" found " << tileMapper._tileMap.size() << std::endl; OpenSceneGraph/trunk/src/osgUtil/CullVisitor.cpp
r6086 r6109 962 962 ref_ptr<RefMatrix> matrix = createOrReuseMatrix(getModelViewMatrix()); 963 963 node.computeLocalToWorldMatrix(*matrix,this); 964 pushModelViewMatrix(matrix.get() );964 pushModelViewMatrix(matrix.get(), node.getReferenceFrame()); 965 965 966 966 handle_cull_callbacks_and_traverse(node); … … 1118 1118 osg::RefMatrix* modelview = 0; 1119 1119 1120 if (camera.getReferenceFrame()==osg::Transform::ABSOLUTE_RF) 1121 { 1120 if (camera.getReferenceFrame()==osg::Transform::RELATIVE_RF) 1121 { 1122 if (camera.getTransformOrder()==osg::Camera::POST_MULTIPLY) 1123 { 1124 projection = createOrReuseMatrix(getProjectionMatrix()*camera.getProjectionMatrix()); 1125 modelview = createOrReuseMatrix(getModelViewMatrix()*camera.getViewMatrix()); 1126 } 1127 else // pre multiply 1128 { 1129 projection = createOrReuseMatrix(camera.getProjectionMatrix()*getProjectionMatrix()); 1130 modelview = createOrReuseMatrix(camera.getViewMatrix()*getModelViewMatrix()); 1131 } 1132 } 1133 else 1134 { 1135 // an absolute reference frame 1122 1136 projection = createOrReuseMatrix(camera.getProjectionMatrix()); 1123 1137 modelview = createOrReuseMatrix(camera.getViewMatrix()); 1124 1138 } 1125 else if (camera.getTransformOrder()==osg::Camera::POST_MULTIPLY) 1126 { 1127 projection = createOrReuseMatrix(getProjectionMatrix()*camera.getProjectionMatrix()); 1128 modelview = createOrReuseMatrix(getModelViewMatrix()*camera.getViewMatrix()); 1129 } 1130 else // pre multiply 1131 { 1132 projection = createOrReuseMatrix(camera.getProjectionMatrix()*getProjectionMatrix()); 1133 modelview = createOrReuseMatrix(camera.getViewMatrix()*getModelViewMatrix()); 1134 } 1135 1136 1137 bool localReferenceViewPoint = true; 1138 if (localReferenceViewPoint) 1139 { 1140 // put the reference view point into the new camera eye coordinates 1141 osg::Vec3 referenceViewPoint = getReferenceViewPoint(); 1142 if (originalModelView.valid()) 1143 { 1144 osg::Matrix matrix; 1145 matrix.invert(originalModelView); // note should this be view.getCamera()->getViewMatrix() ?? 1146 matrix.postMult(*modelview); 1147 referenceViewPoint = referenceViewPoint * matrix; 1148 } 1149 pushReferenceViewPoint(referenceViewPoint); 1150 } 1139 1151 1140 1152 1141 pushProjectionMatrix(projection); 1153 pushModelViewMatrix(modelview );1142 pushModelViewMatrix(modelview, camera.getReferenceFrame()); 1154 1143 1155 1144 … … 1278 1267 1279 1268 } 1280 1281 if (localReferenceViewPoint)1282 {1283 // restore the previous reference view point1284 popReferenceViewPoint();1285 }1286 1269 1287 1270 // restore the previous model view matrix. OpenSceneGraph/trunk/src/osgUtil/IntersectVisitor.cpp
r5757 r6109 805 805 if (!camera.isRenderToTextureCamera()) 806 806 { 807 if (camera.getReferenceFrame()==osg::Camera::ABSOLUTE_RF) 807 if (camera.getReferenceFrame()==osg::Camera::RELATIVE_RF) 808 { 809 if (camera.getTransformOrder()==osg::Camera::POST_MULTIPLY) 810 { 811 runNestedPickVisitor( camera, 812 camera.getViewport() ? camera.getViewport() : _lastViewport.get(), 813 _lastProjectionMatrix * camera.getProjectionMatrix(), 814 _lastViewMatrix * camera.getViewMatrix(), 815 _mx, _my ); 816 } 817 else // PRE_MULTIPLY 818 { 819 runNestedPickVisitor( camera, 820 camera.getViewport() ? camera.getViewport() : _lastViewport.get(), 821 camera.getProjectionMatrix() * _lastProjectionMatrix, 822 camera.getViewMatrix() * _lastViewMatrix, 823 _mx, _my ); 824 } 825 } 826 else 808 827 { 809 828 runNestedPickVisitor( camera, … … 813 832 _mx, _my ); 814 833 } 815 else if (camera.getTransformOrder()==osg::Camera::POST_MULTIPLY) 816 { 817 runNestedPickVisitor( camera, 818 camera.getViewport() ? camera.getViewport() : _lastViewport.get(), 819 _lastProjectionMatrix * camera.getProjectionMatrix(), 820 _lastViewMatrix * camera.getViewMatrix(), 821 _mx, _my ); 822 } 823 else // PRE_MULTIPLY 824 { 825 runNestedPickVisitor( camera, 826 camera.getViewport() ? camera.getViewport() : _lastViewport.get(), 827 camera.getProjectionMatrix() * _lastProjectionMatrix, 828 camera.getViewMatrix() * _lastViewMatrix, 829 _mx, _my ); 830 } 831 } 832 } 834 } 835 } OpenSceneGraph/trunk/src/osgUtil/Optimizer.cpp
r6088 r6109 790 790 { 791 791 if (transform->getDataVariance()==osg::Transform::DYNAMIC) _moreThanOneMatrixRequired=true; 792 else if (transform->getReferenceFrame() ==osg::Transform::ABSOLUTE_RF) _moreThanOneMatrixRequired=true;792 else if (transform->getReferenceFrame()!=osg::Transform::RELATIVE_RF) _moreThanOneMatrixRequired=true; 793 793 else 794 794 { OpenSceneGraph/trunk/src/osgUtil/SceneView.cpp
r6084 r6109 660 660 _collectOccludersVisistor->pushViewport(getViewport()); 661 661 _collectOccludersVisistor->pushProjectionMatrix(proj.get()); 662 _collectOccludersVisistor->pushModelViewMatrix(mv.get() );662 _collectOccludersVisistor->pushModelViewMatrix(mv.get(),osg::Transform::ABSOLUTE_RF); 663 663 664 664 // traverse the scene graph to search for occluder in there new positions. … … 737 737 cullVisitor->pushViewport(getViewport()); 738 738 cullVisitor->pushProjectionMatrix(proj.get()); 739 cullVisitor->pushModelViewMatrix(mv.get() );739 cullVisitor->pushModelViewMatrix(mv.get(),osg::Transform::ABSOLUTE_RF); 740 740 741 741
