first commit
This commit is contained in:
179
project/fm_viewer/fav/Geometry.h
Normal file
179
project/fm_viewer/fav/Geometry.h
Normal file
@@ -0,0 +1,179 @@
|
||||
/******************************************************************************
|
||||
QtAV: Multimedia framework based on Qt and FFmpeg
|
||||
Copyright (C) 2012-2017 Wang Bin <wbsecg1@gmail.com>
|
||||
|
||||
* This file is part of QtAV (from 2016)
|
||||
|
||||
This library 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 2.1 of the License, or (at your option) any later version.
|
||||
|
||||
This library 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 library; if not, write to the Free Software
|
||||
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
******************************************************************************/
|
||||
#ifndef QTAV_GEOMETRY_H
|
||||
#define QTAV_GEOMETRY_H
|
||||
#include <QtCore/QRectF>
|
||||
#include <QtCore/QVector>
|
||||
#include "_fav_constants.h"
|
||||
|
||||
// TODO: generate vertex/fragment shader code from Geometry.attributes()
|
||||
namespace FAV {
|
||||
|
||||
// 구체의 스케일(*)
|
||||
#define SPHERE_SCALE 20.0f
|
||||
#define DEG_PI 3.14159265359f
|
||||
#define DEG2RAD(d) (d * DEG_PI / 180.0)
|
||||
|
||||
enum DataType { //equals to GL_BYTE etc.
|
||||
TypeS8 = 0x1400, //S8
|
||||
TypeU8 = 0x1401, //U8
|
||||
TypeS16 = 0x1402, //S16
|
||||
TypeU16 = 0x1403, //U16
|
||||
TypeS32 = 0x1404, //S32
|
||||
TypeU32 = 0x1405, //U32
|
||||
TypeF32 = 0x1406 //F32
|
||||
};
|
||||
|
||||
class Q_AV_EXPORT Attribute {
|
||||
bool m_normalize;
|
||||
DataType m_type;
|
||||
int m_tupleSize, m_offset;
|
||||
QByteArray m_name;
|
||||
public:
|
||||
Attribute(DataType type = TypeF32, int tupleSize = 0, int offset = 0, bool normalize = false);
|
||||
Attribute(const QByteArray& name, DataType type = TypeF32, int tupleSize = 0, int offset = 0, bool normalize = false);
|
||||
QByteArray name() const {return m_name;}
|
||||
DataType type() const {return m_type;}
|
||||
int tupleSize() const {return m_tupleSize;}
|
||||
int offset() const {return m_offset;}
|
||||
bool normalize() const {return m_normalize;}
|
||||
bool operator==(const Attribute& other) const {
|
||||
return tupleSize() == other.tupleSize()
|
||||
&& offset() == other.offset()
|
||||
&& type() == other.type()
|
||||
&& normalize() == other.normalize();
|
||||
}
|
||||
};
|
||||
#ifndef QT_NO_DEBUG_STREAM
|
||||
Q_AV_EXPORT QDebug operator<<(QDebug debug, const Attribute &a);
|
||||
#endif
|
||||
|
||||
/*!
|
||||
* \brief The Geometry class
|
||||
* \code
|
||||
* foreach (const Attribute& a, g->attributes()) {
|
||||
* program()->setAttributeBuffer(a.name(), a.type(), a.offset(), a.tupleSize(), g->stride());
|
||||
* }
|
||||
* \endcode
|
||||
*/
|
||||
class Q_AV_EXPORT Geometry {
|
||||
public:
|
||||
/// Strip or Triangles is preferred by ANGLE. The values are equal to opengl
|
||||
enum Primitive {
|
||||
Triangles = 0x0004,
|
||||
TriangleStrip = 0x0005, //default
|
||||
TriangleFan = 0x0006, // Not recommended
|
||||
};
|
||||
Geometry(int vertexCount = 0, int indexCount = 0, DataType indexType = TypeU16);
|
||||
virtual ~Geometry() {}
|
||||
Primitive primitive() const {return m_primitive;}
|
||||
void setPrimitive(Primitive value) { m_primitive = value;}
|
||||
int vertexCount() const {return m_vcount;}
|
||||
void setVertexCount(int value) {m_vcount = value;} // TODO: remove, or allocate data here
|
||||
// TODO: setStride and no virtual
|
||||
virtual int stride() const = 0;
|
||||
// TODO: add/set/remove attributes()
|
||||
virtual const QVector<Attribute>& attributes() const = 0;
|
||||
void* vertexData() { return m_vdata.data();}
|
||||
const void* vertexData() const { return m_vdata.constData();}
|
||||
const void* constVertexData() const { return m_vdata.constData();}
|
||||
void dumpVertexData();
|
||||
void* indexData() { return m_icount > 0 ? m_idata.data() : NULL;}
|
||||
const void* indexData() const { return m_icount > 0 ? m_idata.constData() : NULL;}
|
||||
const void* constIndexData() const { return m_icount > 0 ? m_idata.constData() : NULL;}
|
||||
int indexCount() const { return m_icount;}
|
||||
int indexDataSize() const;
|
||||
// GL_UNSIGNED_BYTE/SHORT/INT
|
||||
DataType indexType() const {return m_itype;}
|
||||
void setIndexType(DataType value) { m_itype = value;}
|
||||
void setIndexValue(int index, int value);
|
||||
void setIndexValue(int index, int v1, int v2, int v3); // a triangle
|
||||
void dumpIndexData();
|
||||
/*!
|
||||
* \brief allocate
|
||||
* Call allocate() when all parameters are set. vertexData() may change
|
||||
*/
|
||||
void allocate(int nbVertex, int nbIndex = 0);
|
||||
/*!
|
||||
* \brief compare
|
||||
* Compare each attribute and stride that used in glVertexAttribPointer
|
||||
* \return true if equal
|
||||
*/
|
||||
bool compare(const Geometry *other) const;
|
||||
protected:
|
||||
Primitive m_primitive;
|
||||
DataType m_itype;
|
||||
int m_vcount;
|
||||
int m_icount;
|
||||
QByteArray m_vdata;
|
||||
QByteArray m_idata;
|
||||
};
|
||||
class Fisheye;
|
||||
|
||||
class Q_AV_EXPORT TexturedGeometry : public Geometry {
|
||||
friend Fisheye;
|
||||
public:
|
||||
TexturedGeometry();
|
||||
/*!
|
||||
* \brief setTextureCount
|
||||
* sometimes we needs more than 1 texture coordinates, for example we have to set rectangle texture
|
||||
* coordinates for each plane.
|
||||
*/
|
||||
void setTextureCount(int value);
|
||||
int textureCount() const;
|
||||
|
||||
void setRect(const QRectF& r, const QRectF& tr, int texIndex = 0);
|
||||
void setGeometryRect(const QRectF& r);
|
||||
void setTextureRect(const QRectF& tr, int texIndex = 0);
|
||||
int stride() const Q_DECL_OVERRIDE { return 2*sizeof(float)*(textureCount()+1); }
|
||||
const QVector<Attribute>& attributes() const Q_DECL_OVERRIDE;
|
||||
virtual void create();
|
||||
protected:
|
||||
void setPoint(int index, const QPointF& p, const QPointF& tp, int texIndex = 0);
|
||||
void setGeometryPoint(int index, const QPointF& p);
|
||||
void setTexturePoint(int index, const QPointF& tp, int texIndex = 0);
|
||||
protected:
|
||||
int nb_tex;
|
||||
QRectF geo_rect;
|
||||
QVector<QRectF> texRect;
|
||||
QVector<Attribute> a;
|
||||
};
|
||||
|
||||
|
||||
|
||||
class Q_AV_EXPORT Sphere : public TexturedGeometry {
|
||||
public:
|
||||
Sphere();
|
||||
void setResolution(int w, int h); // >= 2x2
|
||||
void setRadius(float value);
|
||||
float radius() const;
|
||||
void create() Q_DECL_OVERRIDE;
|
||||
int stride() const Q_DECL_OVERRIDE { return 3*sizeof(float)+2*sizeof(float)*textureCount(); }
|
||||
protected:
|
||||
using Geometry::setPrimitive;
|
||||
private:
|
||||
int ru, rv;
|
||||
float r;
|
||||
};
|
||||
|
||||
|
||||
} //namespace FAV
|
||||
#endif //QTAV_GEOMETRY_H
|
||||
Reference in New Issue
Block a user