/* -----------------------------------------------------------------------------
	GSFramework
	Copyright 2001-2013 Emmanuel Julien. All Rights Reserved.
----------------------------------------------------------------------------- */


#ifndef	__NSCENEPROFILER__
#define	__NSCENEPROFILER__


		#include "timing/profiler.h"


namespace GS {
	namespace S3D { class Scene; }

/*!
	@short	Scene profiler.
	@author	Emmanuel Julien (ejulien@owloh.com)
*/
struct	SceneProfiler : public Profiler
{
		S3D::Scene	&scene;

public:

		System		*update, *process_queues, *update_triggers, *update_item_transformation, *update_skin, *scene_on_update, *items_on_update, *physic_step, *synchronize_physics, *ui_update;
		System		*push_to_render, *push_active_list, *push_simple_culling, *push_octree_culling;

virtual	void		ResetProfiles();

		SceneProfiler(S3D::Scene &s) : scene(s)
		{
			// Update
			update = DeclareSystem("Update");

			process_queues = DeclareSystem("Process queues", update);
			update_triggers = DeclareSystem("Update triggers", update);
			update_item_transformation = DeclareSystem("Update item transformation", update);
			update_skin = DeclareSystem("Update item skin", update);

			scene_on_update = DeclareSystem("Script scene OnUpdate()", update);
			items_on_update = DeclareSystem("Script items OnUpdate()", update);

			physic_step = DeclareSystem("Physic step", update);
			synchronize_physics = DeclareSystem("Physics synchronization", update);

			ui_update = DeclareSystem("Update UI", update);

			// Push to render
			push_to_render = DeclareSystem("Push to render");

			push_active_list = DeclareSystem("Push active list", push_to_render);
			push_simple_culling = DeclareSystem("Push simple renderable", push_to_render);
			push_octree_culling = DeclareSystem("Push octree renderable", push_to_render);
		}
};

} // GS


#endif	// __NSCENEPROFILER__
