1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82
|
#pragma once
#include "glGrib/Field.h"
#include "glGrib/View.h"
namespace glGrib
{
class FieldVector : public FieldPacked<8>
{
public:
explicit FieldVector (const Field::Privatizer) : scalar (this), vector (this) { }
void setup (const Field::Privatizer, Loader *, const OptionsField &, float = 0) override;
FieldVector (const FieldVector &) = delete;
using T = typename FieldPackingType<8>::type;
Field::kind getKind () const
{
return Field::VECTOR;
}
FieldVector * clone () const;
void renderArrow (const View &, const OptionsLight &) const;
void renderNorms (const View &, const OptionsLight &) const;
void render (const View &, const OptionsLight &) const override;
void reSample (const View &);
void toggleShowVector () { opts.vector.arrow.on = ! opts.vector.arrow.on; }
void toggleShowNorm () { opts.vector.norm.on = ! opts.vector.norm.on; }
void reSize (const View &) override;
float getNormedMinValue () const override
{
std::vector<float> val = getMinValue ();
return val[0];
}
float getNormedMaxValue () const override
{
std::vector<float> val = getMaxValue ();
return val[0];
}
bool useColorBar () const override { return true; }
int getSlotMax () const override
{
return (int)opts.path.size () / 2;
}
private:
enum
{
SCALAR=0,
VECTOR=1
};
template <int N>
class field_t
{
public:
explicit field_t (FieldVector * f) : field (f), VAID (this) {}
field_t & operator= (const field_t & s)
{
if (this != &s)
VAID = s.VAID;
return *this;
}
void setupVertexAttributes () const;
void render (const glGrib::View &, const glGrib::OptionsLight &) const;
FieldVector * field;
OpenGLVertexArray<field_t> VAID;
};
using scalar_t = field_t<SCALAR>;
using vector_t = field_t<VECTOR>;
friend class field_t<SCALAR>;
friend class field_t<VECTOR>;
struct
{
OpenGLBufferPtr<T> buffer_n, buffer_d;
float vscale;
} d;
scalar_t scalar;
vector_t vector;
};
}
|