Added support for serailizing and scripting BoundingBox and BoundingSphere objects

This commit is contained in:
Robert Osfield
2014-02-10 16:44:13 +00:00
parent 3dcca431a9
commit 31e98b51df
15 changed files with 405 additions and 53 deletions

View File

@@ -527,8 +527,12 @@ public:
virtual void apply(osg::Vec4d& value) { _lsg->getValue(value); _numberToPop = 4; }
virtual void apply(osg::Quat& value) { _lsg->getValue(value); _numberToPop = 4; }
virtual void apply(osg::Plane& value) { _lsg->getValue(value); _numberToPop = 4; }
virtual void apply(osg::Matrixf& value) { _lsg->getValue(value); }
virtual void apply(osg::Matrixd& value) { _lsg->getValue(value); }
virtual void apply(osg::Matrixf& value) { _lsg->getValue(value); }
virtual void apply(osg::Matrixd& value) { _lsg->getValue(value); }
virtual void apply(osg::BoundingBoxf& value) { _lsg->getValue(value); }
virtual void apply(osg::BoundingBoxd& value) { _lsg->getValue(value); }
virtual void apply(osg::BoundingSpheref& value) { _lsg->getValue(value); }
virtual void apply(osg::BoundingSphered& value) { _lsg->getValue(value); }
};
int LuaScriptEngine::pushPropertyToStack(osg::Object* object, const std::string& propertyName) const
@@ -650,19 +654,6 @@ int LuaScriptEngine::pushPropertyToStack(osg::Object* object, const std::string&
}
break;
}
#ifdef OSG_USE_FLOAT_MATRIX
case(osgDB::BaseSerializer::RW_MATRIX):
#endif
case(osgDB::BaseSerializer::RW_MATRIXF):
{
osg::Matrixf value;
if (_pi.getProperty(object, propertyName, value))
{
pushValue(value);
return 1;
}
break;
}
case(osgDB::BaseSerializer::RW_VEC2D):
{
osg::Vec2d value;
@@ -693,6 +684,19 @@ int LuaScriptEngine::pushPropertyToStack(osg::Object* object, const std::string&
}
break;
}
#ifdef OSG_USE_FLOAT_MATRIX
case(osgDB::BaseSerializer::RW_MATRIX):
#endif
case(osgDB::BaseSerializer::RW_MATRIXF):
{
osg::Matrixf value;
if (_pi.getProperty(object, propertyName, value))
{
pushValue(value);
return 1;
}
break;
}
#ifndef OSG_USE_FLOAT_MATRIX
case(osgDB::BaseSerializer::RW_MATRIX):
#endif
@@ -706,6 +710,46 @@ int LuaScriptEngine::pushPropertyToStack(osg::Object* object, const std::string&
}
break;
}
case(osgDB::BaseSerializer::RW_BOUNDINGBOXF):
{
osg::BoundingBoxf value;
if (_pi.getProperty(object, propertyName, value))
{
pushValue(value);
return 1;
}
break;
}
case(osgDB::BaseSerializer::RW_BOUNDINGBOXD):
{
osg::BoundingBoxd value;
if (_pi.getProperty(object, propertyName, value))
{
pushValue(value);
return 1;
}
break;
}
case(osgDB::BaseSerializer::RW_BOUNDINGSPHEREF):
{
osg::BoundingSpheref value;
if (_pi.getProperty(object, propertyName, value))
{
pushValue(value);
return 1;
}
break;
}
case(osgDB::BaseSerializer::RW_BOUNDINGSPHERED):
{
osg::BoundingSphered value;
if (_pi.getProperty(object, propertyName, value))
{
pushValue(value);
return 1;
}
break;
}
case(osgDB::BaseSerializer::RW_LIST):
{
OSG_NOTICE<<"Need to implement RW_LIST support"<<std::endl;
@@ -859,19 +903,6 @@ int LuaScriptEngine::setPropertyFromStack(osg::Object* object, const std::string
}
break;
}
#ifdef OSG_USE_FLOAT_MATRIX
case(osgDB::BaseSerializer::RW_MATRIX):
#endif
case(osgDB::BaseSerializer::RW_MATRIXF):
{
osg::Matrixf value;
if (getValue(value))
{
_pi.setProperty(object, propertyName, value);
return 0;
}
break;
}
case(osgDB::BaseSerializer::RW_VEC2D):
{
osg::Vec2d value;
@@ -922,6 +953,19 @@ int LuaScriptEngine::setPropertyFromStack(osg::Object* object, const std::string
}
break;
}
#ifdef OSG_USE_FLOAT_MATRIX
case(osgDB::BaseSerializer::RW_MATRIX):
#endif
case(osgDB::BaseSerializer::RW_MATRIXF):
{
osg::Matrixd value;
if (getValue(value))
{
_pi.setProperty(object, propertyName, value);
return 0;
}
break;
}
#ifndef OSG_USE_FLOAT_MATRIX
case(osgDB::BaseSerializer::RW_MATRIX):
#endif
@@ -935,6 +979,46 @@ int LuaScriptEngine::setPropertyFromStack(osg::Object* object, const std::string
}
break;
}
case(osgDB::BaseSerializer::RW_BOUNDINGBOXF):
{
osg::BoundingBoxf value;
if (getValue(value))
{
_pi.setProperty(object, propertyName, value);
return 0;
}
break;
}
case(osgDB::BaseSerializer::RW_BOUNDINGBOXD):
{
osg::BoundingBoxd value;
if (getValue(value))
{
_pi.setProperty(object, propertyName, value);
return 0;
}
break;
}
case(osgDB::BaseSerializer::RW_BOUNDINGSPHEREF):
{
osg::BoundingSpheref value;
if (getValue(value))
{
_pi.setProperty(object, propertyName, value);
return 0;
}
break;
}
case(osgDB::BaseSerializer::RW_BOUNDINGSPHERED):
{
osg::BoundingSphered value;
if (getValue(value))
{
_pi.setProperty(object, propertyName, value);
return 0;
}
break;
}
case(osgDB::BaseSerializer::RW_LIST):
{
OSG_NOTICE<<"Need to implement RW_LIST support"<<std::endl;
@@ -1026,6 +1110,29 @@ bool LuaScriptEngine::getfields(const char* f1, const char* f2, const char* f3,
return true;
}
bool LuaScriptEngine::getfields(const char* f1, const char* f2, const char* f3, const char* f4, const char* f5, const char* f6, int type) const
{
lua_getfield(_lua, -1, f1);
if (lua_type(_lua, -1)!=type) { lua_pop(_lua, 1); return false; }
lua_getfield(_lua, -2, f2);
if (lua_type(_lua, -1)!=type) { lua_pop(_lua, 2); return false; }
lua_getfield(_lua, -3, f3);
if (lua_type(_lua, -1)!=type) { lua_pop(_lua, 3); return false; }
lua_getfield(_lua, -4, f4);
if (lua_type(_lua, -1)!=type) { lua_pop(_lua, 4); return false; }
lua_getfield(_lua, -5, f5);
if (lua_type(_lua, -1)!=type) { lua_pop(_lua, 5); return false; }
lua_getfield(_lua, -6, f6);
if (lua_type(_lua, -1)!=type) { lua_pop(_lua, 6); return false; }
return true;
}
bool LuaScriptEngine::getelements(int numElements, int type) const
{
int abs_pos = lua_gettop(_lua);
@@ -1097,6 +1204,11 @@ osgDB::BaseSerializer::Type LuaScriptEngine::getType() const
OSG_NOTICE<<"Could be Matrixd"<<std::endl;
return osgDB::BaseSerializer::RW_MATRIXD;
}
else if ((numNumberKeys==6) && (numNumberFields==6))
{
OSG_NOTICE<<"Could be BoundingBoxd"<<std::endl;
return osgDB::BaseSerializer::RW_BOUNDINGBOXD;
}
// not supported
OSG_NOTICE<<"Warning: LuaScriptEngine::getType() Lua table configuration not supported."<<std::endl;
break;
@@ -1166,6 +1278,32 @@ bool LuaScriptEngine::getmatrix() const
return false;
}
bool LuaScriptEngine::getboundingbox() const
{
if (lua_istable(_lua, -1))
{
if (getfields("xMin", "yMin", "zMin", "xMax", "yMax", "zMax", LUA_TNUMBER) ||
getelements(6, LUA_TNUMBER))
{
return true;
}
}
return false;
}
bool LuaScriptEngine::getboundingsphere() const
{
if (lua_istable(_lua, -1))
{
if (getfields("x", "y", "z", "radius", LUA_TNUMBER) ||
getelements(4, LUA_TNUMBER))
{
return true;
}
}
return false;
}
bool LuaScriptEngine::getValue(osg::Vec2f& value) const
{
if (!getvec2()) return false;
@@ -1262,6 +1400,38 @@ bool LuaScriptEngine::getValue(osg::Matrixd& value) const
return true;
}
bool LuaScriptEngine::getValue(osg::BoundingBoxf& value) const
{
if (!getboundingbox()) return false;
value.set(lua_tonumber(_lua, -6), lua_tonumber(_lua, -5), lua_tonumber(_lua, -4), lua_tonumber(_lua, -3), lua_tonumber(_lua, -2), lua_tonumber(_lua, -1));
lua_pop(_lua, 6);
return true;
}
bool LuaScriptEngine::getValue(osg::BoundingBoxd& value) const
{
if (!getboundingbox()) return false;
value.set(lua_tonumber(_lua, -6), lua_tonumber(_lua, -5), lua_tonumber(_lua, -4), lua_tonumber(_lua, -3), lua_tonumber(_lua, -2), lua_tonumber(_lua, -1));
lua_pop(_lua, 6);
return true;
}
bool LuaScriptEngine::getValue(osg::BoundingSpheref& value) const
{
if (!getboundingsphere()) return false;
value.set(osg::Vec3f(lua_tonumber(_lua, -4), lua_tonumber(_lua, -3), lua_tonumber(_lua, -2)), lua_tonumber(_lua, -1));
lua_pop(_lua, 4);
return true;
}
bool LuaScriptEngine::getValue(osg::BoundingSphered& value) const
{
if (!getboundingsphere()) return false;
value.set(osg::Vec3d(lua_tonumber(_lua, -4), lua_tonumber(_lua, -3), lua_tonumber(_lua, -2)), lua_tonumber(_lua, -1));
lua_pop(_lua, 4);
return true;
}
void LuaScriptEngine::pushValue(const osg::Vec2f& value) const
{
lua_newtable(_lua);
@@ -1354,6 +1524,46 @@ void LuaScriptEngine::pushValue(const osg::Matrixd& value) const
}
}
void LuaScriptEngine::pushValue(const osg::BoundingBoxf& value) const
{
lua_newtable(_lua);
lua_pushstring(_lua, "xMin"); lua_pushnumber(_lua, value.xMin()); lua_settable(_lua, -3);
lua_pushstring(_lua, "yMin"); lua_pushnumber(_lua, value.yMin()); lua_settable(_lua, -3);
lua_pushstring(_lua, "zMin"); lua_pushnumber(_lua, value.zMin()); lua_settable(_lua, -3);
lua_pushstring(_lua, "xMax"); lua_pushnumber(_lua, value.xMax()); lua_settable(_lua, -3);
lua_pushstring(_lua, "yMax"); lua_pushnumber(_lua, value.yMax()); lua_settable(_lua, -3);
lua_pushstring(_lua, "zMax"); lua_pushnumber(_lua, value.zMax()); lua_settable(_lua, -3);
}
void LuaScriptEngine::pushValue(const osg::BoundingBoxd& value) const
{
lua_newtable(_lua);
lua_pushstring(_lua, "xMin"); lua_pushnumber(_lua, value.xMin()); lua_settable(_lua, -3);
lua_pushstring(_lua, "yMin"); lua_pushnumber(_lua, value.yMin()); lua_settable(_lua, -3);
lua_pushstring(_lua, "zMin"); lua_pushnumber(_lua, value.zMin()); lua_settable(_lua, -3);
lua_pushstring(_lua, "xMax"); lua_pushnumber(_lua, value.xMax()); lua_settable(_lua, -3);
lua_pushstring(_lua, "yMax"); lua_pushnumber(_lua, value.yMax()); lua_settable(_lua, -3);
lua_pushstring(_lua, "zMax"); lua_pushnumber(_lua, value.zMax()); lua_settable(_lua, -3);
}
void LuaScriptEngine::pushValue(const osg::BoundingSpheref& value) const
{
lua_newtable(_lua);
lua_pushstring(_lua, "x"); lua_pushnumber(_lua, value.center().x()); lua_settable(_lua, -3);
lua_pushstring(_lua, "y"); lua_pushnumber(_lua, value.center().y()); lua_settable(_lua, -3);
lua_pushstring(_lua, "z"); lua_pushnumber(_lua, value.center().z()); lua_settable(_lua, -3);
lua_pushstring(_lua, "radius"); lua_pushnumber(_lua, value.radius()); lua_settable(_lua, -3);
}
void LuaScriptEngine::pushValue(const osg::BoundingSphered& value) const
{
lua_newtable(_lua);
lua_pushstring(_lua, "x"); lua_pushnumber(_lua, value.center().x()); lua_settable(_lua, -3);
lua_pushstring(_lua, "y"); lua_pushnumber(_lua, value.center().y()); lua_settable(_lua, -3);
lua_pushstring(_lua, "z"); lua_pushnumber(_lua, value.center().z()); lua_settable(_lua, -3);
lua_pushstring(_lua, "radius"); lua_pushnumber(_lua, value.radius()); lua_settable(_lua, -3);
}
bool LuaScriptEngine::pushParameter(osg::Object* object) const
{
osg::ValueObject* vo = dynamic_cast<osg::ValueObject*>(object);
@@ -1491,6 +1701,30 @@ osg::Object* LuaScriptEngine::popParameterObject() const
if (getValue(value)) object = new osg::MatrixdValueObject("", value);
break;
}
case(osgDB::BaseSerializer::RW_BOUNDINGBOXF):
{
osg::BoundingBoxf value;
if (getValue(value)) object = new osg::BoundingBoxfValueObject("", value);
break;
}
case(osgDB::BaseSerializer::RW_BOUNDINGBOXD):
{
osg::BoundingBoxd value;
if (getValue(value)) object = new osg::BoundingBoxdValueObject("", value);
break;
}
case(osgDB::BaseSerializer::RW_BOUNDINGSPHEREF):
{
osg::BoundingSpheref value;
if (getValue(value)) object = new osg::BoundingSpherefValueObject("", value);
break;
}
case(osgDB::BaseSerializer::RW_BOUNDINGSPHERED):
{
osg::BoundingSphered value;
if (getValue(value)) object = new osg::BoundingSpheredValueObject("", value);
break;
}
case(osgDB::BaseSerializer::RW_LIST):
{
OSG_NOTICE<<"Need to implement RW_LIST support"<<std::endl;