diff --git a/include/osg/Array b/include/osg/Array index d4769843b..7d4b81a4e 100644 --- a/include/osg/Array +++ b/include/osg/Array @@ -10,11 +10,13 @@ #include #include #include +#include #include namespace osg { +class ArrayVisitor; class SG_EXPORT Array : public Object { @@ -51,6 +53,8 @@ class SG_EXPORT Array : public Object virtual bool isSameKindAs(const Object* obj) const { return dynamic_cast(obj)!=NULL; } virtual const char* libraryName() const { return "osg"; } virtual const char* className() const; + + virtual void accept(ArrayVisitor&) {} Type getType() const { return _arrayType; } @@ -88,33 +92,49 @@ class TemplateArray : public Array, public std::vector Array(ARRAYTYPE,DataSize,DataType), std::vector(ptr,ptr+no) {} - template TemplateArray(InputIterator first,InputIterator last) : Array(ARRAYTYPE,DataSize,DataType), std::vector(first,last) {} -// TemplateArray(T* first,T* last) : -// Array(ARRAYTYPE,DataSize,DataType), -// std::vector(first,last) {} - virtual Object* cloneType() const { return osgNew TemplateArray(); } virtual Object* clone(const CopyOp& copyop) const { return osgNew TemplateArray(*this,copyop); } + virtual void accept(ArrayVisitor& av) { av.apply(*this); } virtual const GLvoid* dataPointer() const { if (!empty()) return &front(); else return 0; } }; -typedef TemplateArray ByteArray; -typedef TemplateArray ShortArray; -typedef TemplateArray IntArray; -typedef TemplateArray UByteArray; -typedef TemplateArray UShortArray; -typedef TemplateArray UIntArray; -typedef TemplateArray UByte4Array; -typedef TemplateArray FloatArray; -typedef TemplateArray Vec2Array; -typedef TemplateArray Vec3Array; -typedef TemplateArray Vec4Array; +typedef TemplateArray ByteArray; +typedef TemplateArray ShortArray; +typedef TemplateArray IntArray; +typedef TemplateArray UByteArray; +typedef TemplateArray UShortArray; +typedef TemplateArray UIntArray; +typedef TemplateArray UByte4Array; +typedef TemplateArray FloatArray; +typedef TemplateArray Vec2Array; +typedef TemplateArray Vec3Array; +typedef TemplateArray Vec4Array; + +class ArrayVisitor +{ + public: + ArrayVisitor() {} + + virtual void apply(Array&) {} + virtual void apply(ByteArray&) {} + virtual void apply(ShortArray&) {} + virtual void apply(IntArray&) {} + virtual void apply(UByteArray&) {} + virtual void apply(UShortArray&) {} + virtual void apply(UIntArray&) {} + virtual void apply(UByte4Array&) {} + virtual void apply(FloatArray&) {} + virtual void apply(Vec2Array&) {} + virtual void apply(Vec3Array&) {} + virtual void apply(Vec4Array&) {} + +}; } diff --git a/include/osg/UByte4 b/include/osg/UByte4 new file mode 100644 index 000000000..747575acd --- /dev/null +++ b/include/osg/UByte4 @@ -0,0 +1,155 @@ +//C++ header - Open Scene Graph - Copyright (C) 1998-2001 Robert Osfield +//Distributed under the terms of the GNU Library General Public License (LGPL) +//as published by the Free Software Foundation. + +#ifndef OSG_UBYTE4 +#define OSG_UBUTE 1 + +#include + +#include + +namespace osg { + +/** General purpose float quad, uses include representation + of colour coordinates. + No support yet added for float * UByte4 - is it necessary? + Need to define a non-member non-friend operator* etc. + UByte4 * float is okay +*/ +class UByte4 +{ + public: + + // Methods are defined here so that they are implicitly inlined + + UByte4() { _v[0]=0; _v[1]=0; _v[2]=0; _v[3]=0;} + + UByte4(unsigned char r, unsigned char g, unsigned char b, unsigned char a) + { + _v[0]=r; _v[1]=g; _v[2]=b; _v[3]=a; + } + + unsigned char _v[4]; + + inline const bool operator == (const UByte4& v) const { return _v[0]==v._v[0] && _v[1]==v._v[1] && _v[2]==v._v[2] && _v[3]==v._v[3]; } + + inline const bool operator != (const UByte4& v) const { return _v[0]!=v._v[0] || _v[1]!=v._v[1] || _v[2]!=v._v[2] || _v[3]!=v._v[3]; } + + inline const bool operator < (const UByte4& v) const + { + if (_v[0]v._v[0]) return false; + else if (_v[1]v._v[1]) return false; + else if (_v[2]v._v[2]) return false; + else return (_v[3]