             eavlExecutor::Go();
             if(verbose) cout << "occRayGen   RUNTIME: "<<eavlTimer::Stop(toccGen,"occGen")<<endl;
             int toccInt = eavlTimer::Start(); 
-            eavlExecutor::AddOperation(new_eavlMapOp(eavlOpArgs(eavlIndexable<eavlFloatArray>(occX),
-                                                                eavlIndexable<eavlFloatArray>(occY),
-                                                                eavlIndexable<eavlFloatArray>(occZ),
-                                                                eavlIndexable<eavlFloatArray>(interX, *occIndexer),
-                                                                eavlIndexable<eavlFloatArray>(interY, *occIndexer),
-                                                                eavlIndexable<eavlFloatArray>(interZ, *occIndexer),
-                                                                eavlIndexable<eavlIntArray>  (hitIdx, *occIndexer)),
-                                                     eavlOpArgs(localHits),
-                                                     occIntersectFunctor(vertsTex,bvhTex,bvhLeafsTex,aoMax)),
-                                                     "occIntercept");
+            
+            occlusionIntersect();
             
             eavlExecutor::Go();
     

        minHit = getIntersectionTri(ray, rayOrigin, false,bvh,bvhLeafs, verts,maxDistance,distance);
    
        if(minHit!=-1) return tuple<int,float,int>(minHit, distance, TRIANGLE);
        else           return tuple<int,float,int>(-1, INFINITE, get<7>(rayTuple));
    }
};


                                             RayIntersectFunctor(vertsTex,bvhTex,bvhLeafsTex,TRIANGLE)),
                                                                                                    "intersect");
    eavlExecutor::Go();


    eavlExecutor::AddOperation(new_eavlMapOp(eavlOpArgs(hitIdx),                /*On primary ray: hits some in as -2, and leave as -1 if it misses everything*/
                                             eavlOpArgs(hitIdx),                /*This allows dead rays to be filtered out on multiple bounces */
                                             HitFilterFunctor()),
                                             "Hit Filter");
    eavlExecutor::Go();
}

void eavlRayTracerMutator::occlusionIntersect()
{
    eavlExecutor::AddOperation(new_eavlMapOp(eavlOpArgs(localHits), //dummy arg
                                             eavlOpArgs(localHits),
                                             FloatMemsetFunctor(0.f)),
                                             "memset");
    eavlExecutor::Go();

    eavlExecutor::AddOperation(new_eavlMapOp(eavlOpArgs(eavlIndexable<eavlFloatArray>(occX),
                                                        eavlIndexable<eavlFloatArray>(occY),
                                                        eavlIndexable<eavlFloatArray>(occZ),
                                                        eavlIndexable<eavlFloatArray>(interX, *occIndexer),
                                                        eavlIndexable<eavlFloatArray>(interY, *occIndexer),
                                                        eavlIndexable<eavlFloatArray>(interZ, *occIndexer),
                                                        eavlIndexable<eavlIntArray>  (hitIdx, *occIndexer),
                                                        eavlIndexable<eavlFloatArray>(localHits)),
                                             eavlOpArgs(localHits),
                                             occIntersectFunctor(vertsTex,bvhTex,bvhLeafsTex,aoMax, TRIANGLE)),
                                             "occIntercept");
            
    eavlExecutor::Go();
}

void eavlRayTracerMutator::Execute()
