summaryrefslogtreecommitdiffstats
path: root/src/runtimerender/rendererimpl/Qt3DSRenderableObjects.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/runtimerender/rendererimpl/Qt3DSRenderableObjects.cpp')
-rw-r--r--src/runtimerender/rendererimpl/Qt3DSRenderableObjects.cpp111
1 files changed, 85 insertions, 26 deletions
diff --git a/src/runtimerender/rendererimpl/Qt3DSRenderableObjects.cpp b/src/runtimerender/rendererimpl/Qt3DSRenderableObjects.cpp
index fff7e32..e3b570d 100644
--- a/src/runtimerender/rendererimpl/Qt3DSRenderableObjects.cpp
+++ b/src/runtimerender/rendererimpl/Qt3DSRenderableObjects.cpp
@@ -96,8 +96,8 @@ namespace render {
SShadowMapEntry *inShadowMapEntry)
{
NVRenderContext &context(m_Generator.GetContext());
- SRenderableDepthPrepassShader *shader = NULL;
- NVRenderInputAssembler *pIA = NULL;
+ SRenderableDepthPrepassShader *shader = nullptr;
+ NVRenderInputAssembler *pIA = nullptr;
/*
if ( inLight->m_LightType == RenderLightTypes::Area )
@@ -114,7 +114,7 @@ namespace render {
else
shader = m_Generator.GetCubeShadowDepthShader(m_TessellationMode);
- if (shader == NULL || inShadowMapEntry == NULL)
+ if (shader == nullptr || inShadowMapEntry == nullptr)
return;
// for phong and npatch tesselleation we need the normals too
@@ -144,7 +144,7 @@ namespace render {
shader->m_Projection.Set( inCamera.m_Projection );
*/
- // tesselation
+ // tessellation
if (m_TessellationMode != TessModeValues::NoTess) {
// set uniforms we need
shader->m_Tessellation.m_EdgeTessLevel.Set(m_Subset.m_EdgeTessFactor);
@@ -166,17 +166,18 @@ namespace render {
float inDisplacementAmount)
{
NVRenderContext &context(m_Generator.GetContext());
- SRenderableDepthPrepassShader *shader = NULL;
- NVRenderInputAssembler *pIA = NULL;
+ SRenderableDepthPrepassShader *shader = nullptr;
+ NVRenderInputAssembler *pIA = nullptr;
SRenderableImage *displacementImage = inDisplacementImage;
- if (m_Subset.m_PrimitiveType != NVRenderDrawMode::Patches)
- shader = m_Generator.GetDepthPrepassShader(displacementImage != NULL);
- else
+ if (m_Subset.m_PrimitiveType != NVRenderDrawMode::Patches) {
+ shader = m_Generator.GetDepthPrepassShader(displacementImage != nullptr);
+ } else {
shader = m_Generator.GetDepthTessPrepassShader(m_TessellationMode,
- displacementImage != NULL);
+ displacementImage != nullptr);
+ }
- if (shader == NULL)
+ if (shader == nullptr)
return;
// for phong and npatch tesselleation or displacement mapping we need the normals (and uv's)
@@ -214,7 +215,7 @@ namespace render {
displacementImage->m_Image.m_TextureData.m_Texture);
}
- // tesselation
+ // tessellation
if (m_TessellationMode != TessModeValues::NoTess) {
// set uniforms we need
shader->m_GlobalTransform.Set(m_GlobalTransform);
@@ -241,12 +242,18 @@ namespace render {
// An interface to the shader generator that is available to the renderables
- void SSubsetRenderable::Render(const QT3DSVec2 &inCameraVec, TShaderFeatureSet inFeatureSet)
+ void SSubsetRenderable::Render(const QT3DSVec2 &inCameraVec, TShaderFeatureSet inFeatureSet,
+ bool depth)
{
NVRenderContext &context(m_Generator.GetContext());
+ SShaderGeneratorGeneratedShader *shader = nullptr;
- SShaderGeneratorGeneratedShader *shader = m_Generator.GetShader(*this, inFeatureSet);
- if (shader == NULL)
+ // Do not render if alpha test is enabled, but no alpha test in object or vice versa
+ if (m_Generator.alphaTestEnabled() ^ m_RenderableFlags.hasAlphaTest())
+ return;
+
+ shader = m_Generator.GetShader(*this, inFeatureSet, depth);
+ if (shader == nullptr)
return;
context.SetActiveShader(&shader->m_Shader);
@@ -254,9 +261,10 @@ namespace render {
m_Generator.GetQt3DSContext().GetDefaultMaterialShaderGenerator().SetMaterialProperties(
shader->m_Shader, m_Material, inCameraVec, m_ModelContext.m_ModelViewProjection,
m_ModelContext.m_NormalMatrix, m_ModelContext.m_Model.m_GlobalTransform, m_FirstImage,
- m_Opacity, m_Generator.GetLayerGlobalRenderProperties());
+ m_Opacity, m_Generator.GetLayerGlobalRenderProperties(),
+ QT3DSVec2(m_Generator.alphaOpRef()));
- // tesselation
+ // tessellation
if (m_Subset.m_PrimitiveType == NVRenderDrawMode::Patches) {
shader->m_Tessellation.m_EdgeTessLevel.Set(m_Subset.m_EdgeTessFactor);
shader->m_Tessellation.m_InsideTessLevel.Set(m_Subset.m_InnerTessFactor);
@@ -287,11 +295,56 @@ namespace render {
context.Draw(m_Subset.m_PrimitiveType, m_Subset.m_Count, m_Subset.m_Offset);
}
+ void SSubsetRenderable::RenderShadow(const QT3DSVec2 &inCameraVec,
+ TShaderFeatureSet inFeatureSet, const SLight *inLight,
+ const SCamera &inCamera, SShadowMapEntry *inShadowMapEntry)
+ {
+ NVRenderContext &context(m_Generator.GetContext());
+ SRenderableDepthPrepassShader *shader = nullptr;
+
+ // Do not render if alpha test is enabled, but no alpha test in object or vice versa
+ if (m_Generator.alphaTestEnabled() ^ m_RenderableFlags.hasAlphaTest())
+ return;
+
+ shader = m_Generator.GetShadowShader(*this, inFeatureSet, inLight->m_LightType);
+ if (shader == nullptr || inShadowMapEntry == nullptr)
+ return;
+
+ QT3DSMat44 theModelViewProjection = inShadowMapEntry->m_LightVP * m_GlobalTransform;
+
+ context.SetActiveShader(&shader->m_Shader);
+ m_Generator.GetQt3DSContext().GetDefaultMaterialShaderGenerator().SetMaterialProperties(
+ shader->m_Shader, m_Material, inCameraVec, m_ModelContext.m_ModelViewProjection,
+ m_ModelContext.m_NormalMatrix, m_ModelContext.m_Model.m_GlobalTransform, m_FirstImage,
+ m_Opacity, m_Generator.GetLayerGlobalRenderProperties(),
+ QT3DSVec2(m_Generator.alphaOpRef()));
+
+ shader->m_MVP.Set(theModelViewProjection);
+ shader->m_CameraPosition.Set(inCamera.m_Position);
+ shader->m_GlobalTransform.Set(m_GlobalTransform);
+ shader->m_CameraProperties.Set(inCameraVec);
+
+ // tessellation
+ if (m_Subset.m_PrimitiveType == NVRenderDrawMode::Patches) {
+ shader->m_Tessellation.m_EdgeTessLevel.Set(m_Subset.m_EdgeTessFactor);
+ shader->m_Tessellation.m_InsideTessLevel.Set(m_Subset.m_InnerTessFactor);
+ // the blend value is hardcoded
+ shader->m_Tessellation.m_PhongBlend.Set(0.75);
+ // this should finally be based on some user input
+ shader->m_Tessellation.m_DistanceRange.Set(inCameraVec);
+ // enable culling
+ shader->m_Tessellation.m_DisableCulling.Set(0.0);
+ }
+
+ context.SetInputAssembler(m_Subset.m_InputAssembler);
+ context.Draw(m_Subset.m_PrimitiveType, m_Subset.m_Count, m_Subset.m_Offset);
+ }
+
void SSubsetRenderable::RenderDepthPass(const QT3DSVec2 &inCameraVec)
{
- SRenderableImage *displacementImage = NULL;
+ SRenderableImage *displacementImage = nullptr;
for (SRenderableImage *theImage = m_FirstImage;
- theImage != NULL && displacementImage == NULL; theImage = theImage->m_NextImage) {
+ theImage != nullptr && displacementImage == nullptr; theImage = theImage->m_NextImage) {
if (theImage->m_MapType == ImageMapTypes::Displacement)
displacementImage = theImage;
}
@@ -302,11 +355,13 @@ namespace render {
void STextRenderable::Render(const QT3DSVec2 &inCameraVec)
{
NVRenderContext &context(m_Generator.GetContext());
+ if (m_Generator.alphaTestEnabled())
+ return;
if (!m_Text.m_PathFontDetails) {
STextRenderHelper theInfo = m_Generator.GetShader(*this, false);
- if (theInfo.m_Shader == NULL)
+ if (theInfo.m_Shader == nullptr)
return;
// All of our shaders produce premultiplied values.
qt3ds::render::NVRenderBlendFunctionArgument blendFunc(
@@ -330,7 +385,7 @@ namespace render {
QT3DS_ASSERT(context.IsPathRenderingSupported() && context.IsProgramPipelineSupported());
STextRenderHelper theInfo = m_Generator.GetShader(*this, true);
- if (theInfo.m_Shader == NULL)
+ if (theInfo.m_Shader == nullptr)
return;
// All of our shaders produce premultiplied values.
@@ -357,7 +412,7 @@ namespace render {
{
NVRenderContext &context(m_Generator.GetContext());
STextDepthShader *theDepthShader = m_Generator.GetTextDepthShader();
- if (theDepthShader == NULL)
+ if (theDepthShader == nullptr || m_Generator.alphaTestEnabled())
return;
if (!m_Text.m_PathFontDetails) {
@@ -403,7 +458,7 @@ namespace render {
theDepthFunction, false, theArg, theArg, theOpArg,
theOpArg);
- context.SetActiveShader(NULL);
+ context.SetActiveShader(nullptr);
context.SetCullingEnabled(false);
context.SetDepthStencilState(depthStencilState);
@@ -451,6 +506,8 @@ namespace render {
const NVRenderTexture2D *inSsaoTexture,
TShaderFeatureSet inFeatureSet)
{
+ if (m_Generator.alphaTestEnabled())
+ return;
IQt3DSRenderContext &qt3dsContext(m_Generator.GetQt3DSContext());
SCustomMaterialRenderContext theRenderContext(
inLayer, inLayerData, inLights, inCamera, m_ModelContext.m_Model, m_Subset,
@@ -468,13 +525,15 @@ namespace render {
const SCamera & /*inCamera*/,
const NVRenderTexture2D * /*inDepthTexture*/)
{
-
+ if (m_Generator.alphaTestEnabled())
+ return;
IQt3DSRenderContext &qt3dsContext(m_Generator.GetQt3DSContext());
if (!qt3dsContext.GetCustomMaterialSystem().RenderDepthPrepass(
m_ModelContext.m_ModelViewProjection, m_Material, m_Subset)) {
- SRenderableImage *displacementImage = NULL;
+ SRenderableImage *displacementImage = nullptr;
for (SRenderableImage *theImage = m_FirstImage;
- theImage != NULL && displacementImage == NULL; theImage = theImage->m_NextImage) {
+ theImage != nullptr && displacementImage == nullptr;
+ theImage = theImage->m_NextImage) {
if (theImage->m_MapType == ImageMapTypes::Displacement)
displacementImage = theImage;
}