/*
    QGLView
    Ivan Pelipenko peri4ko@yandex.ru

    This program is free software: you can redistribute it and/or modify
    it under the terms of the GNU Lesser General Public License as published by
    the Free Software Foundation, either version 3 of the License, or
    (at your option) any later version.

    This program 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 Lesser General Public License for more details.

    You should have received a copy of the GNU Lesser General Public License
    along with this program.  If not, see <http://www.gnu.org/licenses/>.
*/

#ifndef GLPRIMITIVE_CUBE_H
#define GLPRIMITIVE_CUBE_H

#include "globject.h"


class GLPrimitivePoint: public GLObjectBase {
public:
	GLPrimitivePoint(double size = 1., QVector3D pos = QVector3D()) { sz = 8.; }
	virtual void draw(QOpenGLShaderProgram * prog, bool simplest = false);

private:
	double sz;
};


class GLPrimitiveLine: public GLObjectBase {
public:
	GLPrimitiveLine(QVector3D p0_ = QVector3D(), QVector3D p1_ = QVector3D()) {
		p0 = p0_;
		p1 = p1_;
	}
	virtual void draw(QOpenGLShaderProgram * prog, bool simplest = false);
	QVector3D point0() const { return p0; }
	QVector3D point1() const { return p1; }
	void setPoint0(const QVector3D & p) { p0 = p; }
	void setPoint1(const QVector3D & p) { p1 = p; }

private:
	QVector3D p0, p1;
};


class GLPrimitiveCube: public GLObjectBase {
public:
	GLPrimitiveCube(float width = 1., float length = 1., float height = 1., QVector3D pos = QVector3D());
	virtual void init();

private:
	float w, l, h;
};


class GLPrimitiveEllipsoid: public GLObjectBase {
public:
	GLPrimitiveEllipsoid(float width   = 1.,
	                     float length  = 1.,
	                     float height  = 1.,
	                     int seg_wl    = 10,
	                     int seg_h     = 10,
	                     QVector3D pos = QVector3D());
	virtual void init();

private:
	void putTriangle(const QVector3D & v0, const QVector3D & v1, const QVector3D & v2);
	float w, l, h;
	int swl, sh;
};


class GLPrimitiveAxis: public GLObjectBase {
public:
	GLPrimitiveAxis() { accept_fog = accept_light = cast_shadow = rec_shadow = select_ = false; }
	virtual void draw(QOpenGLShaderProgram * prog, bool simplest = false);
};


#endif // GLPRIMITIVE_CUBE_H
