www.pudn.com > GPUVision_5-13-05-2.zip > GausPyramid.cpp


#include "GausPyramid.h" 
 
static float gkernel3_3[9] = {.0625, .125, .0625, .125, .25, .125, .0625, .125, .0625}; 
static float _gauss5xKernel[5] = {.1.25,.2,.3.5,.2,.1.25}; 
 
GausPyramid::GausPyramid(CGcontext context,GPUVision *level0, int numLevels, float divisor){ 
	_divisor = divisor; 
	if(divisor == 3) { 
		_gauss5x5h = new ConvolutionFilter(_gauss5xKernel,5,1,3,context); 
		_gauss5x5v = new ConvolutionFilter(_gauss5xKernel,1,5,3,context); 
	} else { 
		_gauss3x3Kernel = new ConvolutionFilter(gkernel3_3,3,3,3); 
	} 
//	_laplacian = new Laplacian(context); 
	if(numLevels == 0) numLevels = 1; 
	int i; 
	int totLevels = 1; 
	int width = level0->GetWidth(); 
	int height = level0->GetHeight(); 
	for(i = 1; i < numLevels; i++) { 
		width = width/divisor; 
		height = height/divisor; 
		if(width == 0 || height == 0) { 
			break; 
		} 
		totLevels++; 
	} 
 
	_numLevels = totLevels; 
	_levels = (GPUVision**)new int[_numLevels]; 
	_levels[0] = level0->Copy(); 
 
	unsigned int *textureIDs = new unsigned int[_numLevels-1]; 
	glGenTextures(_numLevels-1,textureIDs); 
 
	width = level0->GetWidth(); 
	height = level0->GetHeight(); 
	bool destroy = false; 
	for(i = 1; i < _numLevels; i++) { 
		width = width/_divisor; 
		height = height/_divisor; 
		if(!destroy && (width == 0 || height == 0)) { 
			_numLevels = i-1; 
			destroy = true; 
		} 
		if(destroy) { 
			glDeleteTextures(1,&textureIDs[i-1]); 
		} else { 
			GPUVision *prevLevel = _levels[i-1]; 
			GPUVision *nextLevel = new GPUVision(textureIDs[i-1],width,height); 
			_levels[i] = nextLevel; 
			if(divisor == 3) { 
				prevLevel->Begin(); 
				_gauss5x5h->applyFilter(prevLevel); 
				nextLevel->Begin(prevLevel); 
				_gauss5x5v->applyFilter(prevLevel,nextLevel); 
			} else { 
				nextLevel->Begin(); 
				_gauss3x3Kernel->applyFilter(prevLevel,nextLevel); 
			} 
//			nextLevel->Flip(); 
			nextLevel->CopyRenderedToSource(); 
			nextLevel->End(); 
			nextLevel->Reset(); 
			prevLevel->Reset(); 
		} 
	} 
} 
GausPyramid::~GausPyramid(){ 
	for(int i = 0; i < _numLevels; i++) { 
		delete _levels[i]; 
	} 
	delete _levels; 
	delete _gauss3x3Kernel; 
//	delete _gauss5x5h; 
//	delete _gauss5x5v; 
 
} 
void GausPyramid::Level0Updated() { 
	GPUVision *level0 = _levels[0]; 
 
	int width = level0->GetWidth(); 
	int height = level0->GetHeight(); 
	for(int i = 1; i < _numLevels; i++) { 
		GPUVision *prevLevel = _levels[i-1]; 
		GPUVision *nextLevel = _levels[i]; 
		width = nextLevel->GetWidth(); 
		height = nextLevel->GetHeight(); 
		nextLevel->Reset(); 
		prevLevel->Reset(); 
		if(_divisor == 3) { 
			prevLevel->Begin(); 
			_gauss5x5h->applyFilter(prevLevel); 
			nextLevel->Begin(prevLevel); 
			_gauss5x5v->applyFilter(prevLevel,nextLevel); 
		} else { 
			nextLevel->Begin(); 
			_gauss3x3Kernel->applyFilter(prevLevel,nextLevel); 
		} 
//		nextLevel->Flip(); 
		nextLevel->CopyRenderedToSource(); 
		nextLevel->End(); 
//		nextLevel->Reset(); 
//		_laplacian->laplacian(nextLevel); 
		nextLevel->Reset(); 
		prevLevel->Reset(); 
	} 
}