查看: 1535|回复: 2

发现OSG2.9.6版的一个小BUG

[复制链接]

该用户从未签到

发表于 2010-1-15 09:19:26 | 显示全部楼层 |阅读模式
今天发现了发现OSG2.9.6版的一个小BUG,当创建一个AutoTransform节点并保存为Ive文件的时候,若你的是在开发成AxtiveX的情况下,系统会崩溃,当你开发的是Exe程序,则表面上没有问题,但数据是有错的
仔细查看了一下源代码,发现AutoTransform在2.9.6里面被改成了有几个成员变量被改成了Double型,_maximumScale就是其中一个,在构造函数里面
AutoTransform::AutoTransform():
    _autoUpdateEyeMovementTolerance(0.0f),
    _autoRotateMode(NO_ROTATION),
    _autoScaleToScreen(false),
    _scale(1.0f,1.0f,1.0f),
    _firstTimeToInitEyePoint(true),
    _minimumScale(0.0f),
    _maximumScale(DBL_MAX),
    _autoScaleTransitionWidthRatio(0.25f),
    _matrixDirty(true)
{
//    setNumChildrenRequiringUpdateTraversal(1);
}
他被初始化为_maximumScale(DBL_MAX)最大的double型,

再看看IVE插件的保存代码
void AutoTransform::write(DataOutputStream* out){
    // Write AutoTransform's identification.
    out->writeInt(IVEAUTOTRANSFORM);
    // If the osg class is inherited by any other class we should also write this to file.
    osg::Transform*  trans = dynamic_cast<osg::Transform*>(this);
    if(trans){
        ((ive::Transform*)(trans))->write(out);
    }
    else
        throw Exception("AutoTransform::write(): Could not cast this osg::AutoTransform to an osg::Transform.");
    // Write AutoTransform's properties.
    out->writeVec3(getPosition());
    out->writeVec3(getPivotPoint());
    out->writeFloat(getAutoUpdateEyeMovementTolerance());
   
    out->writeInt(getAutoRotateMode());
    out->writeBool(getAutoScaleToScreen());
    if ( out->getVersion() >= VERSION_0025 )
    {
        out->writeFloat(getMinimumScale());
        out->writeFloat(getMaximumScale());
        out->writeFloat(getAutoScaleTransitionWidthRatio());
    }
    out->writeQuat(getRotation());
    out->writeVec3(getScale());
   
}

其中out->writeFloat(getMaximumScale())等还都是用Float型保存的,导致转换成Float型时溢出出错,在某些情况下会导致系统崩溃,即使系统不崩溃,再读出来的 _maximumScale也讲完全错误,而导致不可预料的事情发生。

另,也许这种类似转换的错误还不少,忘有心人到官网上去提一下,我不知道在哪里提,所以在这里说一下,谢谢

该用户从未签到

发表于 2010-1-15 09:39:24 | 显示全部楼层
呵呵,欢迎您到osg-users邮件组去发表英文邮件,提出您的修改意见,请一定署真实的英文名以表示对他人的尊重。您也可以到osg-submissions上直接提交您的修改结果。这两个邮件组的订阅地址分别为:
http://lists.openscenegraph.org/ ... -openscenegraph.org
http://lists.openscenegraph.org/ ... -openscenegraph.org

我和Robert一直在探讨第二代osg文件格式的问题,新的格式将直接支持文本/二进制两种存储方式,并通过序列化I/O的方式,简化插件代码以及彻底解决您所述的问题。也欢迎您加入这一讨论的行列,也许过几日就会发布我编写的第二代osg格式插件

该用户从未签到

发表于 2010-1-15 10:13:51 | 显示全部楼层
期待~
您需要登录后才可以回帖 登录 | 注册

本版积分规则

OSG中国官方论坛-有您OSG在中国才更好

网站简介:osgChina是国内首个三维相关技术开源社区,旨在为国内更多的技术开发人员提供最前沿的技术资讯,为更多的三维从业者提供一个学习、交流的技术平台。

联系我们

  • 工作时间:09:00--18:00
  • 反馈邮箱:1315785073@qq.com
快速回复 返回顶部 返回列表