/** \brief virtual function to load node to KeyedArchive */ void LodNode::Load(KeyedArchive * archive, SceneFileV2 * sceneFile) { Entity::Load(archive, sceneFile); int32 lodCount = archive->GetInt32("lodCount", 0); for (int32 lodIdx = 0; lodIdx < lodCount; ++lodIdx) { int32 layer = archive->GetInt32(Format("lod%d_layer", lodIdx), 0); size_t size = archive->GetInt32(Format("lod%d_cnt", lodIdx), 0); //TODO: why size_t? int32? if (size > 0) { for (size_t idx = 0; idx < size; ++idx) { int32 index = archive->GetInt32(Format("l%d_%d_ni", lodIdx, idx), 0); RegisterIndexInLayer(index, layer); } } else { RegisterIndexInLayer(-1, layer); } float32 distance = archive->GetFloat(Format("lod%d_dist", lodIdx), GetDefaultDistance(lodIdx)); if(INVALID_DISTANCE == distance) { // TemporaryFix. Remove it after all objects would be fixed. distance = GetDefaultDistance(lodIdx); } SetLodLayerDistance(lodIdx, distance); } }
LodComponent::LodComponent() : forceLodLayer(INVALID_LOD_LAYER), forceDistance(INVALID_DISTANCE), forceDistanceSq(INVALID_DISTANCE) { lodLayersArray.resize(MAX_LOD_LAYERS); flags = NEED_UPDATE_AFTER_LOAD; for(int32 iLayer = 0; iLayer < MAX_LOD_LAYERS; ++iLayer) { lodLayersArray[iLayer].SetDistance(GetDefaultDistance(iLayer)); lodLayersArray[iLayer].SetFarDistance(MAX_LOD_DISTANCE * 2); } lodLayersArray[0].SetNearDistance(0.0f); }
LodNode::LodNode() : Entity() , currentLod(NULL) , lastLodUpdateFrame(0) , forceLodLayer(INVALID_LOD_LAYER) , forceDistance(INVALID_DISTANCE) , forceDistanceSq(INVALID_DISTANCE) { for(int32 iLayer = 0; iLayer < MAX_LOD_LAYERS; ++iLayer) { SetLodLayerDistance(iLayer, GetDefaultDistance(iLayer)); } // lodLayersArray[0].SetDistance(0.0f); lodLayersArray[0].SetNearDistance(0.0f); }