mirror of
https://git.dev.opencascade.org/repos/occt.git
synced 2025-04-10 18:51:21 +03:00
0029519: Visualization, TKOpenGl - fallback to Graphic3d_TOSM_FACET from Gouraud/Phong when nodal normals are undefined
This commit is contained in:
parent
dc89236fee
commit
db5d29de1c
@ -1521,6 +1521,15 @@ Multiple changes have been applied to lights management within TKV3d and TKOpenG
|
|||||||
Dedicated classes only hides visibility of unrelated light properties depending on its type.
|
Dedicated classes only hides visibility of unrelated light properties depending on its type.
|
||||||
* Calling V3d_Viewer::UpdateLights() is no more required after modifying light sources properties (color, position, etc.).
|
* Calling V3d_Viewer::UpdateLights() is no more required after modifying light sources properties (color, position, etc.).
|
||||||
|
|
||||||
|
@subsection upgrade_730_shadingmodels Shading Models
|
||||||
|
|
||||||
|
*Graphic3d_AspectFillArea3d* has been extended by a new property ::ShadingModel(), which previously has been defined globally for entire View.
|
||||||
|
|
||||||
|
Previously, triangle array without normal vertex attributes was implicitly considered as unshaded,
|
||||||
|
but now such array will be shaded using *Graphic3d_TOSM_FACET* model (e.g. by computing per-triangle normals).
|
||||||
|
Therefore, *Graphic3d_TOSM_UNLIT* should be explicitly specified for disabling shading or triangles array.
|
||||||
|
Alternatively, material without reflectance properties can be used for disabling shading as before.
|
||||||
|
|
||||||
@subsection upgrade_730_tkopengl Custom low-level OpenGL elements
|
@subsection upgrade_730_tkopengl Custom low-level OpenGL elements
|
||||||
|
|
||||||
The following API changes should be considered while porting custom OpenGl_Element objects:
|
The following API changes should be considered while porting custom OpenGl_Element objects:
|
||||||
|
@ -733,11 +733,6 @@ void OpenGl_PrimitiveArray::Render (const Handle(OpenGl_Workspace)& theWorkspace
|
|||||||
myIsVboInit = Standard_True;
|
myIsVboInit = Standard_True;
|
||||||
}
|
}
|
||||||
|
|
||||||
const Standard_Boolean hasColorAttrib = !myVboAttribs.IsNull()
|
|
||||||
&& myVboAttribs->HasColorAttribute();
|
|
||||||
const Graphic3d_TypeOfShadingModel aShadingModel = aCtx->ShaderManager()->ChooseShadingModel (anAspectFace->ShadingModel(),
|
|
||||||
!myVboAttribs.IsNull() && myVboAttribs->HasNormalAttribute());
|
|
||||||
|
|
||||||
// Temporarily disable environment mapping
|
// Temporarily disable environment mapping
|
||||||
Handle(OpenGl_TextureSet) aTextureBack;
|
Handle(OpenGl_TextureSet) aTextureBack;
|
||||||
bool toDrawArray = true;
|
bool toDrawArray = true;
|
||||||
@ -758,14 +753,19 @@ void OpenGl_PrimitiveArray::Render (const Handle(OpenGl_Workspace)& theWorkspace
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Graphic3d_TypeOfShadingModel aShadingModel = Graphic3d_TOSM_UNLIT;
|
||||||
if (toDrawArray)
|
if (toDrawArray)
|
||||||
{
|
{
|
||||||
const bool toHilight = theWorkspace->ToHighlight();
|
const bool hasColorAttrib = !myVboAttribs.IsNull()
|
||||||
const Standard_Boolean hasVertColor = hasColorAttrib && !toHilight;
|
&& myVboAttribs->HasColorAttribute();
|
||||||
|
const bool toHilight = theWorkspace->ToHighlight();
|
||||||
|
const bool hasVertColor = hasColorAttrib && !toHilight;
|
||||||
|
const bool hasVertNorm = !myVboAttribs.IsNull() && myVboAttribs->HasNormalAttribute();
|
||||||
switch (myDrawMode)
|
switch (myDrawMode)
|
||||||
{
|
{
|
||||||
case GL_POINTS:
|
case GL_POINTS:
|
||||||
{
|
{
|
||||||
|
aShadingModel = aCtx->ShaderManager()->ChooseMarkerShadingModel (anAspectFace->ShadingModel(), hasVertNorm);
|
||||||
const Handle(OpenGl_TextureSet)& aSpriteNormRes = anAspectMarker->SpriteRes (aCtx);
|
const Handle(OpenGl_TextureSet)& aSpriteNormRes = anAspectMarker->SpriteRes (aCtx);
|
||||||
const OpenGl_PointSprite* aSpriteNorm = !aSpriteNormRes.IsNull() ? dynamic_cast<const OpenGl_PointSprite*> (aSpriteNormRes->First().get()) : NULL;
|
const OpenGl_PointSprite* aSpriteNorm = !aSpriteNormRes.IsNull() ? dynamic_cast<const OpenGl_PointSprite*> (aSpriteNormRes->First().get()) : NULL;
|
||||||
if (aSpriteNorm != NULL
|
if (aSpriteNorm != NULL
|
||||||
@ -786,6 +786,7 @@ void OpenGl_PrimitiveArray::Render (const Handle(OpenGl_Workspace)& theWorkspace
|
|||||||
case GL_LINES:
|
case GL_LINES:
|
||||||
case GL_LINE_STRIP:
|
case GL_LINE_STRIP:
|
||||||
{
|
{
|
||||||
|
aShadingModel = aCtx->ShaderManager()->ChooseLineShadingModel (anAspectFace->ShadingModel(), hasVertNorm);
|
||||||
aCtx->ShaderManager()->BindLineProgram (NULL,
|
aCtx->ShaderManager()->BindLineProgram (NULL,
|
||||||
anAspectLine->Aspect()->Type(),
|
anAspectLine->Aspect()->Type(),
|
||||||
aShadingModel,
|
aShadingModel,
|
||||||
@ -795,6 +796,7 @@ void OpenGl_PrimitiveArray::Render (const Handle(OpenGl_Workspace)& theWorkspace
|
|||||||
}
|
}
|
||||||
default:
|
default:
|
||||||
{
|
{
|
||||||
|
aShadingModel = aCtx->ShaderManager()->ChooseFaceShadingModel (anAspectFace->ShadingModel(), hasVertNorm);
|
||||||
const Handle(OpenGl_TextureSet)& aTextures = aCtx->ActiveTextures();
|
const Handle(OpenGl_TextureSet)& aTextures = aCtx->ActiveTextures();
|
||||||
const Standard_Boolean toEnableEnvMap = (!aTextures.IsNull() && (aTextures == theWorkspace->EnvironmentTexture()));
|
const Standard_Boolean toEnableEnvMap = (!aTextures.IsNull() && (aTextures == theWorkspace->EnvironmentTexture()));
|
||||||
aCtx->ShaderManager()->BindFaceProgram (aTextures,
|
aCtx->ShaderManager()->BindFaceProgram (aTextures,
|
||||||
|
@ -316,9 +316,10 @@ public:
|
|||||||
return myContext == theCtx;
|
return myContext == theCtx;
|
||||||
}
|
}
|
||||||
|
|
||||||
//! Choose Shading Model.
|
//! Choose Shading Model for filled primitives.
|
||||||
Graphic3d_TypeOfShadingModel ChooseShadingModel (Graphic3d_TypeOfShadingModel theCustomModel,
|
//! Fallbacks to FACET model if there are no normal attributes.
|
||||||
bool theHasNodalNormals) const
|
Graphic3d_TypeOfShadingModel ChooseFaceShadingModel (Graphic3d_TypeOfShadingModel theCustomModel,
|
||||||
|
bool theHasNodalNormals) const
|
||||||
{
|
{
|
||||||
if (!myContext->ColorMask())
|
if (!myContext->ColorMask())
|
||||||
{
|
{
|
||||||
@ -330,13 +331,42 @@ public:
|
|||||||
case Graphic3d_TOSM_DEFAULT:
|
case Graphic3d_TOSM_DEFAULT:
|
||||||
case Graphic3d_TOSM_UNLIT:
|
case Graphic3d_TOSM_UNLIT:
|
||||||
case Graphic3d_TOSM_FACET:
|
case Graphic3d_TOSM_FACET:
|
||||||
break;
|
return aModel;
|
||||||
case Graphic3d_TOSM_VERTEX:
|
case Graphic3d_TOSM_VERTEX:
|
||||||
case Graphic3d_TOSM_FRAGMENT:
|
case Graphic3d_TOSM_FRAGMENT:
|
||||||
aModel = theHasNodalNormals ? aModel : Graphic3d_TOSM_UNLIT;
|
return theHasNodalNormals ? aModel : Graphic3d_TOSM_FACET;
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
return aModel;
|
return Graphic3d_TOSM_UNLIT;
|
||||||
|
}
|
||||||
|
|
||||||
|
//! Choose Shading Model for line primitives.
|
||||||
|
//! Fallbacks to UNLIT model if there are no normal attributes.
|
||||||
|
Graphic3d_TypeOfShadingModel ChooseLineShadingModel (Graphic3d_TypeOfShadingModel theCustomModel,
|
||||||
|
bool theHasNodalNormals) const
|
||||||
|
{
|
||||||
|
if (!myContext->ColorMask())
|
||||||
|
{
|
||||||
|
return Graphic3d_TOSM_UNLIT;
|
||||||
|
}
|
||||||
|
Graphic3d_TypeOfShadingModel aModel = theCustomModel != Graphic3d_TOSM_DEFAULT ? theCustomModel : myShadingModel;
|
||||||
|
switch (aModel)
|
||||||
|
{
|
||||||
|
case Graphic3d_TOSM_DEFAULT:
|
||||||
|
case Graphic3d_TOSM_UNLIT:
|
||||||
|
case Graphic3d_TOSM_FACET:
|
||||||
|
return Graphic3d_TOSM_UNLIT;
|
||||||
|
case Graphic3d_TOSM_VERTEX:
|
||||||
|
case Graphic3d_TOSM_FRAGMENT:
|
||||||
|
return theHasNodalNormals ? aModel : Graphic3d_TOSM_UNLIT;
|
||||||
|
}
|
||||||
|
return Graphic3d_TOSM_UNLIT;
|
||||||
|
}
|
||||||
|
|
||||||
|
//! Choose Shading Model for Marker primitives.
|
||||||
|
Graphic3d_TypeOfShadingModel ChooseMarkerShadingModel (Graphic3d_TypeOfShadingModel theCustomModel,
|
||||||
|
bool theHasNodalNormals) const
|
||||||
|
{
|
||||||
|
return ChooseLineShadingModel (theCustomModel, theHasNodalNormals);
|
||||||
}
|
}
|
||||||
|
|
||||||
//! Returns default Shading Model.
|
//! Returns default Shading Model.
|
||||||
|
Loading…
x
Reference in New Issue
Block a user