is there any method in vtk to highlight camera view or visible faces ?

Basically , I am trying to use the given code to highlight the camera view faces ,but it is only culling the back faces, It’s also highlighting the hidden faces which is not expected .Here below is my code .can you help me to figure it out ?

#include <vtkSmartPointer.h>
#include <vtkSTLReader.h>
#include <vtkPolyDataMapper.h>
#include <vtkActor.h>
#include <vtkProperty.h>
#include <vtkRenderWindow.h>
#include <vtkRenderer.h>
#include <vtkRenderWindowInteractor.h>
#include <vtkCamera.h>
#include <vtkPolyDataNormals.h>
#include <vtkUnsignedCharArray.h>
#include <vtkCellData.h>
#include <vtkMath.h>
#include <vtkCommand.h>
#include <vtkObjectFactory.h>
#include
#include <vtkInteractorStyleTrackballCamera.h>
#include <vtkPolyData.h>
#include <vtkRendererCollection.h>
#include <vtkAutoInit.h>
#include <vtkDataSetSurfaceFilter.h>
#include <vtkSelectVisiblePoints.h>
#include <vtkOctreePointLocator.h>
#include
#include <unordered_set>

VTK_MODULE_INIT(vtkRenderingOpenGL2);
VTK_MODULE_INIT(vtkInteractionStyle);

class KeyPressInteractorStyle : public vtkInteractorStyleTrackballCamera {
public:
static KeyPressInteractorStyle* New();
vtkTypeMacro(KeyPressInteractorStyle, vtkInteractorStyleTrackballCamera);

virtual void OnKeyPress() override {
    vtkRenderWindowInteractor* rwi = this->Interactor;
    std::string key = rwi->GetKeySym();

    if (key == "v") {
        vtkSmartPointer<vtkRenderer> renderer = rwi->GetRenderWindow()->GetRenderers()->GetFirstRenderer();
        vtkSmartPointer<vtkDataSetSurfaceFilter> surfaceFilter = vtkSmartPointer<vtkDataSetSurfaceFilter>::New();
        surfaceFilter->SetInputConnection(reader->GetOutputPort());
        surfaceFilter->Update();
        vtkSmartPointer<vtkSelectVisiblePoints> visiblePointsFilter = vtkSmartPointer<vtkSelectVisiblePoints>::New();
        visiblePointsFilter->SetInputConnection(surfaceFilter->GetOutputPort());
        visiblePointsFilter->SetRenderer(renderer);
        visiblePointsFilter->Update();

        vtkSmartPointer<vtkPolyData> visiblePoints = vtkSmartPointer<vtkPolyData>::New();
        visiblePoints->ShallowCopy(visiblePointsFilter->GetOutput());

        vtkSmartPointer<vtkOctreePointLocator> octree = vtkSmartPointer<vtkOctreePointLocator>::New();
        octree->SetDataSet(visiblePoints);
        octree->BuildLocator();

        vtkSmartPointer<vtkCamera> camera = renderer->GetActiveCamera();

        vtkSmartPointer<vtkPolyDataNormals> normals = vtkSmartPointer<vtkPolyDataNormals>::New();
        normals->SetInputConnection(reader->GetOutputPort());
        normals->ComputeCellNormalsOn();
        normals->Update();

        vtkSmartPointer<vtkPolyData> polyData = normals->GetOutput();
        vtkSmartPointer<vtkDataArray> cellNormals = polyData->GetCellData()->GetNormals();

        vtkSmartPointer<vtkUnsignedCharArray> cellColors = vtkSmartPointer<vtkUnsignedCharArray>::New();
        cellColors->SetNumberOfComponents(3);
        cellColors->SetName("CellColors");

        double camPos[3], camFocalPoint[3], camNormal[3];
        camera->GetPosition(camPos);
        camera->GetFocalPoint(camFocalPoint);

        for (int i = 0; i < 3; ++i) {
            camNormal[i] = camFocalPoint[i] - camPos[i];
        }

        std::vector<int> triangleIds;
        double normal[3];
        for (vtkIdType i = 0; i < cellNormals->GetNumberOfTuples(); ++i) {
            cellNormals->GetTuple(i, normal);

            double dotProduct = vtkMath::Dot(camNormal, normal);

            if (dotProduct <= 0) 
            {
                vtkSmartPointer<vtkIdList> pointIds = vtkSmartPointer<vtkIdList>::New();
                polyData->GetCellPoints(i, pointIds);
                bool hasVisiblePoint = false;

                for (vtkIdType j = 0; j < pointIds->GetNumberOfIds(); ++j) {
                    vtkIdType closestPointId = octree->FindClosestPoint(polyData->GetPoint(pointIds->GetId(j)));
                    double closestPoint[3], originalPoint[3];
                    visiblePoints->GetPoint(closestPointId, closestPoint);
                    polyData->GetPoint(pointIds->GetId(j), originalPoint);

                    if (vtkMath::Distance2BetweenPoints(closestPoint, originalPoint) < 1e-15) {
                        hasVisiblePoint = true;
                        break;
                    }
                }

                if (visiblePointsFilter) {
                    cellColors->InsertNextTuple3(0, 255, 0);
                    triangleIds.push_back(i);
                }
                else {
                    cellColors->InsertNextTuple3(255, 255, 255);
                }
            }
            else {
                cellColors->InsertNextTuple3(255, 255, 255);
            }
        }

        polyData->GetCellData()->SetScalars(cellColors);
        vtkPolyDataMapper::SafeDownCast(mapper.GetPointer())->SetInputData(polyData);

        rwi->Render();
    }

    vtkInteractorStyleTrackballCamera::OnKeyPress();
}

vtkSmartPointer<vtkSTLReader> reader;
vtkSmartPointer<vtkPolyDataMapper> mapper = vtkSmartPointer<vtkPolyDataMapper>::New();

};

vtkStandardNewMacro(KeyPressInteractorStyle);

int main() {
std::string inputFilename = “C:\Users\vipul.k\Desktop\Engine_Mount_Bracket_Optimized_Model.stl”;

vtkSmartPointer<vtkSTLReader> reader = vtkSmartPointer<vtkSTLReader>::New();
reader->SetFileName(inputFilename.c_str());

vtkSmartPointer<vtkPolyDataMapper> mapper = vtkSmartPointer<vtkPolyDataMapper>::New();
mapper->SetInputConnection(reader->GetOutputPort());

vtkSmartPointer<vtkActor> actor = vtkSmartPointer<vtkActor>::New();
actor->SetMapper(mapper);

vtkSmartPointer<vtkCamera> camera = vtkSmartPointer<vtkCamera>::New();
camera->SetPosition(0, 0, 10);
camera->SetFocalPoint(0, 0, 0);
camera->SetParallelProjection(1); // Enable orthographic projection

vtkSmartPointer<vtkRenderer> renderer = vtkSmartPointer<vtkRenderer>::New();
renderer->AddActor(actor);
renderer->SetActiveCamera(camera);
renderer->ResetCamera();
renderer->SetBackground(0.1, 0.1, 0.1);

vtkSmartPointer<vtkRenderWindow> renderWindow = vtkSmartPointer<vtkRenderWindow>::New();
renderWindow->AddRenderer(renderer);
renderWindow->SetSize(800, 800);

vtkSmartPointer<vtkRenderWindowInteractor> renderWindowInteractor = vtkSmartPointer<vtkRenderWindowInteractor>::New();
renderWindowInteractor->SetRenderWindow(renderWindow);

vtkSmartPointer<KeyPressInteractorStyle> style = vtkSmartPointer<KeyPressInteractorStyle>::New();
style->reader = reader;
style->mapper = mapper;
renderWindowInteractor->SetInteractorStyle(style);

renderWindowInteractor->Initialize();
renderWindowInteractor->Start();

return EXIT_SUCCESS;

}