Point2 projectPoint (Point3 &src, Matrix4 &viewMatrix, PointSolver2::Projector &projectionMatrix, Point3 &pointInCam)
{
	Point4 src4 (src.x(), src.y(), src.z(), 1);
	Point4 pcam = viewMatrix * src4;
	pointInCam = pcam.head(3);
	return projectionMatrix * pcam;
}
Example #2
0
void ModelEntity::updateLocation(const Point4& location)
{
	this->translateX = location.getX();
	this->translateY = location.getY();
	this->translateZ = location.getZ();

	updateMetrics();

	updateBoundingSphereCenter(true);
}
Example #3
0
void ModelEntity::setPosition(const Point4& position)
{
	this->translateX = position.getX();
	this->translateY = position.getY();
	this->translateZ = position.getZ();

	this->position = position;

	updateMetrics();

	updateBoundingSphereCenter(true);
}
Example #4
0
void ModelEntity::updateLocationOrientation(const Point4& location, const Quaternion& orientation)
{
	this->translateX = location.getX();
	this->translateY = location.getY();
	this->translateZ = location.getZ();
	this->rotation = orientation;

	this->updateNormalModelMatrix = true;

	updateMetrics();

	updateBoundingSphereCenter(true);
}
Example #5
0
void DebugDraw::draw(const Plane& plane, const Point4& origin, const Color& color) const
{
	Matrix4x4 modelMatrix;

	if (!LineGeometryManager::getInstance()->getLineGeometry("GridPlane").get())
	{
		return;
	}

	float x = -plane.getPlane()[0] * plane.getPlane()[3] + origin.getX();
	float y = -plane.getPlane()[1] * plane.getPlane()[3] + origin.getY();
	float z = -plane.getPlane()[2] * plane.getPlane()[3] + origin.getZ();

	modelMatrix.identity();
	modelMatrix.translate(x, y, z);
	modelMatrix.rotateRzRyRx(0.0f, plane.getPlane()[0] * 90.0f, plane.getPlane()[1] * -90.0f);

	LineGeometryManager::getInstance()->getLineGeometry("GridPlane")->draw(modelMatrix, color);
}
Example #6
0
void ModelEntity::setMetrics(const Point4& position, const Quaternion& rotation, float scaleX, float scaleY, float scaleZ)
{
	this->translateX = position.getX();
	this->translateY = position.getY();
	this->translateZ = position.getZ();

	this->position = position;

	this->rotation = rotation;

	this->scaleX = scaleX;
	this->scaleY = scaleY;
	this->scaleZ = scaleZ;

	this->updateNormalModelMatrix = true;

	updateMetrics();

	updateBoundingSphereCenter(true);
}
Example #7
0
void Sky::render(const Point4& center) const
{
	Matrix4x4 translationMatrix;
	translationMatrix.translate(center.getX(), center.getY(), center.getZ());

    glFrontFace(GL_CW);

    if (skyTexture.get())
    {
    	glBindTexture(GL_TEXTURE_CUBE_MAP, skyTexture->getTextureName());
    }
    else
    {
    	glBindTexture(GL_TEXTURE_CUBE_MAP, 0);
    }

	program->use();

	glUniformMatrix4fv(program->getUniformLocation(u_modelMatrix), 1, GL_FALSE, (translationMatrix * scaleMatrix).getM());

    glUniform1i(program->getUniformLocation(u_cubemap), 0);

	// Write bright color
	glUniform1i(program->getUniformLocation(u_writeBrightColor), writeBrightColor);
	glUniform1f(program->getUniformLocation(u_brightColorLimit), brightColorLimit);

	skyVAO->bind();

	glDrawElements(GL_TRIANGLES, numberIndices, GL_UNSIGNED_INT, 0);

	skyVAO->unbind();

	glBindTexture(GL_TEXTURE_CUBE_MAP, 0);

    glFrontFace(GL_CCW);
}
Example #8
0
Point4 TransformMatrix::operator*( const Point4 &v )
{
    const float *pnt = v.Data();
    float   result[4];

    for( int i = 0; i < 4; ++i )
    {
        float rowCol = 0.0;
        for( int k = 0; k < 4; ++k )
        {
            rowCol += mData[i][k] * pnt[k];
        }
        result[i] = rowCol;
    }
    return Point4( result[0], result[1], result[2], result[3] );
}
Point3 p4to3 (const Point4 &p4)
{
	return Point3 (p4.x(), p4.y(), p4.z());
}
Example #10
0
void PointLight::setLightProperties(uint32_t lightNumber, const ProgramSP& program, const Point4& position, const Quaternion& rotation) const
{
	glUniform1f(program->getUniformLocation(string(u_light) + to_string(lightNumber) + u_lightType), 1.0f);

	glUniform4fv(program->getUniformLocation(string(u_light) + to_string(lightNumber) + u_diffuseLightColor), 1, diffuse.getRGBA());
	glUniform4fv(program->getUniformLocation(string(u_light) + to_string(lightNumber) + u_specularLightColor), 1, specular.getRGBA());

	glUniform4fv(program->getUniformLocation(string(u_light) + to_string(lightNumber) + u_lightPosition), 1, position.getP());

	glUniform1f(program->getUniformLocation(string(u_light) + to_string(lightNumber) + u_lightConstantAttenuation), constantAttenuation);
	glUniform1f(program->getUniformLocation(string(u_light) + to_string(lightNumber) + u_lightLinearAttenuation), linearAttenuation);
	glUniform1f(program->getUniformLocation(string(u_light) + to_string(lightNumber) + u_lightQuadraticAttenuation), quadraticAttenuation);
}
Example #11
0
	template<class T> Frustum<T> operator *(const Matrix4<T> &m, const Frustum<T> &frustum)
	{
		Point4<T> ntl = m * Point4<T>(frustum.getFrustumPoint(Frustum<T>::NTL));
		Point4<T> ntr = m * Point4<T>(frustum.getFrustumPoint(Frustum<T>::NTR));
		Point4<T> nbl = m * Point4<T>(frustum.getFrustumPoint(Frustum<T>::NBL));
		Point4<T> nbr = m * Point4<T>(frustum.getFrustumPoint(Frustum<T>::NBR));
		Point4<T> ftl = m * Point4<T>(frustum.getFrustumPoint(Frustum<T>::FTL));
		Point4<T> ftr = m * Point4<T>(frustum.getFrustumPoint(Frustum<T>::FTR));
		Point4<T> fbl = m * Point4<T>(frustum.getFrustumPoint(Frustum<T>::FBL));
		Point4<T> fbr = m * Point4<T>(frustum.getFrustumPoint(Frustum<T>::FBR));

		return Frustum<T>(ntl.toPoint3(), ntr.toPoint3(), nbl.toPoint3(), nbr.toPoint3(),
			ftl.toPoint3(), ftr.toPoint3(), fbl.toPoint3(), fbr.toPoint3());
	}
void PostProcessor::render() const
{
	if (!frameBuffer.get() || !tempFrameBuffer.get() || !bloomFrameBuffer.get() || !depthOfFieldFrameBuffer.get() || !blurTexture1DArray.get() || !bloomTexture1DArray.get() || !depthOfFieldTexture1DArray.get() )
	{
		return;
	}

	CameraSP currentCamera = CameraManager::getInstance()->getDefaultOrthographicCamera();

	Matrix4x4 modelMatrix;
	modelMatrix.scale(static_cast<GLfloat>(frameBuffer->getWidth()), static_cast<GLfloat>(frameBuffer->getHeight()), 1.0f);

	program->use();

	setUniforms();

	glDepthMask(GL_FALSE);
	glDisable(GL_DEPTH_TEST);

	glUniformMatrix4fv(program->getUniformLocation(u_projectionMatrix), 1, GL_FALSE, currentCamera->getProjectionMatrix().getM());
	glUniformMatrix4fv(program->getUniformLocation(u_viewMatrix), 1, GL_FALSE, currentCamera->getViewMatrix().getM());
	glUniformMatrix4fv(program->getUniformLocation(u_modelMatrix), 1, GL_FALSE, modelMatrix.getM());

	//

	const CameraSP& defaultCamera = CameraManager::getInstance()->getDefaultPerspectiveCamera();

	Point4 focalPoint = defaultCamera->getEye() + (defaultCamera->getDirection() * focal);
	Point4 focusedObjectPoint = defaultCamera->getEye() + (defaultCamera->getDirection() * focusedObject);

	Point4 biasedFocalPoint = defaultCamera->getBiasedProjectionMatrix() * defaultCamera->getViewMatrix() * focalPoint;
	Point4 biasedFocusedObjectPoint = defaultCamera->getBiasedProjectionMatrix() * defaultCamera->getViewMatrix() * focusedObjectPoint;

	glUniform1f(program->getUniformLocation(u_aperture), aperture);
	glUniform1f(program->getUniformLocation(u_focal), glusClampf(biasedFocalPoint.getZ(), 0.0f, 1.0f));
	glUniform1f(program->getUniformLocation(u_focusedObject), glusClampf(biasedFocusedObjectPoint.getZ(), 0.0f, 1.0f));

	//

	// Depth texture
	glActiveTexture(GL_TEXTURE3);
	glBindTexture(target, frameBuffer->getDepthTexture()->getTextureName());
	glUniform1i(program->getUniformLocation(depthTexture), 3);

	glActiveTexture(GL_TEXTURE0);

	// Create bloom textures
	if (useBloom)
	{
		use(false);

		// Only the bright texture is needed
		glActiveTexture(GL_TEXTURE0);
		glBindTexture(target, frameBuffer->getColor1Texture()->getTextureName());
		glUniform1i(program->getUniformLocation(screenTexture), 0);

		// Not used. Just take the color texture as a dummy value
		glActiveTexture(GL_TEXTURE1);
		glBindTexture(target, frameBuffer->getColor0Texture()->getTextureName());
		glUniform1i(program->getUniformLocation(bloomTexture), 1);

		// Blur using the bloom texture
		glActiveTexture(GL_TEXTURE2);
		glBindTexture(GL_TEXTURE_1D_ARRAY, bloomTexture1DArray->getTextureName());
		glUniform1i(program->getUniformLocation(u_blurTexture), 2);

		glActiveTexture(GL_TEXTURE0);

		glUniform1i(program->getUniformLocation(u_useDoF), false);

		glUniform1i(program->getUniformLocation(u_useBlur), true);

		glUniform1i(program->getUniformLocation(u_useBloom), false);
		glUniform1f(program->getUniformLocation(u_bloomLevel), bloomLevel);

		glUniform1i(program->getUniformLocation(u_useExposure), false);
		glUniform1f(program->getUniformLocation(u_exposure), exposure);

		glUniform1i(program->getUniformLocation(u_useGamma), false);
		glUniform1f(program->getUniformLocation(u_gamma), gamma);

		postProcessorVAO->bind();

		// First pass ...

		glUniform1i(program->getUniformLocation(u_blurHorizontal), 1);
		glUniform1i(program->getUniformLocation(u_blurVertical), 0);
		tempFrameBuffer->use(true);

		glDrawElements(GL_TRIANGLES, numberIndices, GL_UNSIGNED_INT, 0);

		tempFrameBuffer->use(false);

		// ... and final pass

		glBindTexture(target, tempFrameBuffer->getColor0Texture()->getTextureName());

		glUniform1i(program->getUniformLocation(u_blurHorizontal), 0);
		glUniform1i(program->getUniformLocation(u_blurVertical), 1);

		bloomFrameBuffer->use(true);

		glDrawElements(GL_TRIANGLES, numberIndices, GL_UNSIGNED_INT, 0);

		bloomFrameBuffer->use(false);

		//

		postProcessorVAO->unbind();

		glBindTexture(target, 0);
	}

	FrameBufferSP usedFrameBuffer = frameBuffer;

	// Bloom the framebuffer
	if (useBloom)
	{
		use(false);

		// Original frame buffer
		glActiveTexture(GL_TEXTURE0);
		glBindTexture(target, frameBuffer->getColor0Texture()->getTextureName());
		glUniform1i(program->getUniformLocation(screenTexture), 0);

		// Bloom
		glActiveTexture(GL_TEXTURE1);
		glBindTexture(target, bloomFrameBuffer->getColor0Texture()->getTextureName());
		glUniform1i(program->getUniformLocation(bloomTexture), 1);

		// Dummy
		glActiveTexture(GL_TEXTURE2);
		glBindTexture(GL_TEXTURE_1D_ARRAY, bloomTexture1DArray->getTextureName());
		glUniform1i(program->getUniformLocation(u_blurTexture), 2);

		glActiveTexture(GL_TEXTURE0);

		glUniform1i(program->getUniformLocation(u_useDoF), false);

		glUniform1i(program->getUniformLocation(u_useBlur), false);

		glUniform1i(program->getUniformLocation(u_useBloom), true);
		glUniform1f(program->getUniformLocation(u_bloomLevel), bloomLevel);

		glUniform1i(program->getUniformLocation(u_useExposure), false);
		glUniform1f(program->getUniformLocation(u_exposure), exposure);

		glUniform1i(program->getUniformLocation(u_useGamma), false);
		glUniform1f(program->getUniformLocation(u_gamma), gamma);

		glUniform1i(program->getUniformLocation(u_blurHorizontal), 0);
		glUniform1i(program->getUniformLocation(u_blurVertical), 0);

		postProcessorVAO->bind();

		// One pass

		tempFrameBuffer->use(true);

		glDrawElements(GL_TRIANGLES, numberIndices, GL_UNSIGNED_INT, 0);

		tempFrameBuffer->use(false);

		//

		postProcessorVAO->unbind();

		glBindTexture(target, 0);

		usedFrameBuffer = tempFrameBuffer;
	}

	// Depth of field
	if (useDoF)
	{
		use(false);

		// Only the color texture is needed
		glActiveTexture(GL_TEXTURE0);
		glBindTexture(target, usedFrameBuffer->getColor0Texture()->getTextureName());
		glUniform1i(program->getUniformLocation(screenTexture), 0);

		// Not used. Just take the color texture as a dummy value
		glActiveTexture(GL_TEXTURE1);
		glBindTexture(target, frameBuffer->getColor0Texture()->getTextureName());
		glUniform1i(program->getUniformLocation(bloomTexture), 1);

		// Blur using the DOF texture
		glActiveTexture(GL_TEXTURE2);
		glBindTexture(GL_TEXTURE_1D_ARRAY, depthOfFieldTexture1DArray->getTextureName());
		glUniform1i(program->getUniformLocation(u_blurTexture), 2);

		glActiveTexture(GL_TEXTURE0);

		glUniform1i(program->getUniformLocation(u_useDoF), true);

		glUniform1i(program->getUniformLocation(u_useBlur), false);

		glUniform1i(program->getUniformLocation(u_useBloom), false);
		glUniform1f(program->getUniformLocation(u_bloomLevel), bloomLevel);

		glUniform1i(program->getUniformLocation(u_useExposure), false);
		glUniform1f(program->getUniformLocation(u_exposure), exposure);

		glUniform1i(program->getUniformLocation(u_useGamma), false);
		glUniform1f(program->getUniformLocation(u_gamma), gamma);

		postProcessorVAO->bind();

		// First pass ...

		glUniform1i(program->getUniformLocation(u_blurHorizontal), 1);
		glUniform1i(program->getUniformLocation(u_blurVertical), 0);
		tempFrameBuffer->use(true);

		glDrawElements(GL_TRIANGLES, numberIndices, GL_UNSIGNED_INT, 0);

		tempFrameBuffer->use(false);

		// ... and final pass

		glBindTexture(target, tempFrameBuffer->getColor0Texture()->getTextureName());

		glUniform1i(program->getUniformLocation(u_blurHorizontal), 0);
		glUniform1i(program->getUniformLocation(u_blurVertical), 1);
		depthOfFieldFrameBuffer->use(true);

		glDrawElements(GL_TRIANGLES, numberIndices, GL_UNSIGNED_INT, 0);

		depthOfFieldFrameBuffer->use(false);

		//

		postProcessorVAO->unbind();

		glBindTexture(target, 0);

		usedFrameBuffer = depthOfFieldFrameBuffer;
	}

	//

	use(false);

	// Color
	glActiveTexture(GL_TEXTURE0);
	glBindTexture(target, usedFrameBuffer->getColor0Texture()->getTextureName());
	glUniform1i(program->getUniformLocation(screenTexture), 0);

	// Not used.
	glActiveTexture(GL_TEXTURE1);
	glBindTexture(target, bloomFrameBuffer->getColor0Texture()->getTextureName());
	glUniform1i(program->getUniformLocation(bloomTexture), 1);

	// Blur
	glActiveTexture(GL_TEXTURE2);
	glBindTexture(GL_TEXTURE_1D_ARRAY, blurTexture1DArray->getTextureName());
	glUniform1i(program->getUniformLocation(u_blurTexture), 2);

	glActiveTexture(GL_TEXTURE0);

	glUniform1i(program->getUniformLocation(u_useDoF), false);

	glUniform1i(program->getUniformLocation(u_useBlur), useBlur);
	glUniform1i(program->getUniformLocation(u_blurHorizontal), 1);
	glUniform1i(program->getUniformLocation(u_blurVertical), 1);

	glUniform1i(program->getUniformLocation(u_useBloom), false);
	glUniform1f(program->getUniformLocation(u_bloomLevel), bloomLevel);

	glUniform1i(program->getUniformLocation(u_useExposure), useExposure);
	glUniform1f(program->getUniformLocation(u_exposure), exposure);

	glUniform1i(program->getUniformLocation(u_useGamma), useGamma);
	glUniform1f(program->getUniformLocation(u_gamma), gamma);

	postProcessorVAO->bind();

	glDrawElements(GL_TRIANGLES, numberIndices, GL_UNSIGNED_INT, 0);

	postProcessorVAO->unbind();

	//

	glEnable(GL_DEPTH_TEST);
	glDepthMask(GL_TRUE);

	glBindTexture(target, 0);
}