//--------------------------------------------------------------
	void ftFluidSimulation::reset() {
		
		densitySwapBuffer.clear();
		velocitySwapBuffer.clear();
		temperatureSwapBuffer.clear();
		createEdgeImage(obstacleBuffer);
		combinedObstacleNeedsToBeCleaned = true;
	}
	//--------------------------------------------------------------
	void ftFluidSimulation::setup(int _simulationWidth, int _simulationHeight, int _densityWidth, int _densityHeight, bool doFasterInternalFormat) {
		simulationWidth = _simulationWidth;
		simulationHeight = _simulationHeight;
		densityWidth = (!_densityWidth)? simulationWidth : _densityWidth;
		densityHeight = (!_densityHeight)? simulationHeight: _densityHeight;
		
		int internalFormatDensity, internalFormatVelocity, interformatPressure, internalFormatObstacle;
		if (doFasterInternalFormat) {	 // This gives errors with ofGLUtils, but it runs around 15% faster.
			internalFormatDensity = GL_RGBA32F;
			internalFormatVelocity = GL_RG32F;
			interformatPressure = GL_R32F;
			internalFormatObstacle = GL_RED;
			
		}
		else {							 // This gives no errors
			internalFormatDensity = GL_RGBA32F;
			internalFormatVelocity = GL_RGBA32F;
			interformatPressure = GL_RGBA32F;
			internalFormatObstacle = GL_RGB;
		}
		densitySwapBuffer.allocate(densityWidth,densityHeight,internalFormatDensity);
		densitySwapBuffer.clear();
		velocitySwapBuffer.allocate(simulationWidth,simulationHeight,internalFormatVelocity);
		velocitySwapBuffer.clear();
		temperatureSwapBuffer.allocate(simulationWidth,simulationHeight,interformatPressure);
		//		temperatureSwapBuffer.clear(ambientTemperature.get());
		temperatureSwapBuffer.clear();
		pressureSwapBuffer.allocate(simulationWidth,simulationHeight,interformatPressure);
		
		obstacleBuffer.allocate(simulationWidth, simulationHeight, internalFormatObstacle);
		obstacleBuffer.clear();
		createEdgeImage(obstacleBuffer);
		
		divergenceBuffer.allocate(simulationWidth, simulationHeight, internalFormatVelocity);
		smokeBuoyancyBuffer.allocate(simulationWidth, simulationHeight, internalFormatVelocity);
		smokeBuoyancyBuffer.clear();
		vorticityFirstPassBuffer.allocate(simulationWidth, simulationHeight, internalFormatVelocity);
		vorticitySecondPassBuffer.allocate(simulationWidth, simulationHeight, internalFormatVelocity);
		addPressureBuffer.allocate(simulationWidth, simulationHeight, interformatPressure);
		addPressureBufferDidChange = false;
		addTempObstacleBuffer.allocate(simulationWidth, simulationHeight, internalFormatObstacle);
		addTempObstacleBuffer.clear();
		addTempObstacleBufferDidChange = false;
		combinedObstacleBuffer.allocate(simulationWidth, simulationHeight, internalFormatObstacle);
		combinedObstacleBuffer.clear();
		combinedObstacleBuffer.scaleIntoMe(obstacleBuffer);
		
		deltaTime = 0;
		lastTime = 0;
		addTempObstacleBufferDidChange = true;
		
	}
	//--------------------------------------------------------------
	void ftFluidSimulation::setup(int _simulationWidth, int _simulationHeight, int _densityWidth, int _densityHeight) {
		simulationWidth = _simulationWidth;
		simulationHeight = _simulationHeight;
		densityWidth = (!_densityWidth)? simulationWidth : _densityWidth;
		densityHeight = (!_densityHeight)? simulationHeight: _densityHeight;
		
		int	internalFormatDensity = GL_RGBA32F;
		int	internalFormatVelocity = GL_RG32F;
		int	interformatPressure = GL_R32F;
		int	internalFormatObstacle = GL_R8;
			
		densitySwapBuffer.allocate(densityWidth,densityHeight,internalFormatDensity);
		densitySwapBuffer.black();
		velocitySwapBuffer.allocate(simulationWidth,simulationHeight,internalFormatVelocity);
		velocitySwapBuffer.black();
		temperatureSwapBuffer.allocate(simulationWidth,simulationHeight,interformatPressure);
		//		temperatureSwapBuffer.clear(ambientTemperature.get());
		temperatureSwapBuffer.black();
		pressureSwapBuffer.allocate(simulationWidth,simulationHeight,interformatPressure);
		
		obstacleBuffer.allocate(simulationWidth, simulationHeight, internalFormatObstacle);
		obstacleBuffer.black();
		createEdgeImage(obstacleBuffer);
		
		divergenceBuffer.allocate(simulationWidth, simulationHeight, interformatPressure);
		smokeBuoyancyBuffer.allocate(simulationWidth, simulationHeight, internalFormatVelocity);
		smokeBuoyancyBuffer.black();
		vorticityFirstPassBuffer.allocate(simulationWidth, simulationHeight, internalFormatVelocity);
		vorticitySecondPassBuffer.allocate(simulationWidth, simulationHeight, internalFormatVelocity);
		addPressureBuffer.allocate(simulationWidth, simulationHeight, interformatPressure);
		addPressureBufferDidChange = false;
		addTempObstacleBuffer.allocate(simulationWidth, simulationHeight, internalFormatObstacle);
		addTempObstacleBuffer.black();
		addTempObstacleBufferDidChange = false;
		combinedObstacleBuffer.allocate(simulationWidth, simulationHeight, internalFormatObstacle);
		combinedObstacleBuffer.black();
		combinedObstacleBuffer.stretchIntoMe(obstacleBuffer);
		
		deltaTime = 0;
		lastTime = 0;
		addTempObstacleBufferDidChange = true;
		
	}
	//--------------------------------------------------------------
	void ftFluidSimulation::resetBackground() {
		obstacleBuffer.clear();
		createEdgeImage(obstacleBuffer);
		combinedObstacleNeedsToBeCleaned = true;
	}