Index: Horde3D/Bindings/C++/Horde3D.h =================================================================== --- Horde3D/Bindings/C++/Horde3D.h (revision 311) +++ Horde3D/Bindings/C++/Horde3D.h (working copy) @@ -593,6 +593,7 @@ ViewportHeightI - Height of the viewport rectangle (default: 240) OrthoI - Flag for setting up an orthographic frustum instead of a perspective one (default: 0) OccCullingI - Flag for enabling occlusion culling (default: 0) + LodBiasF - Distance bias value for LOD vaules contained in H3DModel nodes (default: 0) */ enum List { @@ -610,7 +611,8 @@ ViewportWidthI, ViewportHeightI, OrthoI, - OccCullingI + OccCullingI, + LodBiasF }; }; Index: Horde3D/Source/Horde3DEngine/egCamera.cpp =================================================================== --- Horde3D/Source/Horde3DEngine/egCamera.cpp (revision 311) +++ Horde3D/Source/Horde3DEngine/egCamera.cpp (working copy) @@ -37,6 +37,7 @@ _frustFar = cameraTpl.farPlane; _orthographic = cameraTpl.orthographic; _occSet = cameraTpl.occlusionCulling ? Modules::renderer().registerOccSet() : -1; + _lodBias = cameraTpl.lodBias; } @@ -98,6 +99,8 @@ else cameraTpl->occlusionCulling = false; } + itr = attribs.find( "lodBias" ); + if( itr != attribs.end() ) cameraTpl->lodBias = (float)atof( itr->second.c_str() ); if( !result ) { @@ -217,6 +220,8 @@ return _frustNear; case CameraNodeParams::FarPlaneF: return _frustFar; + case CameraNodeParams::LodBiasF: + return _lodBias; } return SceneNode::getParamF( param, compIdx ); @@ -251,6 +256,10 @@ _frustFar = value; markDirty(); return; + case CameraNodeParams::LodBiasF: + _lodBias = value; + markDirty(); + return; } SceneNode::setParamF( param, compIdx, value ); Index: Horde3D/Source/Horde3DEngine/egCamera.h =================================================================== --- Horde3D/Source/Horde3DEngine/egCamera.h (revision 311) +++ Horde3D/Source/Horde3DEngine/egCamera.h (working copy) @@ -44,7 +44,8 @@ ViewportWidthI, ViewportHeightI, OrthoI, - OccCullingI + OccCullingI, + LodBiasF }; }; @@ -60,6 +61,7 @@ int outputBufferIndex; bool orthographic; bool occlusionCulling; + float lodBias; CameraNodeTpl( const std::string &name, PipelineResource *pipelineRes ) : SceneNodeTpl( SceneNodeTypes::Camera, name ), pipeRes( pipelineRes ), @@ -67,7 +69,7 @@ // Default params: fov=45, aspect=4/3 leftPlane( -0.055228457f ), rightPlane( 0.055228457f ), bottomPlane( -0.041421354f ), topPlane( 0.041421354f ), nearPlane( 0.1f ), farPlane( 1000.0f ), outputBufferIndex( 0 ), - orthographic( false ), occlusionCulling( false ) + orthographic( false ), occlusionCulling( false ), lodBias( 0 ) { } }; @@ -110,6 +112,7 @@ int _outputBufferIndex; int _occSet; bool _orthographic; // Perspective or orthographic frustum? + float _lodBias; friend class SceneManager; friend class Renderer; Index: Horde3D/Source/Horde3DEngine/egModel.cpp =================================================================== --- Horde3D/Source/Horde3DEngine/egModel.cpp (revision 311) +++ Horde3D/Source/Horde3DEngine/egModel.cpp (working copy) @@ -441,10 +441,10 @@ } -uint32 ModelNode::calcLodLevel( const Vec3f &viewPoint ) +uint32 ModelNode::calcLodLevel( const Vec3f &viewPoint, float lodBias ) { Vec3f pos( _absTrans.c[3][0], _absTrans.c[3][1], _absTrans.c[3][2] ); - float dist = (pos - viewPoint).length(); + float dist = (pos - viewPoint).length() + lodBias; uint32 curLod = 4; if( dist < _lodDist1 ) curLod = 0; Index: Horde3D/Source/Horde3DEngine/egModel.h =================================================================== --- Horde3D/Source/Horde3DEngine/egModel.h (revision 311) +++ Horde3D/Source/Horde3DEngine/egModel.h (working copy) @@ -89,7 +89,7 @@ void setParamF( int param, int compIdx, float value ); bool updateGeometry(); - uint32 calcLodLevel( const Vec3f &viewPoint ); + uint32 calcLodLevel( const Vec3f &viewPoint, float lodBias ); GeometryResource *getGeometryResource() { return _geometryRes; } bool jointExists( uint32 jointIndex ) { return jointIndex < _skinMatRows.size() / 3; } Index: Horde3D/Source/Horde3DEngine/egScene.cpp =================================================================== --- Horde3D/Source/Horde3DEngine/egScene.cpp (revision 311) +++ Horde3D/Source/Horde3DEngine/egScene.cpp (working copy) @@ -350,8 +350,12 @@ Modules::sceneMan().updateNodes(); Vec3f camPos( frustum1.getOrigin() ); + float camLodBias = 0; if( Modules::renderer().getCurCamera() != 0x0 ) + { camPos = Modules::renderer().getCurCamera()->getAbsPos(); + camLodBias = Modules::renderer().getCurCamera()->getParamF( CameraNodeParams::LodBiasF, 0 ); + } // Clear without affecting capacity if( lightQueue ) _lightQueue.resize( 0 ); @@ -370,7 +374,7 @@ { if( node->_type == SceneNodeTypes::Mesh ) // TODO: Generalize and optimize this { - uint32 curLod = ((MeshNode *)node)->getParentModel()->calcLodLevel( camPos ); + uint32 curLod = ((MeshNode *)node)->getParentModel()->calcLodLevel( camPos, camLodBias ); if( ((MeshNode *)node)->getLodLevel() != curLod ) continue; }