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); } }
Vector3 Vector3::operator -(const Vector3& other) const { Vector3 result; glusVector3SubtractVector3f(result.v, v, other.v); return result; }
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; }
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); }
Vector3& Vector3::operator -=(const Vector3& vector) { glusVector3SubtractVector3f(v, v, vector.v); return *this; }