Checked in .osg support for the new osg::Geometry class.

This commit is contained in:
Robert Osfield
2002-06-24 21:37:34 +00:00
parent d174f60f8c
commit cbb95d0445
7 changed files with 863 additions and 41 deletions

View File

@@ -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

View 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;
};

View File

@@ -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;

View File

@@ -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");

View 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";
}
}

View File

@@ -14,6 +14,7 @@ CXXFILES =\
Fog.cpp\
FrontFace.cpp\
Geode.cpp\
Geometry.cpp\
GeoSet.cpp\
Group.cpp\
Image.cpp\

View File

@@ -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)