Big Graphics update

Separated LightManager
Added Sprite class
Added View class
Camera is no longer a SceneNode
Fixed Material not invalidating programs
Renamed CameraPosition uniform to EyePosition
Renamed VisibilityTest to FrustumCull


Former-commit-id: ff7fbe4d9b31a3c269baab0b48c6faa347a12161
This commit is contained in:
Lynix
2013-08-21 20:05:33 +02:00
parent 09e3027129
commit c8414a39d8
39 changed files with 1772 additions and 556 deletions

View File

@@ -30,7 +30,7 @@ struct NzSceneImpl
NzClock updateClock;
NzColor ambientColor = NzColor(25,25,25);
NzSceneRoot root;
NzCamera* activeCamera;
NzAbstractViewer* viewer;
bool update;
float frameTime;
float updateTime;
@@ -64,9 +64,9 @@ void NzScene::AddToVisibilityList(NzUpdatable* object)
void NzScene::Cull()
{
#if NAZARA_GRAPHICS_SAFE
if (!m_impl->activeCamera)
if (!m_impl->viewer)
{
NazaraError("No active camera");
NazaraError("No viewer");
return;
}
#endif
@@ -76,8 +76,8 @@ void NzScene::Cull()
m_impl->visibleUpdateList.clear();
// Frustum culling/Viewport culling
RecursiveCameraCull(m_impl->renderTechnique->GetRenderQueue(), m_impl->activeCamera, &m_impl->root);
// Frustum culling
RecursiveFrustumCull(m_impl->renderTechnique->GetRenderQueue(), m_impl->viewer->GetFrustum(), &m_impl->root);
///TODO: Occlusion culling
@@ -87,22 +87,18 @@ void NzScene::Cull()
void NzScene::Draw()
{
#if NAZARA_GRAPHICS_SAFE
if (!m_impl->activeCamera)
if (!m_impl->viewer)
{
NazaraError("No active camera");
NazaraError("No viewer");
return;
}
#endif
m_impl->renderTechnique->Clear(this);
m_impl->viewer->ApplyView();
m_impl->renderTechnique->Draw(this);
}
NzCamera* NzScene::GetActiveCamera() const
{
return m_impl->activeCamera;
}
NzColor NzScene::GetAmbientColor() const
{
return m_impl->ambientColor;
@@ -123,6 +119,11 @@ NzSceneNode& NzScene::GetRoot() const
return m_impl->root;
}
NzAbstractViewer* NzScene::GetViewer() const
{
return m_impl->viewer;
}
float NzScene::GetUpdateTime() const
{
return m_impl->updateTime;
@@ -161,6 +162,11 @@ void NzScene::SetRenderTechnique(NzAbstractRenderTechnique* renderTechnique)
m_impl->renderTechnique.reset(renderTechnique);
}
void NzScene::SetViewer(NzAbstractViewer* viewer)
{
m_impl->viewer = viewer;
}
void NzScene::SetUpdatePerSecond(unsigned int updatePerSecond)
{
m_impl->updatePerSecond = updatePerSecond;
@@ -209,7 +215,7 @@ NzScene::operator const NzSceneNode&() const
return m_impl->root;
}
void NzScene::RecursiveCameraCull(NzAbstractRenderQueue* renderQueue, const NzCamera* camera, NzNode* node)
void NzScene::RecursiveFrustumCull(NzAbstractRenderQueue* renderQueue, const NzFrustumf& frustum, NzNode* node)
{
for (NzNode* child : node->GetChilds())
{
@@ -218,17 +224,12 @@ void NzScene::RecursiveCameraCull(NzAbstractRenderQueue* renderQueue, const NzCa
NzSceneNode* sceneNode = static_cast<NzSceneNode*>(child);
///TODO: Empêcher le rendu des enfants si le parent est cullé selon un flag
sceneNode->UpdateVisibility(camera);
sceneNode->UpdateVisibility(frustum);
if (sceneNode->IsVisible())
sceneNode->AddToRenderQueue(renderQueue);
}
if (child->HasChilds())
RecursiveCameraCull(renderQueue, camera, child);
RecursiveFrustumCull(renderQueue, frustum, child);
}
}
void NzScene::SetActiveCamera(NzCamera* camera)
{
m_impl->activeCamera = camera;
}