Fixing the remaining issue with the avatar rendering path

This commit is contained in:
Sam Gateau 2015-02-20 11:26:08 -08:00
parent d08142d37d
commit ded78816b5
12 changed files with 32 additions and 40 deletions

View file

@ -37,10 +37,11 @@ public:
class TransformCamera {
public:
Mat4 _projection;
Mat4 _view;
Mat4 _viewInverse;
Mat4 _projectionViewUntranslated;
Mat4 _projection;
Vec4 _viewport;
};
template< typename T >

View file

@ -486,7 +486,7 @@ void GLBackend::updateTransform() {
if (_transform._invalidView || _transform._invalidProj) {
Mat4 viewUntranslated = _transform._transformCamera._view;
// viewUntranslated[3] = Vec4(0.0f, 0.0f, 0.0f, 1.0f);
viewUntranslated[3] = Vec4(0.0f, 0.0f, 0.0f, 1.0f);
_transform._transformCamera._projectionViewUntranslated = _transform._transformCamera._projection * viewUntranslated;
}

View file

@ -16,22 +16,21 @@ struct TransformObject {
};
struct TransformCamera {
mat4 _projection;
mat4 _view;
mat4 _viewInverse;
mat4 _projectionViewUntranslated;
mat4 _projection;
vec4 _viewport;
};
vec4 transform(TransformCamera camera, TransformObject object, vec4 pos) {
/* vec4 res = object._model * pos;
res += pos.w * camera._viewInverse[3];
return camera._projectionViewUntranslated * res;
*/
return camera._projectionViewUntranslated * object._model * pos;
// return camera._projection * camera._view * object._model * pos;
vec4 transformModelToClipPos(TransformCamera camera, TransformObject object, vec4 pos) {
vec4 epos = (object._model * pos) + vec4(-pos.w * camera._viewInverse[3].xyz, 0.0);
return camera._projectionViewUntranslated * epos;
// Equivalent to the following but hoppefully a bit more accurate
// return camera._projection * camera._view * object._model * pos;
}
vec3 transformDir(TransformCamera camera, TransformObject object, vec3 dir) {
vec3 transformModelToEyeDir(TransformCamera camera, TransformObject object, vec3 dir) {
vec3 mIr0 = vec3(object._modelInverse[0].x, object._modelInverse[1].x, object._modelInverse[2].x);
vec3 mIr1 = vec3(object._modelInverse[0].y, object._modelInverse[1].y, object._modelInverse[2].y);
vec3 mIr2 = vec3(object._modelInverse[0].z, object._modelInverse[1].z, object._modelInverse[2].z);

View file

@ -700,11 +700,10 @@ bool Model::renderCore(float alpha, RenderMode mode, RenderArgs* args) {
_renderBatch.clear();
gpu::Batch& batch = _renderBatch;
if (args) {
glm::mat4 proj;
args->_viewFrustum->evalProjectionMatrix(proj);
batch.setProjectionTransform(proj);
}
// Setup the projection matrix
glm::mat4 proj;
_viewState->getCurrentViewFrustum()->evalProjectionMatrix(proj);
batch.setProjectionTransform(proj);
// Capture the view matrix once for the rendering of this model
if (_transforms.empty()) {

View file

@ -30,10 +30,9 @@ void main(void) {
// use standard pipeline transform
TransformCamera cam = getTransformCamera();
TransformObject obj = getTransformObject();
gl_Position = transform(cam, obj, gl_Vertex);
gl_Position = transformModelToClipPos(cam, obj, gl_Vertex);
// transform and store the normal for interpolation
normal = vec4(normalize(transformDir(cam, obj, gl_Normal)), 0.0);
normal = vec4(normalize(transformModelToEyeDir(cam, obj, gl_Normal)), 0.0);
}

View file

@ -38,10 +38,9 @@ void main(void) {
// use standard pipeline transform
TransformCamera cam = getTransformCamera();
TransformObject obj = getTransformObject();
gl_Position = transform(cam, obj, gl_Vertex);
gl_Position = transformModelToClipPos(cam, obj, gl_Vertex);
// transform and store the normal for interpolation
normal = vec4(normalize(transformDir(cam, obj, gl_Normal)), 0.0);
normal = vec4(normalize(transformModelToEyeDir(cam, obj, gl_Normal)), 0.0);
}

View file

@ -47,10 +47,9 @@ void main(void) {
// use standard pipeline transform
TransformCamera cam = getTransformCamera();
TransformObject obj = getTransformObject();
gl_Position = transform(cam, obj, gl_Vertex);
gl_Position = transformModelToClipPos(cam, obj, gl_Vertex);
// transform and store the normal for interpolation
interpolatedNormal = vec4(normalize(transformDir(cam, obj, gl_Normal)), 0.0);
interpolatedTangent = vec4(normalize(transformDir(cam, obj, tangent)), 0.0);
interpolatedNormal = vec4(normalize(transformModelToEyeDir(cam, obj, gl_Normal)), 0.0);
interpolatedTangent = vec4(normalize(transformModelToEyeDir(cam, obj, tangent)), 0.0);
}

View file

@ -41,10 +41,9 @@ void main(void) {
// use standard pipeline transform
TransformCamera cam = getTransformCamera();
TransformObject obj = getTransformObject();
gl_Position = transform(cam, obj, gl_Vertex);
gl_Position = transformModelToClipPos(cam, obj, gl_Vertex);
// transform and store the normal for interpolation
interpolatedNormal = vec4(normalize(transformDir(cam, obj, gl_Normal)), 0.0);
interpolatedTangent = vec4(normalize(transformDir(cam, obj, tangent)), 0.0);
interpolatedNormal = vec4(normalize(transformModelToEyeDir(cam, obj, gl_Normal)), 0.0);
interpolatedTangent = vec4(normalize(transformModelToEyeDir(cam, obj, tangent)), 0.0);
}

View file

@ -17,5 +17,5 @@ void main(void) {
// use standard pipeline transform
TransformCamera cam = getTransformCamera();
TransformObject obj = getTransformObject();
gl_Position = transform(cam, obj, gl_Vertex);
gl_Position = transformModelToClipPos(cam, obj, gl_Vertex);
}

View file

@ -46,9 +46,8 @@ void main(void) {
// use standard pipeline transform
TransformCamera cam = getTransformCamera();
TransformObject obj = getTransformObject();
gl_Position = transform(cam, obj, position);
gl_Position = transformModelToClipPos(cam, obj, position);
// transform and store the normal for interpolation
normal = vec4(normalize(transformDir(cam, obj, normal.xyz)), 0.0);
normal = vec4(normalize(transformModelToEyeDir(cam, obj, normal.xyz)), 0.0);
}

View file

@ -58,9 +58,8 @@ void main(void) {
// use standard pipeline transform
TransformCamera cam = getTransformCamera();
TransformObject obj = getTransformObject();
gl_Position = transform(cam, obj, interpolatedPosition);
gl_Position = transformModelToClipPos(cam, obj, interpolatedPosition);
interpolatedNormal = vec4(normalize(transformDir(cam, obj, interpolatedNormal.xyz)), 0.0);
interpolatedTangent = vec4(normalize(transformDir(cam, obj, interpolatedTangent.xyz)), 0.0);
interpolatedNormal = vec4(normalize(transformModelToEyeDir(cam, obj, interpolatedNormal.xyz)), 0.0);
interpolatedTangent = vec4(normalize(transformModelToEyeDir(cam, obj, interpolatedTangent.xyz)), 0.0);
}

View file

@ -33,6 +33,5 @@ void main(void) {
// use standard pipeline transform
TransformCamera cam = getTransformCamera();
TransformObject obj = getTransformObject();
gl_Position = transform(cam, obj, position);
gl_Position = transformModelToClipPos(cam, obj, position);
}