#include #include #include #include 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); Array* Array_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(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; Array* colors = Array_readLocalData(fr); if (colors) { geom.setColorArray(colors); iteratorAdvanced++; } } if (fr.matchSequence("TexCoordArray %i %w %i {")) { int unit=0; fr[1].getInt(unit); fr+=2; Array* texcoords = Array_readLocalData(fr); if (texcoords) { geom.setTexCoordArray(unit,texcoords); iteratorAdvanced++; } } return iteratorAdvanced; } Array* Array_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 void Array_writeLocalData(Output& fw, Iterator first, Iterator last) { fw.indent() << "{"<(array); fw<(array); fw<(array); fw<(array); fw<(array); fw<(array); fw<(array); fw<(array); fw<(array); fw<(array); fw<(array); fw<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.getType()) { case(Primitive::DrawArraysPrimitiveType): { const DrawArrays& cprim = static_cast(prim); fw<(prim); fw<(prim); fw<(prim); fw<(obj); const Geometry::PrimitiveList& primitives = geom.getPrimitiveList(); if (!primitives.empty()) { fw.indent() << "Primitives "<