mirror of
https://github.com/overte-org/overte.git
synced 2025-08-04 04:03:35 +02:00
Merge pull request #12532 from samcake/RC65
RC65 Fix: Applying the fix for shadows and transitions on Dual Quat Skinned meshes
This commit is contained in:
commit
678584538d
4 changed files with 68 additions and 6 deletions
|
@ -100,6 +100,7 @@
|
||||||
#include "model_shadow_vert.h"
|
#include "model_shadow_vert.h"
|
||||||
#include "skin_model_shadow_vert.h"
|
#include "skin_model_shadow_vert.h"
|
||||||
#include "skin_model_shadow_dq_vert.h"
|
#include "skin_model_shadow_dq_vert.h"
|
||||||
|
#include "skin_model_shadow_fade_dq_vert.h"
|
||||||
|
|
||||||
#include "model_shadow_frag.h"
|
#include "model_shadow_frag.h"
|
||||||
#include "skin_model_shadow_frag.h"
|
#include "skin_model_shadow_frag.h"
|
||||||
|
@ -217,6 +218,7 @@ void initDeferredPipelines(render::ShapePlumber& plumber, const render::ShapePip
|
||||||
auto skinModelDualQuatVertex = skin_model_dq_vert::getShader();
|
auto skinModelDualQuatVertex = skin_model_dq_vert::getShader();
|
||||||
auto skinModelNormalMapDualQuatVertex = skin_model_normal_map_dq_vert::getShader();
|
auto skinModelNormalMapDualQuatVertex = skin_model_normal_map_dq_vert::getShader();
|
||||||
auto skinModelShadowDualQuatVertex = skin_model_shadow_dq_vert::getShader();
|
auto skinModelShadowDualQuatVertex = skin_model_shadow_dq_vert::getShader();
|
||||||
|
auto skinModelShadowFadeDualQuatVertex = skin_model_shadow_fade_dq_vert::getShader();
|
||||||
auto skinModelFadeDualQuatVertex = skin_model_fade_dq_vert::getShader();
|
auto skinModelFadeDualQuatVertex = skin_model_fade_dq_vert::getShader();
|
||||||
auto skinModelNormalMapFadeDualQuatVertex = skin_model_normal_map_fade_dq_vert::getShader();
|
auto skinModelNormalMapFadeDualQuatVertex = skin_model_normal_map_fade_dq_vert::getShader();
|
||||||
auto skinModelTranslucentDualQuatVertex = skinModelFadeDualQuatVertex; // We use the same because it ouputs world position per vertex
|
auto skinModelTranslucentDualQuatVertex = skinModelFadeDualQuatVertex; // We use the same because it ouputs world position per vertex
|
||||||
|
@ -490,7 +492,7 @@ void initDeferredPipelines(render::ShapePlumber& plumber, const render::ShapePip
|
||||||
// Same thing but with Fade on
|
// Same thing but with Fade on
|
||||||
addPipeline(
|
addPipeline(
|
||||||
Key::Builder().withMaterial().withSkinned().withDualQuatSkinned().withTranslucent().withFade(),
|
Key::Builder().withMaterial().withSkinned().withDualQuatSkinned().withTranslucent().withFade(),
|
||||||
skinModelFadeVertex, modelTranslucentFadePixel, batchSetter, itemSetter);
|
skinModelFadeDualQuatVertex, modelTranslucentFadePixel, batchSetter, itemSetter);
|
||||||
addPipeline(
|
addPipeline(
|
||||||
Key::Builder().withMaterial().withSkinned().withDualQuatSkinned().withTranslucent().withTangents().withFade(),
|
Key::Builder().withMaterial().withSkinned().withDualQuatSkinned().withTranslucent().withTangents().withFade(),
|
||||||
skinModelNormalMapFadeDualQuatVertex, modelTranslucentNormalMapFadePixel, batchSetter, itemSetter);
|
skinModelNormalMapFadeDualQuatVertex, modelTranslucentNormalMapFadePixel, batchSetter, itemSetter);
|
||||||
|
@ -515,6 +517,16 @@ void initDeferredPipelines(render::ShapePlumber& plumber, const render::ShapePip
|
||||||
addPipeline(
|
addPipeline(
|
||||||
Key::Builder().withSkinned().withDepthOnly().withFade(),
|
Key::Builder().withSkinned().withDepthOnly().withFade(),
|
||||||
skinModelShadowFadeVertex, modelShadowFadePixel, batchSetter, itemSetter);
|
skinModelShadowFadeVertex, modelShadowFadePixel, batchSetter, itemSetter);
|
||||||
|
|
||||||
|
// Now repeat for dual quaternion
|
||||||
|
// Depth-only
|
||||||
|
addPipeline(
|
||||||
|
Key::Builder().withSkinned().withDualQuatSkinned().withDepthOnly(),
|
||||||
|
skinModelShadowDualQuatVertex, modelShadowPixel, nullptr, nullptr);
|
||||||
|
// Same thing but with Fade on
|
||||||
|
addPipeline(
|
||||||
|
Key::Builder().withSkinned().withDualQuatSkinned().withDepthOnly().withFade(),
|
||||||
|
skinModelShadowFadeDualQuatVertex, modelShadowFadePixel, batchSetter, itemSetter);
|
||||||
}
|
}
|
||||||
|
|
||||||
void initForwardPipelines(ShapePlumber& plumber, const render::ShapePipeline::BatchSetter& batchSetter, const render::ShapePipeline::ItemSetter& itemSetter) {
|
void initForwardPipelines(ShapePlumber& plumber, const render::ShapePipeline::BatchSetter& batchSetter, const render::ShapePipeline::ItemSetter& itemSetter) {
|
||||||
|
@ -525,6 +537,10 @@ void initForwardPipelines(ShapePlumber& plumber, const render::ShapePipeline::Ba
|
||||||
auto skinModelNormalMapVertex = skin_model_normal_map_vert::getShader();
|
auto skinModelNormalMapVertex = skin_model_normal_map_vert::getShader();
|
||||||
auto skinModelNormalMapFadeVertex = skin_model_normal_map_fade_vert::getShader();
|
auto skinModelNormalMapFadeVertex = skin_model_normal_map_fade_vert::getShader();
|
||||||
|
|
||||||
|
auto skinModelDualQuatVertex = skin_model_dq_vert::getShader();
|
||||||
|
auto skinModelNormalMapDualQuatVertex = skin_model_normal_map_dq_vert::getShader();
|
||||||
|
auto skinModelNormalMapFadeDualQuatVertex = skin_model_normal_map_fade_dq_vert::getShader();
|
||||||
|
|
||||||
// Pixel shaders
|
// Pixel shaders
|
||||||
auto modelPixel = forward_model_frag::getShader();
|
auto modelPixel = forward_model_frag::getShader();
|
||||||
auto modelUnlitPixel = forward_model_unlit_frag::getShader();
|
auto modelUnlitPixel = forward_model_unlit_frag::getShader();
|
||||||
|
@ -568,6 +584,22 @@ void initForwardPipelines(ShapePlumber& plumber, const render::ShapePipeline::Ba
|
||||||
Key::Builder().withMaterial().withSkinned().withTangents().withFade(),
|
Key::Builder().withMaterial().withSkinned().withTangents().withFade(),
|
||||||
skinModelNormalMapFadeVertex, modelNormalMapFadePixel, batchSetter, itemSetter, nullptr, nullptr);
|
skinModelNormalMapFadeVertex, modelNormalMapFadePixel, batchSetter, itemSetter, nullptr, nullptr);
|
||||||
|
|
||||||
|
// Dual Quaternion
|
||||||
|
addPipeline(
|
||||||
|
Key::Builder().withMaterial().withSkinned().withDualQuatSkinned(),
|
||||||
|
skinModelDualQuatVertex, modelPixel, nullptr, nullptr);
|
||||||
|
addPipeline(
|
||||||
|
Key::Builder().withMaterial().withSkinned().withTangents().withDualQuatSkinned(),
|
||||||
|
skinModelNormalMapDualQuatVertex, modelNormalMapPixel, nullptr, nullptr);
|
||||||
|
addPipeline(
|
||||||
|
Key::Builder().withMaterial().withSkinned().withSpecular().withDualQuatSkinned(),
|
||||||
|
skinModelDualQuatVertex, modelSpecularMapPixel, nullptr, nullptr);
|
||||||
|
addPipeline(
|
||||||
|
Key::Builder().withMaterial().withSkinned().withTangents().withSpecular().withDualQuatSkinned(),
|
||||||
|
skinModelNormalMapDualQuatVertex, modelNormalSpecularMapPixel, nullptr, nullptr);
|
||||||
|
addPipeline(
|
||||||
|
Key::Builder().withMaterial().withSkinned().withTangents().withFade().withDualQuatSkinned(),
|
||||||
|
skinModelNormalMapFadeDualQuatVertex, modelNormalMapFadePixel, batchSetter, itemSetter, nullptr, nullptr);
|
||||||
}
|
}
|
||||||
|
|
||||||
void addPlumberPipeline(ShapePlumber& plumber,
|
void addPlumberPipeline(ShapePlumber& plumber,
|
||||||
|
@ -672,7 +704,7 @@ void initZPassPipelines(ShapePlumber& shapePlumber, gpu::StatePointer state) {
|
||||||
auto skinPixel = skin_model_shadow_frag::getShader();
|
auto skinPixel = skin_model_shadow_frag::getShader();
|
||||||
gpu::ShaderPointer skinProgram = gpu::Shader::createProgram(skinVertex, skinPixel);
|
gpu::ShaderPointer skinProgram = gpu::Shader::createProgram(skinVertex, skinPixel);
|
||||||
shapePlumber.addPipeline(
|
shapePlumber.addPipeline(
|
||||||
ShapeKey::Filter::Builder().withSkinned().withoutFade(),
|
ShapeKey::Filter::Builder().withSkinned().withoutDualQuatSkinned().withoutFade(),
|
||||||
skinProgram, state);
|
skinProgram, state);
|
||||||
|
|
||||||
auto modelFadeVertex = model_shadow_fade_vert::getShader();
|
auto modelFadeVertex = model_shadow_fade_vert::getShader();
|
||||||
|
@ -686,8 +718,21 @@ void initZPassPipelines(ShapePlumber& shapePlumber, gpu::StatePointer state) {
|
||||||
auto skinFadePixel = skin_model_shadow_fade_frag::getShader();
|
auto skinFadePixel = skin_model_shadow_fade_frag::getShader();
|
||||||
gpu::ShaderPointer skinFadeProgram = gpu::Shader::createProgram(skinFadeVertex, skinFadePixel);
|
gpu::ShaderPointer skinFadeProgram = gpu::Shader::createProgram(skinFadeVertex, skinFadePixel);
|
||||||
shapePlumber.addPipeline(
|
shapePlumber.addPipeline(
|
||||||
ShapeKey::Filter::Builder().withSkinned().withFade(),
|
ShapeKey::Filter::Builder().withSkinned().withoutDualQuatSkinned().withFade(),
|
||||||
skinFadeProgram, state);
|
skinFadeProgram, state);
|
||||||
|
|
||||||
|
//Added for dual quaternions
|
||||||
|
auto skinModelShadowDualQuatVertex = skin_model_shadow_dq_vert::getShader();
|
||||||
|
gpu::ShaderPointer skinModelShadowDualQuatProgram = gpu::Shader::createProgram(skinModelShadowDualQuatVertex, skinPixel);
|
||||||
|
shapePlumber.addPipeline(
|
||||||
|
ShapeKey::Filter::Builder().withSkinned().withDualQuatSkinned().withoutFade(),
|
||||||
|
skinModelShadowDualQuatProgram, state);
|
||||||
|
|
||||||
|
auto skinModelShadowFadeDualQuatVertex = skin_model_shadow_fade_dq_vert::getShader();
|
||||||
|
gpu::ShaderPointer skinModelShadowFadeDualQuatProgram = gpu::Shader::createProgram(skinModelShadowFadeDualQuatVertex, skinFadePixel);
|
||||||
|
shapePlumber.addPipeline(
|
||||||
|
ShapeKey::Filter::Builder().withSkinned().withDualQuatSkinned().withFade(),
|
||||||
|
skinModelShadowFadeDualQuatProgram, state);
|
||||||
}
|
}
|
||||||
|
|
||||||
#include "RenderPipelines.h"
|
#include "RenderPipelines.h"
|
||||||
|
|
|
@ -163,8 +163,10 @@ void RenderShadowMap::run(const render::RenderContextPointer& renderContext, con
|
||||||
|
|
||||||
auto shadowPipeline = _shapePlumber->pickPipeline(args, defaultKeyBuilder);
|
auto shadowPipeline = _shapePlumber->pickPipeline(args, defaultKeyBuilder);
|
||||||
auto shadowSkinnedPipeline = _shapePlumber->pickPipeline(args, defaultKeyBuilder.withSkinned());
|
auto shadowSkinnedPipeline = _shapePlumber->pickPipeline(args, defaultKeyBuilder.withSkinned());
|
||||||
|
auto shadowSkinnedDQPipeline = _shapePlumber->pickPipeline(args, defaultKeyBuilder.withSkinned().withDualQuatSkinned());
|
||||||
|
|
||||||
std::vector<ShapeKey> skinnedShapeKeys{};
|
std::vector<ShapeKey> skinnedShapeKeys{};
|
||||||
|
std::vector<ShapeKey> skinnedDQShapeKeys{};
|
||||||
std::vector<ShapeKey> ownPipelineShapeKeys{};
|
std::vector<ShapeKey> ownPipelineShapeKeys{};
|
||||||
|
|
||||||
// Iterate through all inShapes and render the unskinned
|
// Iterate through all inShapes and render the unskinned
|
||||||
|
@ -172,7 +174,11 @@ void RenderShadowMap::run(const render::RenderContextPointer& renderContext, con
|
||||||
batch.setPipeline(shadowPipeline->pipeline);
|
batch.setPipeline(shadowPipeline->pipeline);
|
||||||
for (auto items : inShapes) {
|
for (auto items : inShapes) {
|
||||||
if (items.first.isSkinned()) {
|
if (items.first.isSkinned()) {
|
||||||
skinnedShapeKeys.push_back(items.first);
|
if (items.first.isDualQuatSkinned()) {
|
||||||
|
skinnedDQShapeKeys.push_back(items.first);
|
||||||
|
} else {
|
||||||
|
skinnedShapeKeys.push_back(items.first);
|
||||||
|
}
|
||||||
} else if (!items.first.hasOwnPipeline()) {
|
} else if (!items.first.hasOwnPipeline()) {
|
||||||
renderItems(renderContext, items.second);
|
renderItems(renderContext, items.second);
|
||||||
} else {
|
} else {
|
||||||
|
@ -187,6 +193,13 @@ void RenderShadowMap::run(const render::RenderContextPointer& renderContext, con
|
||||||
renderItems(renderContext, inShapes.at(key));
|
renderItems(renderContext, inShapes.at(key));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Reiterate to render the DQ skinned
|
||||||
|
args->_shapePipeline = shadowSkinnedDQPipeline;
|
||||||
|
batch.setPipeline(shadowSkinnedDQPipeline->pipeline);
|
||||||
|
for (const auto& key : skinnedDQShapeKeys) {
|
||||||
|
renderItems(renderContext, inShapes.at(key));
|
||||||
|
}
|
||||||
|
|
||||||
// Finally render the items with their own pipeline last to prevent them from breaking the
|
// Finally render the items with their own pipeline last to prevent them from breaking the
|
||||||
// render state. This is probably a temporary code as there is probably something better
|
// render state. This is probably a temporary code as there is probably something better
|
||||||
// to do in the render call of objects that have their own pipeline.
|
// to do in the render call of objects that have their own pipeline.
|
||||||
|
|
|
@ -30,6 +30,7 @@ out vec3 _normal;
|
||||||
out vec3 _tangent;
|
out vec3 _tangent;
|
||||||
out vec3 _color;
|
out vec3 _color;
|
||||||
out float _alpha;
|
out float _alpha;
|
||||||
|
out vec4 _worldPosition;
|
||||||
|
|
||||||
void main(void) {
|
void main(void) {
|
||||||
vec4 position = vec4(0.0, 0.0, 0.0, 0.0);
|
vec4 position = vec4(0.0, 0.0, 0.0, 0.0);
|
||||||
|
@ -53,6 +54,7 @@ void main(void) {
|
||||||
TransformCamera cam = getTransformCamera();
|
TransformCamera cam = getTransformCamera();
|
||||||
TransformObject obj = getTransformObject();
|
TransformObject obj = getTransformObject();
|
||||||
<$transformModelToEyeAndClipPos(cam, obj, position, _position, gl_Position)$>
|
<$transformModelToEyeAndClipPos(cam, obj, position, _position, gl_Position)$>
|
||||||
|
<$transformModelToWorldPos(obj, position, _worldPosition)$>
|
||||||
<$transformModelToWorldDir(cam, obj, interpolatedNormal.xyz, interpolatedNormal.xyz)$>
|
<$transformModelToWorldDir(cam, obj, interpolatedNormal.xyz, interpolatedNormal.xyz)$>
|
||||||
<$transformModelToWorldDir(cam, obj, interpolatedTangent.xyz, interpolatedTangent.xyz)$>
|
<$transformModelToWorldDir(cam, obj, interpolatedTangent.xyz, interpolatedTangent.xyz)$>
|
||||||
|
|
||||||
|
|
|
@ -135,8 +135,8 @@ public:
|
||||||
Builder& withSkinned() { _flags.set(SKINNED); _mask.set(SKINNED); return (*this); }
|
Builder& withSkinned() { _flags.set(SKINNED); _mask.set(SKINNED); return (*this); }
|
||||||
Builder& withoutSkinned() { _flags.reset(SKINNED); _mask.set(SKINNED); return (*this); }
|
Builder& withoutSkinned() { _flags.reset(SKINNED); _mask.set(SKINNED); return (*this); }
|
||||||
|
|
||||||
Builder& withDualQuatSkinned() { _flags.set(DUAL_QUAT_SKINNED); _mask.set(SKINNED); return (*this); }
|
Builder& withDualQuatSkinned() { _flags.set(DUAL_QUAT_SKINNED); _mask.set(DUAL_QUAT_SKINNED); return (*this); }
|
||||||
Builder& withoutDualQuatSkinned() { _flags.reset(DUAL_QUAT_SKINNED); _mask.set(SKINNED); return (*this); }
|
Builder& withoutDualQuatSkinned() { _flags.reset(DUAL_QUAT_SKINNED); _mask.set(DUAL_QUAT_SKINNED); return (*this); }
|
||||||
|
|
||||||
Builder& withDepthOnly() { _flags.set(DEPTH_ONLY); _mask.set(DEPTH_ONLY); return (*this); }
|
Builder& withDepthOnly() { _flags.set(DEPTH_ONLY); _mask.set(DEPTH_ONLY); return (*this); }
|
||||||
Builder& withoutDepthOnly() { _flags.reset(DEPTH_ONLY); _mask.set(DEPTH_ONLY); return (*this); }
|
Builder& withoutDepthOnly() { _flags.reset(DEPTH_ONLY); _mask.set(DEPTH_ONLY); return (*this); }
|
||||||
|
@ -176,6 +176,7 @@ public:
|
||||||
bool isUnlit() const { return _flags[UNLIT]; }
|
bool isUnlit() const { return _flags[UNLIT]; }
|
||||||
bool isTranslucent() const { return _flags[TRANSLUCENT]; }
|
bool isTranslucent() const { return _flags[TRANSLUCENT]; }
|
||||||
bool isSkinned() const { return _flags[SKINNED]; }
|
bool isSkinned() const { return _flags[SKINNED]; }
|
||||||
|
bool isDualQuatSkinned() const { return _flags[DUAL_QUAT_SKINNED]; }
|
||||||
bool isDepthOnly() const { return _flags[DEPTH_ONLY]; }
|
bool isDepthOnly() const { return _flags[DEPTH_ONLY]; }
|
||||||
bool isDepthBiased() const { return _flags[DEPTH_BIAS]; }
|
bool isDepthBiased() const { return _flags[DEPTH_BIAS]; }
|
||||||
bool isWireframe() const { return _flags[WIREFRAME]; }
|
bool isWireframe() const { return _flags[WIREFRAME]; }
|
||||||
|
@ -216,6 +217,7 @@ inline QDebug operator<<(QDebug debug, const ShapeKey& key) {
|
||||||
<< "isUnlit:" << key.isUnlit()
|
<< "isUnlit:" << key.isUnlit()
|
||||||
<< "isTranslucent:" << key.isTranslucent()
|
<< "isTranslucent:" << key.isTranslucent()
|
||||||
<< "isSkinned:" << key.isSkinned()
|
<< "isSkinned:" << key.isSkinned()
|
||||||
|
<< "isDualQuatSkinned:" << key.isDualQuatSkinned()
|
||||||
<< "isDepthOnly:" << key.isDepthOnly()
|
<< "isDepthOnly:" << key.isDepthOnly()
|
||||||
<< "isDepthBiased:" << key.isDepthBiased()
|
<< "isDepthBiased:" << key.isDepthBiased()
|
||||||
<< "isWireframe:" << key.isWireframe()
|
<< "isWireframe:" << key.isWireframe()
|
||||||
|
|
Loading…
Reference in a new issue