Ejemplo n.º 1
0
GLUSvoid GLUSAPIENTRY glusVector3Refractf(GLUSfloat result[3], const GLUSfloat incident[3], const GLUSfloat normal[3], const float eta)
{
	// see http://www.opengl.org/sdk/docs/manglsl/xhtml/refract.xml
	// see http://en.wikipedia.org/wiki/Snell%27s_law
	// see http://www.hugi.scene.org/online/coding/hugi%2023%20-%20torefrac.htm for a and b vector.
	// In this implementation, the incident vector points into the interface. So the sings do change.

	GLUSfloat nDotI = glusVector3Dotf(normal, incident);

	GLUSfloat k = 1.0f - eta * eta * (1.0f - nDotI * nDotI);

	if (k < 0.0f)
	{
		result[0] = 0.0f;
		result[1] = 0.0f;
		result[2] = 0.0f;
	}
	else
	{
		GLUSfloat a[3];
		GLUSfloat b[3];

		glusVector3MultiplyScalarf(a, incident, eta);

		glusVector3MultiplyScalarf(b, normal, eta * nDotI + sqrtf(k));

		glusVector3SubtractVector3f(result, a, b);
	}
}
Ejemplo n.º 2
0
Vector3 Vector3::operator -(const Vector3& other) const
{
    Vector3 result;

    glusVector3SubtractVector3f(result.v, v, other.v);

    return result;
}
Ejemplo n.º 3
0
GLUSboolean GLUSAPIENTRY glusVector3GramSchmidtOrthof(GLUSfloat result[3], const GLUSfloat u[3], const GLUSfloat v[3])
{
	GLUSfloat uProjV[3];

	GLUSfloat vDotU;

	GLUSfloat uDotU = glusVector3Dotf(u, u);

	if (uDotU == 0.0f)
	{
		return GLUS_FALSE;
	}

	vDotU = glusVector3Dotf(v, u);

	uProjV[0] = u[0] * vDotU / uDotU;
	uProjV[1] = u[1] * vDotU / uDotU;
	uProjV[2] = u[2] * vDotU / uDotU;

	glusVector3SubtractVector3f(result, v, uProjV);

	return GLUS_TRUE;
}
Ejemplo n.º 4
0
GLUSvoid GLUSAPIENTRY glusVector3Reflectf(GLUSfloat result[3], const GLUSfloat incident[3], const GLUSfloat normal[3])
{
	glusVector3MultiplyScalarf(result, normal, 2.0f * glusVector3Dotf(normal, incident));

	glusVector3SubtractVector3f(result, incident, result);
}
Ejemplo n.º 5
0
Vector3& Vector3::operator -=(const Vector3& vector)
{
    glusVector3SubtractVector3f(v, v, vector.v);

    return *this;
}