mirror of
https://github.com/overte-org/overte.git
synced 2025-08-06 19:59:28 +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 {
|
class TransformCamera {
|
||||||
public:
|
public:
|
||||||
Mat4 _projection;
|
|
||||||
Mat4 _view;
|
Mat4 _view;
|
||||||
Mat4 _viewInverse;
|
Mat4 _viewInverse;
|
||||||
Mat4 _projectionViewUntranslated;
|
Mat4 _projectionViewUntranslated;
|
||||||
|
Mat4 _projection;
|
||||||
|
Vec4 _viewport;
|
||||||
};
|
};
|
||||||
|
|
||||||
template< typename T >
|
template< typename T >
|
||||||
|
|
|
@ -486,7 +486,7 @@ void GLBackend::updateTransform() {
|
||||||
|
|
||||||
if (_transform._invalidView || _transform._invalidProj) {
|
if (_transform._invalidView || _transform._invalidProj) {
|
||||||
Mat4 viewUntranslated = _transform._transformCamera._view;
|
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;
|
_transform._transformCamera._projectionViewUntranslated = _transform._transformCamera._projection * viewUntranslated;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -16,22 +16,21 @@ struct TransformObject {
|
||||||
};
|
};
|
||||||
|
|
||||||
struct TransformCamera {
|
struct TransformCamera {
|
||||||
mat4 _projection;
|
|
||||||
mat4 _view;
|
mat4 _view;
|
||||||
mat4 _viewInverse;
|
mat4 _viewInverse;
|
||||||
mat4 _projectionViewUntranslated;
|
mat4 _projectionViewUntranslated;
|
||||||
|
mat4 _projection;
|
||||||
|
vec4 _viewport;
|
||||||
};
|
};
|
||||||
|
|
||||||
vec4 transform(TransformCamera camera, TransformObject object, vec4 pos) {
|
vec4 transformModelToClipPos(TransformCamera camera, TransformObject object, vec4 pos) {
|
||||||
/* vec4 res = object._model * pos;
|
vec4 epos = (object._model * pos) + vec4(-pos.w * camera._viewInverse[3].xyz, 0.0);
|
||||||
res += pos.w * camera._viewInverse[3];
|
return camera._projectionViewUntranslated * epos;
|
||||||
return camera._projectionViewUntranslated * res;
|
// Equivalent to the following but hoppefully a bit more accurate
|
||||||
*/
|
// return camera._projection * camera._view * object._model * pos;
|
||||||
return camera._projectionViewUntranslated * object._model * pos;
|
|
||||||
// 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 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 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);
|
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();
|
_renderBatch.clear();
|
||||||
gpu::Batch& batch = _renderBatch;
|
gpu::Batch& batch = _renderBatch;
|
||||||
|
|
||||||
if (args) {
|
// Setup the projection matrix
|
||||||
glm::mat4 proj;
|
glm::mat4 proj;
|
||||||
args->_viewFrustum->evalProjectionMatrix(proj);
|
_viewState->getCurrentViewFrustum()->evalProjectionMatrix(proj);
|
||||||
batch.setProjectionTransform(proj);
|
batch.setProjectionTransform(proj);
|
||||||
}
|
|
||||||
|
|
||||||
// Capture the view matrix once for the rendering of this model
|
// Capture the view matrix once for the rendering of this model
|
||||||
if (_transforms.empty()) {
|
if (_transforms.empty()) {
|
||||||
|
|
|
@ -30,10 +30,9 @@ void main(void) {
|
||||||
// use standard pipeline transform
|
// use standard pipeline transform
|
||||||
TransformCamera cam = getTransformCamera();
|
TransformCamera cam = getTransformCamera();
|
||||||
TransformObject obj = getTransformObject();
|
TransformObject obj = getTransformObject();
|
||||||
|
gl_Position = transformModelToClipPos(cam, obj, gl_Vertex);
|
||||||
gl_Position = transform(cam, obj, gl_Vertex);
|
|
||||||
|
|
||||||
// transform and store the normal for interpolation
|
// 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
|
// use standard pipeline transform
|
||||||
TransformCamera cam = getTransformCamera();
|
TransformCamera cam = getTransformCamera();
|
||||||
TransformObject obj = getTransformObject();
|
TransformObject obj = getTransformObject();
|
||||||
|
gl_Position = transformModelToClipPos(cam, obj, gl_Vertex);
|
||||||
gl_Position = transform(cam, obj, gl_Vertex);
|
|
||||||
|
|
||||||
// transform and store the normal for interpolation
|
// 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
|
// use standard pipeline transform
|
||||||
TransformCamera cam = getTransformCamera();
|
TransformCamera cam = getTransformCamera();
|
||||||
TransformObject obj = getTransformObject();
|
TransformObject obj = getTransformObject();
|
||||||
|
gl_Position = transformModelToClipPos(cam, obj, gl_Vertex);
|
||||||
gl_Position = transform(cam, obj, gl_Vertex);
|
|
||||||
|
|
||||||
// transform and store the normal for interpolation
|
// transform and store the normal for interpolation
|
||||||
interpolatedNormal = vec4(normalize(transformDir(cam, obj, gl_Normal)), 0.0);
|
interpolatedNormal = vec4(normalize(transformModelToEyeDir(cam, obj, gl_Normal)), 0.0);
|
||||||
interpolatedTangent = vec4(normalize(transformDir(cam, obj, tangent)), 0.0);
|
interpolatedTangent = vec4(normalize(transformModelToEyeDir(cam, obj, tangent)), 0.0);
|
||||||
}
|
}
|
||||||
|
|
|
@ -41,10 +41,9 @@ void main(void) {
|
||||||
// use standard pipeline transform
|
// use standard pipeline transform
|
||||||
TransformCamera cam = getTransformCamera();
|
TransformCamera cam = getTransformCamera();
|
||||||
TransformObject obj = getTransformObject();
|
TransformObject obj = getTransformObject();
|
||||||
|
gl_Position = transformModelToClipPos(cam, obj, gl_Vertex);
|
||||||
gl_Position = transform(cam, obj, gl_Vertex);
|
|
||||||
|
|
||||||
// transform and store the normal for interpolation
|
// transform and store the normal for interpolation
|
||||||
interpolatedNormal = vec4(normalize(transformDir(cam, obj, gl_Normal)), 0.0);
|
interpolatedNormal = vec4(normalize(transformModelToEyeDir(cam, obj, gl_Normal)), 0.0);
|
||||||
interpolatedTangent = vec4(normalize(transformDir(cam, obj, tangent)), 0.0);
|
interpolatedTangent = vec4(normalize(transformModelToEyeDir(cam, obj, tangent)), 0.0);
|
||||||
}
|
}
|
||||||
|
|
|
@ -17,5 +17,5 @@ void main(void) {
|
||||||
// use standard pipeline transform
|
// use standard pipeline transform
|
||||||
TransformCamera cam = getTransformCamera();
|
TransformCamera cam = getTransformCamera();
|
||||||
TransformObject obj = getTransformObject();
|
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
|
// use standard pipeline transform
|
||||||
TransformCamera cam = getTransformCamera();
|
TransformCamera cam = getTransformCamera();
|
||||||
TransformObject obj = getTransformObject();
|
TransformObject obj = getTransformObject();
|
||||||
|
gl_Position = transformModelToClipPos(cam, obj, position);
|
||||||
gl_Position = transform(cam, obj, position);
|
|
||||||
|
|
||||||
// transform and store the normal for interpolation
|
// 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
|
// use standard pipeline transform
|
||||||
TransformCamera cam = getTransformCamera();
|
TransformCamera cam = getTransformCamera();
|
||||||
TransformObject obj = getTransformObject();
|
TransformObject obj = getTransformObject();
|
||||||
|
gl_Position = transformModelToClipPos(cam, obj, interpolatedPosition);
|
||||||
gl_Position = transform(cam, obj, interpolatedPosition);
|
|
||||||
|
|
||||||
interpolatedNormal = vec4(normalize(transformDir(cam, obj, interpolatedNormal.xyz)), 0.0);
|
interpolatedNormal = vec4(normalize(transformModelToEyeDir(cam, obj, interpolatedNormal.xyz)), 0.0);
|
||||||
interpolatedTangent = vec4(normalize(transformDir(cam, obj, interpolatedTangent.xyz)), 0.0);
|
interpolatedTangent = vec4(normalize(transformModelToEyeDir(cam, obj, interpolatedTangent.xyz)), 0.0);
|
||||||
}
|
}
|
||||||
|
|
|
@ -33,6 +33,5 @@ void main(void) {
|
||||||
// use standard pipeline transform
|
// use standard pipeline transform
|
||||||
TransformCamera cam = getTransformCamera();
|
TransformCamera cam = getTransformCamera();
|
||||||
TransformObject obj = getTransformObject();
|
TransformObject obj = getTransformObject();
|
||||||
|
gl_Position = transformModelToClipPos(cam, obj, position);
|
||||||
gl_Position = transform(cam, obj, position);
|
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue