/*************************************************************************
*  Copyright (C) 2013 by Burak ER   burak.er@btu.edu.tr                	 *
*																		 *
*                                                                        *
*  This program is free software; it is licensed under the terms of the  *
*  GNU General Public License v2 or later. See file LICENSE for details. *
*************************************************************************/
#pragma once

#include <pkg/common/GLDrawFunctors.hpp>
#include <pkg/fem/Node.hpp>

namespace yade { // Cannot have #include directive inside.

class Gl1_Node : public GlShapeFunctor {
private:
	// for stripes
	static vector<Vector3r> vertices, faces;
	static int              glStripedSphereList;
	static int              glGlutSphereList;
	void                    subdivideTriangle(Vector3r& v1, Vector3r& v2, Vector3r& v3, int depth);
	// 		void drawSphere(const Vector3r& color);
	//Generate GlList for GLUT sphere
	void initGlutGlList();
	//Generate GlList for sliced spheres
	void initStripedGlList();
	//for regenerating glutSphere list if needed
	static Real prevQuality;

public:
	void go(const shared_ptr<Shape>&, const shared_ptr<State>&, bool, const GLViewInfo&) override;
	// clang-format off
	YADE_CLASS_BASE_DOC_STATICATTRS(Gl1_Node,GlShapeFunctor,"Renders :yref:`Node` object",
		((Real,quality,1.0,,"Change discretization level of spheres. quality>1  for better image quality, at the price of more cpu/gpu usage, 0<quality<1 for faster rendering. If mono-color spheres are displayed (:yref:`Gl1_Node::stripes` = False), quality mutiplies :yref:`Gl1_Node::glutSlices` and :yref:`Gl1_Node::glutStacks`. If striped spheres are displayed (:yref:`Gl1_Node::stripes` = True), only integer increments are meaningfull : quality=1 and quality=1.9 will give the same result, quality=2 will give finer result."))
		((bool,wire,false,,"Only show wireframe (controlled by ``glutSlices`` and ``glutStacks``."))
		((bool,stripes,false,,"In non-wire rendering, show stripes clearly showing particle rotation."))
		((bool,localSpecView,true,,"Compute specular light in local eye coordinate system."))
		((int,glutSlices,12,(Attr::noSave | Attr::readonly),"Base number of sphere slices, multiplied by :yref:`Gl1_Node::quality` before use); not used with ``stripes`` (see `glut{Solid,Wire}Sphere reference <http://www.opengl.org/documentation/specs/glut/spec3/node81.html>`_)"))
		((int,glutStacks,6,(Attr::noSave | Attr::readonly),"Base number of sphere stacks, multiplied by :yref:`Gl1_Node::quality` before use; not used with ``stripes`` (see `glut{Solid,Wire}Sphere reference <http://www.opengl.org/documentation/specs/glut/spec3/node81.html>`_)"))
	);
	// clang-format on
	RENDERS(Node);
};
REGISTER_SERIALIZABLE(Gl1_Node);

} // namespace yade
