Checked in .osg support for the new osg::Geometry class.
This commit is contained in:
@@ -150,6 +150,10 @@ SOURCE=..\..\..\src\osgPlugins\osg\GeoSet.cpp
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=..\..\..\src\osgPlugins\osg\Geometry.cpp
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=..\..\..\src\osgPlugins\osg\Group.cpp
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
@@ -28,22 +28,6 @@ enum ArrayType
|
||||
Vec4ArrayType = 11
|
||||
};
|
||||
|
||||
static char* s_classNames[] =
|
||||
{
|
||||
"AttributeArray" // 0
|
||||
"ByteArray", // 1
|
||||
"ShortArray", // 2
|
||||
"IntArray", // 3
|
||||
"UByteArray", // 4
|
||||
"UShortArray", // 5
|
||||
"UIntArray", // 6
|
||||
"UByte4Array", // 7
|
||||
"FloatArray", // 8
|
||||
"Vec2Array", // 9
|
||||
"Vec3Array", // 10
|
||||
"Vec4Array" // 11
|
||||
};
|
||||
|
||||
class AttributeArray : public Object
|
||||
{
|
||||
|
||||
@@ -62,7 +46,7 @@ class AttributeArray : public Object
|
||||
|
||||
virtual bool isSameKindAs(const Object* obj) const { return dynamic_cast<const AttributeArray*>(obj)!=NULL; }
|
||||
virtual const char* libraryName() const { return "osg"; }
|
||||
virtual const char* className() const { return "AttributeArray"; }
|
||||
virtual const char* className() const;
|
||||
|
||||
|
||||
ArrayType arrayType() const { return _arrayType; }
|
||||
@@ -102,8 +86,6 @@ class TemplateArray : public AttributeArray, public std::vector<T>
|
||||
|
||||
virtual Object* cloneType() const { return osgNew TemplateArray(); }
|
||||
virtual Object* clone(const CopyOp& copyop) const { return osgNew TemplateArray(*this,copyop); }
|
||||
virtual const char* libraryName() const { return "osg"; }
|
||||
virtual const char* className() const { return s_classNames[ARRAYTYPE]; }
|
||||
|
||||
virtual const GLvoid* dataPointer() const { if (!empty()) return &front(); else return 0; }
|
||||
};
|
||||
@@ -125,26 +107,17 @@ typedef TemplateArray<Vec4,Vec4ArrayType,4,GL_FLOAT> Vec4Ar
|
||||
enum PrimitiveType
|
||||
{
|
||||
PrimitivePrimitiveType = 0,
|
||||
DrawArraysPrimitiveType = 1,
|
||||
DrawArraysPrimitiveType = 1,
|
||||
UByteDrawElementsPrimitiveType = 2,
|
||||
UShortDrawElementsPrimitiveType = 3,
|
||||
UIntDrawElementsPrimitiveType = 4,
|
||||
};
|
||||
|
||||
static char* s_PrimitiveNames[] =
|
||||
{
|
||||
"Primitive", // 0
|
||||
"DrawArrays", // 1
|
||||
"UByteDrawElements", // 2
|
||||
"UShortDrawElements", // 3
|
||||
"UIntDrawElements" // 4
|
||||
};
|
||||
|
||||
class Primitive : public Object
|
||||
{
|
||||
public:
|
||||
|
||||
enum PrimitiveMode
|
||||
enum Mode
|
||||
{
|
||||
POINTS = GL_POINTS,
|
||||
LINES = GL_LINES,
|
||||
@@ -165,9 +138,9 @@ class Primitive : public Object
|
||||
|
||||
virtual bool isSameKindAs(const Object* obj) const { return dynamic_cast<const Primitive*>(obj)!=NULL; }
|
||||
virtual const char* libraryName() const { return "osg"; }
|
||||
virtual const char* className() const { return "Primitive"; }
|
||||
virtual const char* className() const;
|
||||
|
||||
PrimitiveType primitiveType;
|
||||
PrimitiveType primitiveType() const { return _primitiveType; }
|
||||
|
||||
virtual void draw() const = 0;
|
||||
|
||||
@@ -200,6 +173,25 @@ class DrawArrays : public Primitive
|
||||
virtual const char* libraryName() const { return "osg"; }
|
||||
virtual const char* className() const { return "DrawArrays"; }
|
||||
|
||||
|
||||
void set(GLenum mode, GLint first, GLsizei count)
|
||||
{
|
||||
_mode = mode;
|
||||
_first = first;
|
||||
_count = count;
|
||||
}
|
||||
|
||||
void setMode(GLenum mode) { _mode = mode; }
|
||||
GLenum getMode() const { return _mode; }
|
||||
|
||||
void setFirst(GLint first) { _first = first; }
|
||||
GLint getFirst() const { return _first; }
|
||||
|
||||
void setCount(GLsizei count) { _count = count; }
|
||||
GLsizei getCount() const { return _count; }
|
||||
|
||||
|
||||
|
||||
virtual void draw() const
|
||||
{
|
||||
glDrawArrays(_mode,_first,_count);
|
||||
@@ -242,8 +234,10 @@ class DrawElements : public Primitive, public std::vector<T>
|
||||
virtual Object* clone(const CopyOp& copyop) const { return osgNew DrawElements(*this,copyop); }
|
||||
virtual bool isSameKindAs(const Object* obj) const { return dynamic_cast<const DrawElements*>(obj)!=NULL; }
|
||||
virtual const char* libraryName() const { return "osg"; }
|
||||
virtual const char* className() const { return s_PrimitiveNames[PRIMTYPE]; }
|
||||
|
||||
void setMode(GLenum mode) { _mode = mode; }
|
||||
GLenum getMode() const { return _mode; }
|
||||
|
||||
virtual void draw() const
|
||||
{
|
||||
glDrawElements(_mode,size(),_dataType,&front());
|
||||
@@ -307,11 +301,16 @@ class SG_EXPORT Geometry : public Drawable
|
||||
const AttributeArray* getColorArray() const { return _colorArray.get(); }
|
||||
|
||||
|
||||
typedef std::vector< ref_ptr<AttributeArray> > TexCoordList;
|
||||
typedef std::vector< ref_ptr<AttributeArray> > TexCoordArrayList;
|
||||
|
||||
|
||||
void setTexCoordArray(unsigned int unit,AttributeArray*);
|
||||
AttributeArray* getTexCoordArray(unsigned int unit);
|
||||
const AttributeArray* getTexCoordArray(unsigned int unit) const;
|
||||
|
||||
unsigned int getNumTexCoordArrays() const { return _texCoordList.size(); }
|
||||
TexCoordArrayList& getTexCoordArrayList() { return _texCoordList; }
|
||||
const TexCoordArrayList& getTexCoordArrayList() const { return _texCoordList; }
|
||||
|
||||
|
||||
typedef std::vector< ref_ptr<Primitive> > PrimitiveList;
|
||||
@@ -362,7 +361,7 @@ class SG_EXPORT Geometry : public Drawable
|
||||
AttributeBinding _colorBinding;
|
||||
ref_ptr<AttributeArray> _colorArray;
|
||||
|
||||
TexCoordList _texCoordList;
|
||||
TexCoordArrayList _texCoordList;
|
||||
|
||||
};
|
||||
|
||||
|
||||
@@ -2,6 +2,49 @@
|
||||
|
||||
using namespace osg;
|
||||
|
||||
static char* s_ArrayNames[] =
|
||||
{
|
||||
"AttributeArray", // 0
|
||||
"ByteArray", // 1
|
||||
"ShortArray", // 2
|
||||
"IntArray", // 3
|
||||
|
||||
"UByteArray", // 4
|
||||
"UShortArray", // 5
|
||||
"UIntArray", // 6
|
||||
"UByte4Array", // 7
|
||||
|
||||
"FloatArray", // 8
|
||||
"Vec2Array", // 9
|
||||
"Vec3Array", // 10
|
||||
"Vec4Array", // 11
|
||||
};
|
||||
|
||||
const char* AttributeArray::className() const
|
||||
{
|
||||
if (_arrayType>=AttributeArrayType && _arrayType<=Vec4ArrayType)
|
||||
return s_ArrayNames[_arrayType];
|
||||
else
|
||||
return "UnkownAttributeArray";
|
||||
}
|
||||
|
||||
static char* s_PrimitiveNames[] =
|
||||
{
|
||||
"Primitive", // 0
|
||||
"DrawArrays", // 1
|
||||
"UByteDrawElements", // 2
|
||||
"UShortDrawElements", // 3
|
||||
"UIntDrawElements" // 4
|
||||
};
|
||||
|
||||
const char* Primitive::className() const
|
||||
{
|
||||
if (_primitiveType>=PrimitivePrimitiveType && _primitiveType<=UIntDrawElementsPrimitiveType)
|
||||
return s_PrimitiveNames[_primitiveType];
|
||||
else
|
||||
return "UnkownAttributeArray";
|
||||
}
|
||||
|
||||
Geometry::Geometry()
|
||||
{
|
||||
_normalBinding = BIND_OFF;
|
||||
|
||||
@@ -426,9 +426,7 @@ void Texture::applyTexImage(GLenum target, Image* image, State& state) const
|
||||
// when use 16 bit textures rather than 24/32bit textures.
|
||||
// internalFormat = GL_RGBA4;
|
||||
|
||||
// an experiment to look at the changes in performance
|
||||
// when use 16 bit textures rather than 24/32bit textures.
|
||||
// internalFormat = GL_RGBA4;
|
||||
|
||||
static MyCompressedTexImage2DArbProc glCompressedTexImage2D_ptr =
|
||||
(MyCompressedTexImage2DArbProc)getGLExtensionFuncPtr("glCompressedTexImage2DARB");
|
||||
|
||||
|
||||
777
src/osgPlugins/osg/Geometry.cpp
Normal file
777
src/osgPlugins/osg/Geometry.cpp
Normal file
@@ -0,0 +1,777 @@
|
||||
#include <osg/Geometry>
|
||||
|
||||
#include <osgDB/Registry>
|
||||
#include <osgDB/Input>
|
||||
#include <osgDB/Output>
|
||||
|
||||
using namespace osg;
|
||||
using namespace osgDB;
|
||||
|
||||
// forward declare functions to use later.
|
||||
bool Geometry_readLocalData(Object& obj, Input& fr);
|
||||
bool Geometry_writeLocalData(const Object& obj, Output& fw);
|
||||
|
||||
bool Geometry_matchBindingTypeStr(const char* str,Geometry::AttributeBinding& mode);
|
||||
const char* Geometry_getBindingTypeStr(Geometry::AttributeBinding mode);
|
||||
|
||||
bool Geometry_matchPrimitiveModeStr(const char* str,GLenum& mode);
|
||||
const char* Geometry_getPrimitiveModeStr(GLenum mode);
|
||||
|
||||
AttributeArray* AttributeArray_readLocalData(Input& fr);
|
||||
|
||||
bool Primitve_readLocalData(Input& fr,osg::Geometry& geom);
|
||||
|
||||
// register the read and write functions with the osgDB::Registry.
|
||||
RegisterDotOsgWrapperProxy g_GeometryFuncProxy
|
||||
(
|
||||
osgNew osg::Geometry,
|
||||
"Geometry",
|
||||
"Object Drawable Geometry",
|
||||
&Geometry_readLocalData,
|
||||
&Geometry_writeLocalData,
|
||||
DotOsgWrapper::READ_AND_WRITE
|
||||
);
|
||||
|
||||
bool Geometry_readLocalData(Object& obj, Input& fr)
|
||||
{
|
||||
bool iteratorAdvanced = false;
|
||||
|
||||
Geometry& geom = static_cast<Geometry&>(obj);
|
||||
|
||||
if (fr.matchSequence("Primitives %i {"))
|
||||
{
|
||||
int entry = fr[1].getNoNestedBrackets();
|
||||
|
||||
int capacity;
|
||||
fr[1].getInt(capacity);
|
||||
|
||||
Geometry::PrimitiveList& primitives = geom.getPrimitiveList();
|
||||
if (capacity>0) primitives.reserve(capacity);
|
||||
|
||||
|
||||
fr += 3;
|
||||
|
||||
|
||||
while (!fr.eof() && fr[0].getNoNestedBrackets()>entry)
|
||||
{
|
||||
if (!Primitve_readLocalData(fr,geom)) ++fr;
|
||||
}
|
||||
|
||||
++fr;
|
||||
|
||||
iteratorAdvanced = true;
|
||||
|
||||
}
|
||||
|
||||
if (fr.matchSequence("VertexArray %i {"))
|
||||
{
|
||||
|
||||
int entry = fr[0].getNoNestedBrackets();
|
||||
|
||||
int capacity;
|
||||
fr[1].getInt(capacity);
|
||||
|
||||
Vec3Array* vertices = osgNew Vec3Array;
|
||||
vertices->reserve(capacity);
|
||||
|
||||
fr += 3;
|
||||
|
||||
while (!fr.eof() && fr[0].getNoNestedBrackets()>entry)
|
||||
{
|
||||
Vec3 v;
|
||||
if (fr[0].getFloat(v.x()) && fr[1].getFloat(v.y()) && fr[2].getFloat(v.z()))
|
||||
{
|
||||
fr += 3;
|
||||
vertices->push_back(v);
|
||||
}
|
||||
else
|
||||
{
|
||||
++fr;
|
||||
}
|
||||
}
|
||||
|
||||
geom.setVertexArray(vertices);
|
||||
|
||||
iteratorAdvanced = true;
|
||||
++fr;
|
||||
|
||||
|
||||
}
|
||||
|
||||
Geometry::AttributeBinding normalBinding=Geometry::BIND_OFF;
|
||||
if (fr[0].matchWord("NormalBinding") && Geometry_matchBindingTypeStr(fr[1].getStr(),normalBinding))
|
||||
{
|
||||
geom.setNormalBinding(normalBinding);
|
||||
fr+=2;
|
||||
iteratorAdvanced = true;
|
||||
}
|
||||
|
||||
if (fr.matchSequence("NormalArray %i {"))
|
||||
{
|
||||
int entry = fr[0].getNoNestedBrackets();
|
||||
|
||||
int capacity;
|
||||
fr[1].getInt(capacity);
|
||||
|
||||
Vec3Array* normals = osgNew Vec3Array;
|
||||
normals->reserve(capacity);
|
||||
|
||||
fr += 3;
|
||||
|
||||
while (!fr.eof() && fr[0].getNoNestedBrackets()>entry)
|
||||
{
|
||||
Vec3 v;
|
||||
if (fr[0].getFloat(v.x()) && fr[1].getFloat(v.y()) && fr[2].getFloat(v.z()))
|
||||
{
|
||||
fr += 3;
|
||||
normals->push_back(v);
|
||||
}
|
||||
else
|
||||
{
|
||||
++fr;
|
||||
}
|
||||
}
|
||||
|
||||
geom.setNormalArray(normals);
|
||||
|
||||
iteratorAdvanced = true;
|
||||
++fr;
|
||||
}
|
||||
|
||||
Geometry::AttributeBinding colorBinding=Geometry::BIND_OFF;
|
||||
if (fr[0].matchWord("ColorBinding") && Geometry_matchBindingTypeStr(fr[1].getStr(),colorBinding))
|
||||
{
|
||||
geom.setColorBinding(colorBinding);
|
||||
fr+=2;
|
||||
iteratorAdvanced = true;
|
||||
}
|
||||
|
||||
if (fr.matchSequence("ColorArray %w %i {"))
|
||||
{
|
||||
++fr;
|
||||
AttributeArray* colors = AttributeArray_readLocalData(fr);
|
||||
if (colors)
|
||||
{
|
||||
geom.setColorArray(colors);
|
||||
iteratorAdvanced++;
|
||||
}
|
||||
}
|
||||
|
||||
if (fr.matchSequence("TexCoordArray %i %w %i {"))
|
||||
{
|
||||
int unit=0;
|
||||
fr[1].getInt(unit);
|
||||
|
||||
fr+=2;
|
||||
AttributeArray* texcoords = AttributeArray_readLocalData(fr);
|
||||
if (texcoords)
|
||||
{
|
||||
geom.setTexCoordArray(unit,texcoords);
|
||||
iteratorAdvanced++;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
return iteratorAdvanced;
|
||||
}
|
||||
|
||||
|
||||
AttributeArray* AttributeArray_readLocalData(Input& fr)
|
||||
{
|
||||
int entry = fr[0].getNoNestedBrackets();
|
||||
|
||||
const char* arrayName = fr[0].getStr();
|
||||
|
||||
unsigned int capacity = 0;
|
||||
fr[1].getUInt(capacity);
|
||||
++fr;
|
||||
|
||||
fr += 2;
|
||||
|
||||
if (strcmp(arrayName,"ByteArray")==0)
|
||||
{
|
||||
ByteArray* array = osgNew ByteArray;
|
||||
array->reserve(capacity);
|
||||
while (!fr.eof() && fr[0].getNoNestedBrackets()>entry)
|
||||
{
|
||||
int int_value;
|
||||
if (fr[0].getInt(int_value))
|
||||
{
|
||||
++fr;
|
||||
array->push_back(int_value);
|
||||
}
|
||||
else ++fr;
|
||||
}
|
||||
++fr;
|
||||
return array;
|
||||
}
|
||||
else if (strcmp(arrayName,"ShortArray")==0)
|
||||
{
|
||||
ShortArray* array = osgNew ShortArray;
|
||||
array->reserve(capacity);
|
||||
while (!fr.eof() && fr[0].getNoNestedBrackets()>entry)
|
||||
{
|
||||
int int_value;
|
||||
if (fr[0].getInt(int_value))
|
||||
{
|
||||
++fr;
|
||||
array->push_back(int_value);
|
||||
}
|
||||
else ++fr;
|
||||
}
|
||||
++fr;
|
||||
return array;
|
||||
}
|
||||
else if (strcmp(arrayName,"IntArray")==0)
|
||||
{
|
||||
IntArray* array = osgNew IntArray;
|
||||
array->reserve(capacity);
|
||||
while (!fr.eof() && fr[0].getNoNestedBrackets()>entry)
|
||||
{
|
||||
int int_value;
|
||||
if (fr[0].getInt(int_value))
|
||||
{
|
||||
++fr;
|
||||
array->push_back(int_value);
|
||||
}
|
||||
else ++fr;
|
||||
}
|
||||
++fr;
|
||||
return array;
|
||||
}
|
||||
else if (strcmp(arrayName,"UByteArray")==0)
|
||||
{
|
||||
UByteArray* array = osgNew UByteArray;
|
||||
array->reserve(capacity);
|
||||
while (!fr.eof() && fr[0].getNoNestedBrackets()>entry)
|
||||
{
|
||||
unsigned int uint_value;
|
||||
if (fr[0].getUInt(uint_value))
|
||||
{
|
||||
++fr;
|
||||
array->push_back(uint_value);
|
||||
}
|
||||
else ++fr;
|
||||
}
|
||||
++fr;
|
||||
return array;
|
||||
}
|
||||
else if (strcmp(arrayName,"UShortArray")==0)
|
||||
{
|
||||
UShortArray* array = osgNew UShortArray;
|
||||
array->reserve(capacity);
|
||||
while (!fr.eof() && fr[0].getNoNestedBrackets()>entry)
|
||||
{
|
||||
unsigned int uint_value;
|
||||
if (fr[0].getUInt(uint_value))
|
||||
{
|
||||
++fr;
|
||||
array->push_back(uint_value);
|
||||
}
|
||||
else ++fr;
|
||||
}
|
||||
++fr;
|
||||
return array;
|
||||
}
|
||||
else if (strcmp(arrayName,"UIntArray")==0)
|
||||
{
|
||||
UIntArray* array = osgNew UIntArray;
|
||||
array->reserve(capacity);
|
||||
while (!fr.eof() && fr[0].getNoNestedBrackets()>entry)
|
||||
{
|
||||
unsigned int uint_value;
|
||||
if (fr[0].getUInt(uint_value))
|
||||
{
|
||||
++fr;
|
||||
array->push_back(uint_value);
|
||||
}
|
||||
else ++fr;
|
||||
}
|
||||
++fr;
|
||||
return array;
|
||||
}
|
||||
else if (strcmp(arrayName,"UByte4Array")==0)
|
||||
{
|
||||
UByte4Array* array = osgNew UByte4Array;
|
||||
array->reserve(capacity);
|
||||
while (!fr.eof() && fr[0].getNoNestedBrackets()>entry)
|
||||
{
|
||||
unsigned int uint_value;
|
||||
if (fr[0].getUInt(uint_value))
|
||||
{
|
||||
++fr;
|
||||
array->push_back(uint_value);
|
||||
}
|
||||
else ++fr;
|
||||
}
|
||||
++fr;
|
||||
return array;
|
||||
}
|
||||
else if (strcmp(arrayName,"FloatArray")==0)
|
||||
{
|
||||
FloatArray* array = osgNew FloatArray;
|
||||
array->reserve(capacity);
|
||||
while (!fr.eof() && fr[0].getNoNestedBrackets()>entry)
|
||||
{
|
||||
float float_value;
|
||||
if (fr[0].getFloat(float_value))
|
||||
{
|
||||
++fr;
|
||||
array->push_back(float_value);
|
||||
}
|
||||
else ++fr;
|
||||
}
|
||||
++fr;
|
||||
return array;
|
||||
}
|
||||
else if (strcmp(arrayName,"Vec2Array")==0)
|
||||
{
|
||||
Vec2Array* array = osgNew Vec2Array;
|
||||
array->reserve(capacity);
|
||||
while (!fr.eof() && fr[0].getNoNestedBrackets()>entry)
|
||||
{
|
||||
Vec2 v;
|
||||
if (fr[0].getFloat(v.x()) && fr[1].getFloat(v.y()))
|
||||
{
|
||||
fr += 2;
|
||||
array->push_back(v);
|
||||
}
|
||||
else ++fr;
|
||||
}
|
||||
++fr;
|
||||
return array;
|
||||
}
|
||||
else if (strcmp(arrayName,"Vec3Array")==0)
|
||||
{
|
||||
Vec3Array* array = osgNew Vec3Array;
|
||||
array->reserve(capacity);
|
||||
while (!fr.eof() && fr[0].getNoNestedBrackets()>entry)
|
||||
{
|
||||
Vec3 v;
|
||||
if (fr[0].getFloat(v.x()) && fr[1].getFloat(v.y()) && fr[2].getFloat(v.z()))
|
||||
{
|
||||
fr += 3;
|
||||
array->push_back(v);
|
||||
}
|
||||
else ++fr;
|
||||
}
|
||||
++fr;
|
||||
return array;
|
||||
}
|
||||
else if (strcmp(arrayName,"Vec4Array")==0)
|
||||
{
|
||||
Vec4Array* array = osgNew Vec4Array;
|
||||
array->reserve(capacity);
|
||||
while (!fr.eof() && fr[0].getNoNestedBrackets()>entry)
|
||||
{
|
||||
Vec4 v;
|
||||
if (fr[0].getFloat(v.x()) && fr[1].getFloat(v.y()) && fr[2].getFloat(v.z()) && fr[3].getFloat(v.w()))
|
||||
{
|
||||
fr += 4;
|
||||
array->push_back(v);
|
||||
}
|
||||
else ++fr;
|
||||
}
|
||||
++fr;
|
||||
return array;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
template<class Iterator>
|
||||
void Array_writeLocalData(Output& fw, Iterator first, Iterator last)
|
||||
{
|
||||
fw.indent() << "{"<<std::endl;
|
||||
fw.moveIn();
|
||||
for(Iterator itr=first;
|
||||
itr!=last;
|
||||
++itr)
|
||||
{
|
||||
fw.indent() << *itr << std::endl;
|
||||
}
|
||||
fw.moveOut();
|
||||
fw.indent()<<"}"<<std::endl;
|
||||
|
||||
}
|
||||
|
||||
bool Array_writeLocalData(const AttributeArray& array,Output& fw)
|
||||
{
|
||||
switch(array.arrayType())
|
||||
{
|
||||
case(ByteArrayType):
|
||||
{
|
||||
const ByteArray& carray = static_cast<const ByteArray&>(array);
|
||||
fw<<array.className()<<" "<<carray.size()<<std::endl;
|
||||
Array_writeLocalData(fw,carray.begin(),carray.end());
|
||||
return true;
|
||||
}
|
||||
break;
|
||||
case(ShortArrayType):
|
||||
{
|
||||
const ShortArray& carray = static_cast<const ShortArray&>(array);
|
||||
fw<<array.className()<<" "<<carray.size()<<std::endl;
|
||||
Array_writeLocalData(fw,carray.begin(),carray.end());
|
||||
return true;
|
||||
}
|
||||
break;
|
||||
case(IntArrayType):
|
||||
{
|
||||
const IntArray& carray = static_cast<const IntArray&>(array);
|
||||
fw<<array.className()<<" "<<carray.size()<<std::endl;
|
||||
Array_writeLocalData(fw,carray.begin(),carray.end());
|
||||
return true;
|
||||
}
|
||||
break;
|
||||
case(UByteArrayType):
|
||||
{
|
||||
const UByteArray& carray = static_cast<const UByteArray&>(array);
|
||||
fw<<array.className()<<" "<<carray.size()<<std::endl;
|
||||
Array_writeLocalData(fw,carray.begin(),carray.end());
|
||||
return true;
|
||||
}
|
||||
break;
|
||||
case(UShortArrayType):
|
||||
{
|
||||
const UShortArray& carray = static_cast<const UShortArray&>(array);
|
||||
fw<<array.className()<<" "<<carray.size()<<std::endl;
|
||||
Array_writeLocalData(fw,carray.begin(),carray.end());
|
||||
return true;
|
||||
}
|
||||
break;
|
||||
case(UIntArrayType):
|
||||
{
|
||||
const UIntArray& carray = static_cast<const UIntArray&>(array);
|
||||
fw<<array.className()<<" "<<carray.size()<<" ";
|
||||
Array_writeLocalData(fw,carray.begin(),carray.end());
|
||||
return true;
|
||||
}
|
||||
break;
|
||||
case(UByte4ArrayType):
|
||||
{
|
||||
const UByte4Array& carray = static_cast<const UByte4Array&>(array);
|
||||
fw<<array.className()<<" "<<carray.size()<<" ";
|
||||
Array_writeLocalData(fw,carray.begin(),carray.end());
|
||||
return true;
|
||||
}
|
||||
break;
|
||||
case(FloatArrayType):
|
||||
{
|
||||
const FloatArray& carray = static_cast<const FloatArray&>(array);
|
||||
fw<<array.className()<<" "<<carray.size()<<std::endl;
|
||||
Array_writeLocalData(fw,carray.begin(),carray.end());
|
||||
return true;
|
||||
}
|
||||
break;
|
||||
case(Vec2ArrayType):
|
||||
{
|
||||
const Vec2Array& carray = static_cast<const Vec2Array&>(array);
|
||||
fw<<array.className()<<" "<<carray.size()<<std::endl;
|
||||
Array_writeLocalData(fw,carray.begin(),carray.end());
|
||||
return true;
|
||||
}
|
||||
break;
|
||||
case(Vec3ArrayType):
|
||||
{
|
||||
const Vec3Array& carray = static_cast<const Vec3Array&>(array);
|
||||
fw<<array.className()<<" "<<carray.size()<<std::endl;
|
||||
Array_writeLocalData(fw,carray.begin(),carray.end());
|
||||
return true;
|
||||
}
|
||||
break;
|
||||
case(Vec4ArrayType):
|
||||
{
|
||||
const Vec4Array& carray = static_cast<const Vec4Array&>(array);
|
||||
fw<<array.className()<<" "<<carray.size()<<std::endl;
|
||||
Array_writeLocalData(fw,carray.begin(),carray.end());
|
||||
return true;
|
||||
}
|
||||
break;
|
||||
case(AttributeArrayType):
|
||||
default:
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
bool Primitve_readLocalData(Input& fr,osg::Geometry& geom)
|
||||
{
|
||||
bool iteratorAdvanced = false;
|
||||
if (fr.matchSequence("DrawArrays %w %i %i"))
|
||||
{
|
||||
|
||||
GLenum mode;
|
||||
Geometry_matchPrimitiveModeStr(fr[1].getStr(),mode);
|
||||
|
||||
int first;
|
||||
fr[2].getInt(first);
|
||||
|
||||
int count;
|
||||
fr[3].getInt(count);
|
||||
|
||||
geom.addPrimitive(osgNew DrawArrays(mode,first,count));
|
||||
|
||||
fr += 4;
|
||||
|
||||
iteratorAdvanced = true;
|
||||
|
||||
}
|
||||
else if (fr.matchSequence("UByteDrawElements %w %i {"))
|
||||
{
|
||||
int entry = fr[1].getNoNestedBrackets();
|
||||
|
||||
GLenum mode;
|
||||
Geometry_matchPrimitiveModeStr(fr[1].getStr(),mode);
|
||||
|
||||
int capacity;
|
||||
fr[2].getInt(capacity);
|
||||
|
||||
fr += 4;
|
||||
|
||||
UByteDrawElements* prim = osgNew UByteDrawElements;
|
||||
prim->setMode(mode);
|
||||
prim->reserve(capacity);
|
||||
|
||||
while (!fr.eof() && fr[0].getNoNestedBrackets()>entry)
|
||||
{
|
||||
unsigned int i;
|
||||
if (fr[0].getUInt(i))
|
||||
{
|
||||
prim->push_back(i);
|
||||
++fr;
|
||||
}
|
||||
}
|
||||
++fr;
|
||||
|
||||
geom.addPrimitive(prim);
|
||||
|
||||
iteratorAdvanced = true;
|
||||
}
|
||||
else if (fr.matchSequence("UShortDrawElements %w %i {"))
|
||||
{
|
||||
int entry = fr[1].getNoNestedBrackets();
|
||||
|
||||
GLenum mode;
|
||||
Geometry_matchPrimitiveModeStr(fr[1].getStr(),mode);
|
||||
|
||||
int capacity;
|
||||
fr[2].getInt(capacity);
|
||||
|
||||
fr += 4;
|
||||
|
||||
UShortDrawElements* prim = osgNew UShortDrawElements;
|
||||
prim->setMode(mode);
|
||||
prim->reserve(capacity);
|
||||
|
||||
while (!fr.eof() && fr[0].getNoNestedBrackets()>entry)
|
||||
{
|
||||
unsigned int i;
|
||||
if (fr[0].getUInt(i))
|
||||
{
|
||||
prim->push_back(i);
|
||||
++fr;
|
||||
}
|
||||
}
|
||||
++fr;
|
||||
|
||||
geom.addPrimitive(prim);
|
||||
|
||||
iteratorAdvanced = true;
|
||||
}
|
||||
else if (fr.matchSequence("UIntDrawElements %w %i {"))
|
||||
{
|
||||
int entry = fr[1].getNoNestedBrackets();
|
||||
|
||||
GLenum mode;
|
||||
Geometry_matchPrimitiveModeStr(fr[1].getStr(),mode);
|
||||
|
||||
int capacity;
|
||||
fr[2].getInt(capacity);
|
||||
|
||||
fr += 4;
|
||||
|
||||
UIntDrawElements* prim = osgNew UIntDrawElements;
|
||||
prim->setMode(mode);
|
||||
prim->reserve(capacity);
|
||||
|
||||
while (!fr.eof() && fr[0].getNoNestedBrackets()>entry)
|
||||
{
|
||||
unsigned int i;
|
||||
if (fr[0].getUInt(i))
|
||||
{
|
||||
prim->push_back(i);
|
||||
++fr;
|
||||
}
|
||||
}
|
||||
++fr;
|
||||
|
||||
geom.addPrimitive(prim);
|
||||
|
||||
iteratorAdvanced = true;
|
||||
}
|
||||
|
||||
return iteratorAdvanced;
|
||||
}
|
||||
|
||||
bool Primitve_writeLocalData(const Primitive& prim,Output& fw)
|
||||
{
|
||||
|
||||
switch(prim.primitiveType())
|
||||
{
|
||||
case(DrawArraysPrimitiveType):
|
||||
{
|
||||
const DrawArrays& cprim = static_cast<const DrawArrays&>(prim);
|
||||
fw<<cprim.className()<<" "<<Geometry_getPrimitiveModeStr(cprim.getMode())<<" "<<cprim.getFirst()<<" "<<cprim.getCount()<<std::endl;
|
||||
return true;
|
||||
}
|
||||
break;
|
||||
case(UByteDrawElementsPrimitiveType):
|
||||
{
|
||||
const UByteDrawElements& cprim = static_cast<const UByteDrawElements&>(prim);
|
||||
fw<<cprim.className()<<" "<<Geometry_getPrimitiveModeStr(cprim.getMode())<<std::endl;
|
||||
Array_writeLocalData(fw,cprim.begin(),cprim.end());
|
||||
return true;
|
||||
}
|
||||
break;
|
||||
case(UShortDrawElementsPrimitiveType):
|
||||
{
|
||||
const UShortDrawElements& cprim = static_cast<const UShortDrawElements&>(prim);
|
||||
fw<<cprim.className()<<" "<<Geometry_getPrimitiveModeStr(cprim.getMode())<<std::endl;
|
||||
Array_writeLocalData(fw,cprim.begin(),cprim.end());
|
||||
return true;
|
||||
}
|
||||
break;
|
||||
case(UIntDrawElementsPrimitiveType):
|
||||
{
|
||||
const UIntDrawElements& cprim = static_cast<const UIntDrawElements&>(prim);
|
||||
fw<<cprim.className()<<" "<<Geometry_getPrimitiveModeStr(cprim.getMode())<<std::endl;
|
||||
Array_writeLocalData(fw,cprim.begin(),cprim.end());
|
||||
return true;
|
||||
}
|
||||
break;
|
||||
default:
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
bool Geometry_writeLocalData(const Object& obj, Output& fw)
|
||||
{
|
||||
const Geometry& geom = static_cast<const Geometry&>(obj);
|
||||
|
||||
const Geometry::PrimitiveList& primitives = geom.getPrimitiveList();
|
||||
if (!primitives.empty())
|
||||
{
|
||||
fw.indent() << "Primitives "<<primitives.size()<<std::endl;
|
||||
fw.indent() << "{"<<std::endl;
|
||||
fw.moveIn();
|
||||
for(Geometry::PrimitiveList::const_iterator itr=primitives.begin();
|
||||
itr!=primitives.end();
|
||||
++itr)
|
||||
{
|
||||
fw.indent();
|
||||
Primitve_writeLocalData(**itr,fw);
|
||||
}
|
||||
fw.moveOut();
|
||||
fw.indent() << "}"<<std::endl;
|
||||
}
|
||||
|
||||
if (geom.getVertexArray())
|
||||
{
|
||||
const Vec3Array& vertices = *geom.getVertexArray();
|
||||
fw.indent()<<"VertexArray "<<vertices.size()<<std::endl;
|
||||
|
||||
Array_writeLocalData(fw,vertices.begin(),vertices.end());
|
||||
|
||||
}
|
||||
|
||||
if (geom.getNormalArray())
|
||||
{
|
||||
|
||||
fw.indent()<<"NormalBinding "<<Geometry_getBindingTypeStr(geom.getNormalBinding())<<std::endl;
|
||||
|
||||
const Vec3Array& normals = *geom.getNormalArray();
|
||||
fw.indent()<<"NormalArray "<<normals.size()<<std::endl;
|
||||
|
||||
Array_writeLocalData(fw,normals.begin(),normals.end());
|
||||
|
||||
}
|
||||
|
||||
if (geom.getColorArray())
|
||||
{
|
||||
fw.indent()<<"ColorBinding "<<Geometry_getBindingTypeStr(geom.getColorBinding())<<std::endl;
|
||||
fw.indent()<<"ColorArray ";
|
||||
Array_writeLocalData(*geom.getColorArray(),fw);
|
||||
}
|
||||
|
||||
const Geometry::TexCoordArrayList& tcal=geom.getTexCoordArrayList();
|
||||
for(unsigned int i=0;i<tcal.size();++i)
|
||||
{
|
||||
if (tcal[i].valid())
|
||||
{
|
||||
fw.indent()<<"TexCoordArray "<<i<<" ";
|
||||
Array_writeLocalData(*(tcal[i]),fw);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
bool Geometry_matchBindingTypeStr(const char* str,Geometry::AttributeBinding& mode)
|
||||
{
|
||||
if (strcmp(str,"OFF")==0) mode = Geometry::BIND_OFF;
|
||||
else if (strcmp(str,"OVERALL")==0) mode = Geometry::BIND_OVERALL;
|
||||
else if (strcmp(str,"PER_PRIMITIVE")==0) mode = Geometry::BIND_PER_PRIMITIVE;
|
||||
else if (strcmp(str,"PER_VERTEX")==0) mode = Geometry::BIND_PER_VERTEX;
|
||||
else return false;
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
const char* Geometry_getBindingTypeStr(Geometry::AttributeBinding mode)
|
||||
{
|
||||
switch(mode)
|
||||
{
|
||||
case (Geometry::BIND_OVERALL) : return "OVERALL";
|
||||
case (Geometry::BIND_PER_PRIMITIVE) : return "PER_PRIMITIVE";
|
||||
case (Geometry::BIND_PER_VERTEX) : return "PER_VERTEX";
|
||||
case (Geometry::BIND_OFF) :
|
||||
default : return "OFF";
|
||||
}
|
||||
}
|
||||
|
||||
bool Geometry_matchPrimitiveModeStr(const char* str,GLenum& mode)
|
||||
{
|
||||
if (strcmp(str,"POINTS")==0) mode = Primitive::POINTS;
|
||||
else if (strcmp(str,"LINES")==0) mode = Primitive::LINES;
|
||||
else if (strcmp(str,"LINE_STRIP")==0) mode = Primitive::LINE_STRIP;
|
||||
else if (strcmp(str,"LINE_LOOP")==0) mode = Primitive::LINE_LOOP;
|
||||
else if (strcmp(str,"TRIANGLES")==0) mode = Primitive::TRIANGLES;
|
||||
else if (strcmp(str,"TRIANGLE_STRIP")==0) mode = Primitive::TRIANGLE_STRIP;
|
||||
else if (strcmp(str,"TRIANGLE_FAN")==0) mode = Primitive::TRIANGLE_FAN;
|
||||
else if (strcmp(str,"QUADS")==0) mode = Primitive::QUADS;
|
||||
else if (strcmp(str,"QUAD_STRIP")==0) mode = Primitive::QUAD_STRIP;
|
||||
else if (strcmp(str,"POLYGON")==0) mode = Primitive::POLYGON;
|
||||
else return false;
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
const char* Geometry_getPrimitiveModeStr(GLenum mode)
|
||||
{
|
||||
switch(mode)
|
||||
{
|
||||
case (Primitive::POINTS) : return "POINTS";
|
||||
case (Primitive::LINES) : return "LINES";
|
||||
case (Primitive::LINE_STRIP) : return "LINE_STRIP";
|
||||
case (Primitive::LINE_LOOP) : return "LINE_LOOP";
|
||||
case (Primitive::TRIANGLES) : return "TRIANGLES";
|
||||
case (Primitive::TRIANGLE_STRIP) : return "TRIANGLE_STRIP";
|
||||
case (Primitive::TRIANGLE_FAN) : return "TRIANGLE_FAN";
|
||||
case (Primitive::QUADS) : return "QUADS";
|
||||
case (Primitive::QUAD_STRIP) : return "QUAD_STRIP";
|
||||
case (Primitive::POLYGON) : return "POLYGON";
|
||||
default : return "UnknownPrimitveType";
|
||||
}
|
||||
}
|
||||
@@ -14,6 +14,7 @@ CXXFILES =\
|
||||
Fog.cpp\
|
||||
FrontFace.cpp\
|
||||
Geode.cpp\
|
||||
Geometry.cpp\
|
||||
GeoSet.cpp\
|
||||
Group.cpp\
|
||||
Image.cpp\
|
||||
|
||||
@@ -64,9 +64,9 @@ void Optimizer::optimize(osg::Node* node, unsigned int options)
|
||||
|
||||
}
|
||||
|
||||
// convert the old style GeoSet to Geometry
|
||||
ConvertGeoSetsToGeometryVisitor cgtg;
|
||||
node->accept(cgtg);
|
||||
// // convert the old style GeoSet to Geometry
|
||||
// ConvertGeoSetsToGeometryVisitor cgtg;
|
||||
// node->accept(cgtg);
|
||||
|
||||
|
||||
if (options & SHARE_DUPLICATE_STATE)
|
||||
|
||||
Reference in New Issue
Block a user