Modified SceneNode::FrustumCull

Now provides an implementation which will test the bounding volume
against the frustum (Basic frustum culling)
Is now const
Disabled face culling on sprites


Former-commit-id: 5cb7a94b38ef8b0ffa5a78f16f5ef65a59ab375d
This commit is contained in:
Lynix 2014-06-05 21:28:17 +02:00
parent bc9c8c6bdb
commit a31ced1d76
10 changed files with 13 additions and 36 deletions

View File

@ -53,7 +53,7 @@ class NAZARA_API NzLight : public NzSceneNode
static void Disable(const NzShader* program, const NzLightUniforms& uniforms, int offset = 0);
private:
bool FrustumCull(const NzFrustumf& frustum) override;
bool FrustumCull(const NzFrustumf& frustum) const override;
void InvalidateNode() override;
void Register() override;
void Unregister() override;

View File

@ -86,7 +86,6 @@ class NAZARA_API NzModel : public NzSceneNode
NzModel& operator=(NzModel&& node);
protected:
bool FrustumCull(const NzFrustumf& frustum) override;
void InvalidateNode() override;
virtual void UpdateBoundingVolume() const;

View File

@ -40,9 +40,9 @@ class NAZARA_API NzSceneNode : public NzNode
NzSceneNode& operator=(NzSceneNode&& sceneNode);
protected:
virtual bool FrustumCull(const NzFrustumf& frustum) const;
virtual void OnParenting(const NzNode* parent) override;
virtual void OnVisibilityChange(bool visibility);
virtual bool FrustumCull(const NzFrustumf& frustum) = 0;
void RecursiveSetScene(NzScene* scene, NzNode* node);
virtual void Register();
void SetScene(NzScene* scene);

View File

@ -26,7 +26,6 @@ class NAZARA_API NzSceneRoot : public NzSceneNode
NzSceneRoot(NzScene* scene);
virtual ~NzSceneRoot();
bool FrustumCull(const NzFrustumf& frustum) override;
void Register();
void Unregister();
};

View File

@ -37,7 +37,6 @@ class NAZARA_API NzSprite : public NzSceneNode
void SetTextureRect(const NzRectui& rect);
private:
bool FrustumCull(const NzFrustumf& frustum) override;
void InvalidateNode() override;
void Register() override;
void Unregister() override;

View File

@ -229,7 +229,7 @@ void NzLight::Disable(const NzShader* shader, const NzLightUniforms& uniforms, i
shader->SendInteger(uniforms.locations.type + offset, -1);
}
bool NzLight::FrustumCull(const NzFrustumf& frustum)
bool NzLight::FrustumCull(const NzFrustumf& frustum) const
{
switch (m_type)
{
@ -244,10 +244,7 @@ bool NzLight::FrustumCull(const NzFrustumf& frustum)
return frustum.Contains(NzSpheref(m_derivedPosition, m_radius));
case nzLightType_Spot:
if (!m_boundingVolumeUpdated)
UpdateBoundingVolume();
return frustum.Contains(m_boundingVolume);
return NzSceneNode::FrustumCull(frustum);
}
NazaraError("Invalid light type (0x" + NzString::Number(m_type, 16) + ')');

View File

@ -438,14 +438,6 @@ NzModel& NzModel::operator=(NzModel&& node)
return *this;
}
bool NzModel::FrustumCull(const NzFrustumf& frustum)
{
if (!m_boundingVolumeUpdated)
UpdateBoundingVolume();
return frustum.Contains(m_boundingVolume);
}
void NzModel::InvalidateNode()
{
NzSceneNode::InvalidateNode();

View File

@ -73,6 +73,11 @@ NzSceneNode& NzSceneNode::operator=(NzSceneNode&& sceneNode)
return *this;
}
bool NzSceneNode::FrustumCull(const NzFrustumf& frustum) const
{
return frustum.Contains(GetBoundingVolume());
}
void NzSceneNode::OnParenting(const NzNode* parent)
{
if (parent)

View File

@ -36,13 +36,6 @@ bool NzSceneRoot::IsDrawable() const
return true;
}
bool NzSceneRoot::FrustumCull(const NzFrustumf& frustum)
{
NazaraUnused(frustum);
return true; // Toujours visible
}
void NzSceneRoot::Register()
{
NazaraInternalError("SceneNode::Register() called on SceneRoot");

View File

@ -116,10 +116,11 @@ void NzSprite::SetSize(const NzVector2f& size)
void NzSprite::SetTexture(NzTexture* texture, bool resizeSprite)
{
std::unique_ptr<NzMaterial> material(new NzMaterial);
material->Enable(nzRendererParameter_DepthBuffer, false);
material->SetPersistent(false);
material->Enable(nzRendererParameter_FaceCulling, false);
material->EnableLighting(false);
material->SetDiffuseMap(texture);
material->SetPersistent(false);
SetMaterial(material.get(), resizeSprite);
material.release();
@ -154,14 +155,6 @@ void NzSprite::SetTextureRect(const NzRectui& rect)
SetTextureCoords(NzRectf(invWidth*rect.x, invHeight*rect.y, invWidth*rect.width, invHeight*rect.height));
}
bool NzSprite::FrustumCull(const NzFrustumf& frustum)
{
if (!m_boundingVolumeUpdated)
UpdateBoundingVolume();
return frustum.Contains(m_boundingVolume);
}
void NzSprite::InvalidateNode()
{
NzSceneNode::InvalidateNode();
@ -180,7 +173,7 @@ void NzSprite::Unregister()
void NzSprite::UpdateBoundingVolume() const
{
if (m_boundingVolume.IsNull())
m_boundingVolume.Set(-m_size.x*0.5f, -m_size.y*0.5f, 0, m_size.x, m_size.y, 0.f);
m_boundingVolume.Set(-m_size.x*0.5f, -m_size.y*0.5f, 0.f, m_size.x, m_size.y, 0.f);
if (!m_transformMatrixUpdated)
UpdateTransformMatrix();