mirror of
https://github.com/overte-org/overte.git
synced 2025-08-08 03:17:06 +02:00
117 lines
4.7 KiB
Text
117 lines
4.7 KiB
Text
<!
|
|
// gpu/TransformState.slh
|
|
//
|
|
// Created by Sam Gateau on 2/10/15.
|
|
// Copyright 2013 High Fidelity, Inc.
|
|
//
|
|
// Distributed under the Apache License, Version 2.0.
|
|
// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html
|
|
!>
|
|
<@if not GPU_TRANSFORM_STATE_SLH@>
|
|
<@def GPU_TRANSFORM_STATE_SLH@>
|
|
|
|
<@func declareStandardTransform()@>
|
|
struct TransformObject {
|
|
mat4 _model;
|
|
mat4 _modelInverse;
|
|
};
|
|
|
|
struct TransformCamera {
|
|
mat4 _view;
|
|
mat4 _viewInverse;
|
|
mat4 _projectionViewUntranslated;
|
|
mat4 _projection;
|
|
mat4 _projectionInverse;
|
|
vec4 _viewport;
|
|
};
|
|
|
|
in ivec2 _drawCallInfo;
|
|
|
|
layout(std140) buffer transformObjectBuffer {
|
|
TransformObject _object[];
|
|
};
|
|
TransformObject getTransformObject() {
|
|
return _object[_drawCallInfo.x];
|
|
}
|
|
|
|
layout(std140) uniform transformCameraBuffer {
|
|
TransformCamera _camera;
|
|
};
|
|
TransformCamera getTransformCamera() {
|
|
return _camera;
|
|
}
|
|
<@endfunc@>
|
|
|
|
<@func transformCameraViewport(cameraTransform, viewport)@>
|
|
<$viewport$> = <$cameraTransform$>._viewport;
|
|
<@endfunc@>
|
|
|
|
<@func transformModelToClipPos(cameraTransform, objectTransform, modelPos, clipPos)@>
|
|
<!// Equivalent to the following but hoppefully a tad more accurate
|
|
//return camera._projection * camera._view * object._model * pos; !>
|
|
{ // transformModelToClipPos
|
|
vec4 _eyepos = (<$objectTransform$>._model * <$modelPos$>) + vec4(-<$modelPos$>.w * <$cameraTransform$>._viewInverse[3].xyz, 0.0);
|
|
<$clipPos$> = <$cameraTransform$>._projectionViewUntranslated * _eyepos;
|
|
}
|
|
<@endfunc@>
|
|
|
|
<@func $transformModelToEyeAndClipPos(cameraTransform, objectTransform, modelPos, eyePos, clipPos)@>
|
|
<!// Equivalent to the following but hoppefully a tad more accurate
|
|
//return camera._projection * camera._view * object._model * pos; !>
|
|
{ // transformModelToClipPos
|
|
vec4 _worldpos = (<$objectTransform$>._model * <$modelPos$>);
|
|
<$eyePos$> = (<$cameraTransform$>._view * _worldpos);
|
|
vec4 _eyepos =(<$objectTransform$>._model * <$modelPos$>) + vec4(-<$modelPos$>.w * <$cameraTransform$>._viewInverse[3].xyz, 0.0);
|
|
<$clipPos$> = <$cameraTransform$>._projectionViewUntranslated * _eyepos;
|
|
// <$eyePos$> = (<$cameraTransform$>._projectionInverse * <$clipPos$>);
|
|
}
|
|
<@endfunc@>
|
|
|
|
<@func transformModelToWorldPos(objectTransform, modelPos, worldPos)@>
|
|
{ // transformModelToWorldPos
|
|
<$worldPos$> = (<$objectTransform$>._model * <$modelPos$>);
|
|
}
|
|
<@endfunc@>
|
|
|
|
<@func transformModelToEyeDir(cameraTransform, objectTransform, modelDir, eyeDir)@>
|
|
{ // transformModelToEyeDir
|
|
vec3 mr0 = vec3(<$objectTransform$>._modelInverse[0].x, <$objectTransform$>._modelInverse[1].x, <$objectTransform$>._modelInverse[2].x);
|
|
vec3 mr1 = vec3(<$objectTransform$>._modelInverse[0].y, <$objectTransform$>._modelInverse[1].y, <$objectTransform$>._modelInverse[2].y);
|
|
vec3 mr2 = vec3(<$objectTransform$>._modelInverse[0].z, <$objectTransform$>._modelInverse[1].z, <$objectTransform$>._modelInverse[2].z);
|
|
|
|
vec3 mvc0 = vec3(dot(<$cameraTransform$>._viewInverse[0].xyz, mr0), dot(<$cameraTransform$>._viewInverse[0].xyz, mr1), dot(<$cameraTransform$>._viewInverse[0].xyz, mr2));
|
|
vec3 mvc1 = vec3(dot(<$cameraTransform$>._viewInverse[1].xyz, mr0), dot(<$cameraTransform$>._viewInverse[1].xyz, mr1), dot(<$cameraTransform$>._viewInverse[1].xyz, mr2));
|
|
vec3 mvc2 = vec3(dot(<$cameraTransform$>._viewInverse[2].xyz, mr0), dot(<$cameraTransform$>._viewInverse[2].xyz, mr1), dot(<$cameraTransform$>._viewInverse[2].xyz, mr2));
|
|
|
|
<$eyeDir$> = vec3(dot(mvc0, <$modelDir$>), dot(mvc1, <$modelDir$>), dot(mvc2, <$modelDir$>));
|
|
}
|
|
<@endfunc@>
|
|
|
|
<@func transformEyeToWorldDir(cameraTransform, eyeDir, worldDir)@>
|
|
{ // transformEyeToWorldDir
|
|
<$worldDir$> = vec3(<$cameraTransform$>._viewInverse * vec4(<$eyeDir$>.xyz, 0.0));
|
|
}
|
|
<@endfunc@>
|
|
|
|
<@func transformClipToEyeDir(cameraTransform, clipPos, eyeDir)@>
|
|
{ // transformClipToEyeDir
|
|
<$eyeDir$> = vec3(<$cameraTransform$>._projectionInverse * vec4(<$clipPos$>.xyz, 1.0)); // Must be 1.0 here
|
|
}
|
|
<@endfunc@>
|
|
|
|
<@func $transformModelToEyePos(cameraTransform, objectTransform, modelPos, eyePos)@>
|
|
<!// Equivalent to the following but hoppefully a tad more accurate
|
|
//return camera._view * object._model * pos; !>
|
|
{ // transformModelToEyePos
|
|
vec4 _worldpos = (<$objectTransform$>._model * vec4(<$modelPos$>.xyz, 1.0));
|
|
<$eyePos$> = (<$cameraTransform$>._view * _worldpos);
|
|
}
|
|
<@endfunc@>
|
|
|
|
<@func transformEyeToClipPos(cameraTransform, eyePos, clipPos)@>
|
|
{ // transformEyeToClipPos
|
|
<$clipPos$> = <$cameraTransform$>._projection * vec4(<$eyePos$>.xyz, 1.0);
|
|
}
|
|
<@endfunc@>
|
|
|
|
<@endif@>
|