/*******************************************************************************
 * statspov.h
 *
 * This module contains all defines, typedefs, and prototypes for statspov.cpp.
 *
 * ---------------------------------------------------------------------------
 * Persistence of Vision Ray Tracer ('POV-Ray') version 3.7.
 * Copyright 1991-2013 Persistence of Vision Raytracer Pty. Ltd.
 *
 * POV-Ray is free software: you can redistribute it and/or modify
 * it under the terms of the GNU Affero General Public License as
 * published by the Free Software Foundation, either version 3 of the
 * License, or (at your option) any later version.
 *
 * POV-Ray is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU Affero General Public License for more details.
 *
 * You should have received a copy of the GNU Affero General Public License
 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
 * ---------------------------------------------------------------------------
 * POV-Ray is based on the popular DKB raytracer version 2.12.
 * DKBTrace was originally written by David K. Buck.
 * DKBTrace Ver 2.0-2.12 were written by David K. Buck & Aaron A. Collins.
 * ---------------------------------------------------------------------------
 * $File: //depot/public/povray/3.x/source/statspov.h $
 * $Revision: #1 $
 * $Change: 6069 $
 * $DateTime: 2013/11/06 11:59:40 $
 * $Author: chrisc $
 *******************************************************************************/

#ifndef STATSPOV_H
#define STATSPOV_H

#include "base/types.h"
#include "backend/frame.h"

namespace pov
{

typedef enum INTSTATS
{
	/* Computations are performed on these three */
	Number_Of_Pixels = 0,
	Number_Of_Pixels_Supersampled,
	Number_Of_Samples,
	Number_Of_Rays,
	Calls_To_DNoise,
	Calls_To_Noise,
	ADC_Saves,

	/* intersecion stack */
	Istack_overflows,

	/* objects */
	Ray_RBezier_Tests,
	Ray_RBezier_Tests_Succeeded,
	Ray_Bicubic_Tests,
	Ray_Bicubic_Tests_Succeeded,
	Ray_Blob_Tests,
	Ray_Blob_Tests_Succeeded,
	Blob_Element_Tests,
	Blob_Element_Tests_Succeeded,
	Blob_Bound_Tests,
	Blob_Bound_Tests_Succeeded,
	Ray_Box_Tests,
	Ray_Box_Tests_Succeeded,
	Ray_Cone_Tests,
	Ray_Cone_Tests_Succeeded,
	Ray_CSG_Intersection_Tests,
	Ray_CSG_Intersection_Tests_Succeeded,
	Ray_CSG_Merge_Tests,
	Ray_CSG_Merge_Tests_Succeeded,
	Ray_CSG_Union_Tests,
	Ray_CSG_Union_Tests_Succeeded,
	Ray_Disc_Tests,
	Ray_Disc_Tests_Succeeded,
	Ray_Fractal_Tests,
	Ray_Fractal_Tests_Succeeded,
	Ray_HField_Tests,
	Ray_HField_Tests_Succeeded,
	Ray_HField_Box_Tests,
	Ray_HField_Box_Tests_Succeeded,
	Ray_HField_Triangle_Tests,
	Ray_HField_Triangle_Tests_Succeeded,
	Ray_HField_Block_Tests,
	Ray_HField_Block_Tests_Succeeded,
	Ray_HField_Cell_Tests,
	Ray_HField_Cell_Tests_Succeeded,
	Ray_IsoSurface_Tests,
	Ray_IsoSurface_Tests_Succeeded,
	Ray_IsoSurface_Bound_Tests,
	Ray_IsoSurface_Bound_Tests_Succeeded,
	Ray_IsoSurface_Cache,
	Ray_IsoSurface_Cache_Succeeded,
	Ray_Lathe_Tests,
	Ray_Lathe_Tests_Succeeded,
	Lathe_Bound_Tests,
	Lathe_Bound_Tests_Succeeded,
	Ray_Mesh_Tests,
	Ray_Mesh_Tests_Succeeded,
	Ray_Ovus_Tests,
	Ray_Ovus_Tests_Succeeded,
	Ray_Plane_Tests,
	Ray_Plane_Tests_Succeeded,
	Ray_Polygon_Tests,
	Ray_Polygon_Tests_Succeeded,
	Ray_Prism_Tests,
	Ray_Prism_Tests_Succeeded,
	Prism_Bound_Tests,
	Prism_Bound_Tests_Succeeded,
	Ray_Parametric_Tests,
	Ray_Parametric_Tests_Succeeded,
	Ray_Par_Bound_Tests,
	Ray_Par_Bound_Tests_Succeeded,
	Ray_Quadric_Tests,
	Ray_Quadric_Tests_Succeeded,
	Ray_Poly_Tests,
	Ray_Poly_Tests_Succeeded,
	Ray_Sphere_Tests,
	Ray_Sphere_Tests_Succeeded,
	Ray_Sphere_Sweep_Tests,
	Ray_Sphere_Sweep_Tests_Succeeded,
	Ray_Superellipsoid_Tests,
	Ray_Superellipsoid_Tests_Succeeded,
	Ray_Sor_Tests,
	Ray_Sor_Tests_Succeeded,
	Sor_Bound_Tests,
	Sor_Bound_Tests_Succeeded,
	Ray_Torus_Tests,
	Ray_Torus_Tests_Succeeded,
	Torus_Bound_Tests,
	Torus_Bound_Tests_Succeeded,
	Ray_Triangle_Tests,
	Ray_Triangle_Tests_Succeeded,
	Ray_TTF_Tests,
	Ray_TTF_Tests_Succeeded,

	/* crackle cache */
	CrackleCache_Tests,
	CrackleCache_Tests_Succeeded,

	/* bounding etc */
	Bounding_Region_Tests,
	Bounding_Region_Tests_Succeeded,
	Clipping_Region_Tests,
	Clipping_Region_Tests_Succeeded,

	/* isosurface and functions */
	Ray_IsoSurface_Find_Root,
	Ray_Function_VM_Calls,
	Ray_Function_VM_Instruction_Est,

	/* Vista and light buffer */
	VBuffer_Tests,
	VBuffer_Tests_Succeeded,
	LBuffer_Tests,
	LBuffer_Tests_Succeeded,

	/* Media */
	Media_Samples,
	Media_Intervals,

	/* Ray */
	Reflected_Rays_Traced,
	Refracted_Rays_Traced,
	Transmitted_Rays_Traced,
	Internal_Reflected_Rays_Traced,
	Shadow_Cache_Hits,
	Shadow_Rays_Succeeded,
	Shadow_Ray_Tests,

	nChecked,
	nEnqueued,
	totalQueues,
	totalQueueResets,
	totalQueueResizes,
	Polynomials_Tested,
	Roots_Eliminated,

#if defined(MEM_STATS)
	MemStat_Smallest_Alloc,
	MemStat_Largest_Alloc,
	MemStat_Largest_Mem_Usage,
#if (MEM_STATS>=2)
	MemStat_Total_Allocs,
	MemStat_Total_Frees,
#endif
#endif

	/* NK phmap */
	Number_Of_Photons_Shot,
	Number_Of_Photons_Stored,
	Number_Of_Global_Photons_Stored,
	Number_Of_Media_Photons_Stored,
	Priority_Queue_Add,
	Priority_Queue_Remove,
	Gather_Performed_Count,
	Gather_Expanded_Count,

	// [CLi] radiosity total stats (all pre- & final traces, all recursion depths)
	Radiosity_ReuseCount,             // ambient value queries satisfied without taking a new sample
	Radiosity_GatherCount,            // number of samples gathered
	Radiosity_UnsavedCount,           // number of samples gathered but not stored in cache
	Radiosity_RayCount,               // number of rays shot to gather samples
	Radiosity_OctreeNodes,            // number of nodes in octree
	Radiosity_OctreeLookups,          // number of blocks examined for sample lookup
	Radiosity_OctreeAccepts0,         // number of blocks accepted by pass & tile id check
	Radiosity_OctreeAccepts1,         // number of blocks accepted by quick out-of-range check
	Radiosity_OctreeAccepts2,         // number of blocks accepted by next more sophisticated check
	Radiosity_OctreeAccepts3,         // number of blocks accepted by next more sophisticated check
	Radiosity_OctreeAccepts4,         // number of blocks accepted by next more sophisticated check
	Radiosity_OctreeAccepts5,         // number of blocks accepted by next more sophisticated check
	// [CLi] radiosity "top level" recursion stats (all pre- & final traces)
	Radiosity_TopLevel_ReuseCount,    // ambient value queries satisfied without taking a new sample
	Radiosity_TopLevel_GatherCount,   // number of samples gathered
	Radiosity_TopLevel_RayCount,      // number of rays shot to gather samples
	// [CLi] radiosity final trace stats (all recursion depths)
	Radiosity_Final_ReuseCount,       // ambient value queries satisfied without taking a new sample
	Radiosity_Final_GatherCount,      // number of samples gathered
	Radiosity_Final_RayCount,         // number of rays shot to gather samples
	// [CLi] radiosity detailed sample stats
	Radiosity_SamplesTaken_PTS1_R0,   // number of samples gathered during pretrace step 1 at recursion depth 0
	Radiosity_SamplesTaken_PTS1_R1,   //  ...
	Radiosity_SamplesTaken_PTS1_R2,
	Radiosity_SamplesTaken_PTS1_R3,
	Radiosity_SamplesTaken_PTS1_R4ff, // number of samples gathered during pretrace step 1 at recursion depth 4 or deeper
	Radiosity_SamplesTaken_PTS2_R0,   //  ...
	Radiosity_SamplesTaken_PTS2_R1,
	Radiosity_SamplesTaken_PTS2_R2,
	Radiosity_SamplesTaken_PTS2_R3,
	Radiosity_SamplesTaken_PTS2_R4ff,
	Radiosity_SamplesTaken_PTS3_R0,
	Radiosity_SamplesTaken_PTS3_R1,
	Radiosity_SamplesTaken_PTS3_R2,
	Radiosity_SamplesTaken_PTS3_R3,
	Radiosity_SamplesTaken_PTS3_R4ff,
	Radiosity_SamplesTaken_PTS4_R0,
	Radiosity_SamplesTaken_PTS4_R1,
	Radiosity_SamplesTaken_PTS4_R2,
	Radiosity_SamplesTaken_PTS4_R3,
	Radiosity_SamplesTaken_PTS4_R4ff,
	Radiosity_SamplesTaken_PTS5ff_R0, // number of samples gathered during pretrace step 5 or deeper at recursion depth 0
	Radiosity_SamplesTaken_PTS5ff_R1, //  ...
	Radiosity_SamplesTaken_PTS5ff_R2,
	Radiosity_SamplesTaken_PTS5ff_R3,
	Radiosity_SamplesTaken_PTS5ff_R4ff,
	Radiosity_SamplesTaken_Final_R0,  // number of samples gathered during final render at recursion depth 0
	Radiosity_SamplesTaken_Final_R1,  //  ...
	Radiosity_SamplesTaken_Final_R2,
	Radiosity_SamplesTaken_Final_R3,
	Radiosity_SamplesTaken_Final_R4ff,
	Radiosity_QueryCount_R0,          // ambient value queries at recursion depth 0
	Radiosity_QueryCount_R1,          // ...
	Radiosity_QueryCount_R2,          // ...
	Radiosity_QueryCount_R3,          // ...
	Radiosity_QueryCount_R4ff,        // ...

	/* Must be the last */
	MaxIntStat

} IntStatsIndex;

typedef enum FPSTATS
{
	Radiosity_Weight_R0 = 0,          // summed-up weight of radiosity sample rays at recursion depth 0 during final trace
	Radiosity_Weight_R1,              //  ...
	Radiosity_Weight_R2,
	Radiosity_Weight_R3,
	Radiosity_Weight_R4ff,

	/* Must be the last */
	MaxFPStat
} FPStatsIndex;

typedef struct intersection_stats_info
{
	int povms_id;
	IntStatsIndex stat_test_id;
	IntStatsIndex stat_suc_id;
	const char *infotext;
} INTERSECTION_STATS_INFO;

extern const INTERSECTION_STATS_INFO intersection_stats[];

}

#endif
