mirror of
https://github.com/overte-org/overte.git
synced 2025-04-20 03:44:02 +02:00
Fixing the remaining issue with the avatar rendering path
This commit is contained in:
parent
d08142d37d
commit
ded78816b5
12 changed files with 32 additions and 40 deletions
|
@ -37,10 +37,11 @@ public:
|
|||
|
||||
class TransformCamera {
|
||||
public:
|
||||
Mat4 _projection;
|
||||
Mat4 _view;
|
||||
Mat4 _viewInverse;
|
||||
Mat4 _projectionViewUntranslated;
|
||||
Mat4 _projection;
|
||||
Vec4 _viewport;
|
||||
};
|
||||
|
||||
template< typename T >
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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()) {
|
||||
|
|
|
@ -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);
|
||||
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue