Box2D结构初始化

时间:2012-08-18 07:33:30

标签: c++ struct box2d

我正在开发一个带Box2D物理的简单游戏引擎。由于引擎是一个静态库,所有Box2D源都已内置到引擎自带的静态库中。

当我在发布模式上构建时,我得到一个结构“在这里声明”的错误

这是问题行

    // Initialize the separating axis.
    b2SeparationFunction fcn;
    fcn.Initialize(&cache, proxyA, sweepA, proxyB, sweepB, t1);

b2SeparationFunction是一个与上面两行

位于同一文件中的结构
struct b2SeparationFunction
{


enum Type
    {
        e_points,
        e_faceA,
        e_faceB
    };



// TODO_ERIN might not need to return the separation

float32 Initialize(const b2SimplexCache* cache,
    const b2DistanceProxy* proxyA, const b2Sweep& sweepA,
    const b2DistanceProxy* proxyB, const b2Sweep& sweepB,
    float32 t1)
{
    m_proxyA = proxyA;
    m_proxyB = proxyB;
    int32 count = cache->count;
    b2Assert(0 < count && count < 3);

    m_sweepA = sweepA;
    m_sweepB = sweepB;

    b2Transform xfA, xfB;
    m_sweepA.GetTransform(&xfA, t1);
    m_sweepB.GetTransform(&xfB, t1);

    if (count == 1)
    {
        m_type = e_points;
        b2Vec2 localPointA = m_proxyA->GetVertex(cache->indexA[0]);
        b2Vec2 localPointB = m_proxyB->GetVertex(cache->indexB[0]);
        b2Vec2 pointA = b2Mul(xfA, localPointA);
        b2Vec2 pointB = b2Mul(xfB, localPointB);
        m_axis = pointB - pointA;
        float32 s = m_axis.Normalize();
        return s;
    }
    else if (cache->indexA[0] == cache->indexA[1])
    {
        // Two points on B and one on A.
        m_type = e_faceB;
        b2Vec2 localPointB1 = proxyB->GetVertex(cache->indexB[0]);
        b2Vec2 localPointB2 = proxyB->GetVertex(cache->indexB[1]);

        m_axis = b2Cross(localPointB2 - localPointB1, 1.0f);
        m_axis.Normalize();
        b2Vec2 normal = b2Mul(xfB.q, m_axis);

        m_localPoint = 0.5f * (localPointB1 + localPointB2);
        b2Vec2 pointB = b2Mul(xfB, m_localPoint);

        b2Vec2 localPointA = proxyA->GetVertex(cache->indexA[0]);
        b2Vec2 pointA = b2Mul(xfA, localPointA);

        float32 s = b2Dot(pointA - pointB, normal);
        if (s < 0.0f)
        {
            m_axis = -m_axis;
            s = -s;
        }
        return s;
    }
    else
    {
        // Two points on A and one or two points on B.
        m_type = e_faceA;
        b2Vec2 localPointA1 = m_proxyA->GetVertex(cache->indexA[0]);
        b2Vec2 localPointA2 = m_proxyA->GetVertex(cache->indexA[1]);

        m_axis = b2Cross(localPointA2 - localPointA1, 1.0f);
        m_axis.Normalize();
        b2Vec2 normal = b2Mul(xfA.q, m_axis);

        m_localPoint = 0.5f * (localPointA1 + localPointA2);
        b2Vec2 pointA = b2Mul(xfA, m_localPoint);

        b2Vec2 localPointB = m_proxyB->GetVertex(cache->indexB[0]);
        b2Vec2 pointB = b2Mul(xfB, localPointB);

        float32 s = b2Dot(pointB - pointA, normal);
        if (s < 0.0f)
        {
            m_axis = -m_axis;
            s = -s;
        }
        return s;
    }
}

float32 FindMinSeparation(int32* indexA, int32* indexB, float32 t) const
{
    b2Transform xfA, xfB;
    m_sweepA.GetTransform(&xfA, t);
    m_sweepB.GetTransform(&xfB, t);

    switch (m_type)
    {
    case e_points:
        {
            b2Vec2 axisA = b2MulT(xfA.q,  m_axis);
            b2Vec2 axisB = b2MulT(xfB.q, -m_axis);

            *indexA = m_proxyA->GetSupport(axisA);
            *indexB = m_proxyB->GetSupport(axisB);

            b2Vec2 localPointA = m_proxyA->GetVertex(*indexA);
            b2Vec2 localPointB = m_proxyB->GetVertex(*indexB);

            b2Vec2 pointA = b2Mul(xfA, localPointA);
            b2Vec2 pointB = b2Mul(xfB, localPointB);

            float32 separation = b2Dot(pointB - pointA, m_axis);
            return separation;
        }

    case e_faceA:
        {
            b2Vec2 normal = b2Mul(xfA.q, m_axis);
            b2Vec2 pointA = b2Mul(xfA, m_localPoint);

            b2Vec2 axisB = b2MulT(xfB.q, -normal);

            *indexA = -1;
            *indexB = m_proxyB->GetSupport(axisB);

            b2Vec2 localPointB = m_proxyB->GetVertex(*indexB);
            b2Vec2 pointB = b2Mul(xfB, localPointB);

            float32 separation = b2Dot(pointB - pointA, normal);
            return separation;
        }

    case e_faceB:
        {
            b2Vec2 normal = b2Mul(xfB.q, m_axis);
            b2Vec2 pointB = b2Mul(xfB, m_localPoint);

            b2Vec2 axisA = b2MulT(xfA.q, -normal);

            *indexB = -1;
            *indexA = m_proxyA->GetSupport(axisA);

            b2Vec2 localPointA = m_proxyA->GetVertex(*indexA);
            b2Vec2 pointA = b2Mul(xfA, localPointA);

            float32 separation = b2Dot(pointA - pointB, normal);
            return separation;
        }

    default:
        b2Assert(false);
        *indexA = -1;
        *indexB = -1;
        return 0.0f;
    }
}

float32 Evaluate(int32 indexA, int32 indexB, float32 t) const
{
    b2Transform xfA, xfB;
    m_sweepA.GetTransform(&xfA, t);
    m_sweepB.GetTransform(&xfB, t);

    switch (m_type)
    {
    case e_points:
        {
            b2Vec2 axisA = b2MulT(xfA.q,  m_axis);
            b2Vec2 axisB = b2MulT(xfB.q, -m_axis);

            b2Vec2 localPointA = m_proxyA->GetVertex(indexA);
            b2Vec2 localPointB = m_proxyB->GetVertex(indexB);

            b2Vec2 pointA = b2Mul(xfA, localPointA);
            b2Vec2 pointB = b2Mul(xfB, localPointB);
            float32 separation = b2Dot(pointB - pointA, m_axis);

            return separation;
        }

    case e_faceA:
        {
            b2Vec2 normal = b2Mul(xfA.q, m_axis);
            b2Vec2 pointA = b2Mul(xfA, m_localPoint);

            b2Vec2 axisB = b2MulT(xfB.q, -normal);

            b2Vec2 localPointB = m_proxyB->GetVertex(indexB);
            b2Vec2 pointB = b2Mul(xfB, localPointB);

            float32 separation = b2Dot(pointB - pointA, normal);
            return separation;
        }

    case e_faceB:
        {
            b2Vec2 normal = b2Mul(xfB.q, m_axis);
            b2Vec2 pointB = b2Mul(xfB, m_localPoint);

            b2Vec2 axisA = b2MulT(xfA.q, -normal);

            b2Vec2 localPointA = m_proxyA->GetVertex(indexA);
            b2Vec2 pointA = b2Mul(xfA, localPointA);

            float32 separation = b2Dot(pointA - pointB, normal);
            return separation;
        }

    default:
        b2Assert(false);
        return 0.0f;
    }
}

const b2DistanceProxy* m_proxyA;
const b2DistanceProxy* m_proxyB;
b2Sweep m_sweepA, m_sweepB;
Type m_type;
b2Vec2 m_localPoint;
b2Vec2 m_axis;
}

我得到的错误是:C:\Users\david\Documents\Scales\ScalesEngine\src\Box2D\Collision\b2TimeOfImpact.cpp|327|note: '*((void*)(& fcn)+84).b2Vec2::x' was declared here|

此错误的前一个是:include\Box2D\Common\b2Math.h|590|warning: '*((void*)(& fcn)+84).b2Vec2::x' may be used uninitialized in this function [-Wuninitialized]|

我发现strust正在使用这个功能:

inline b2Vec2 b2Mul(const b2Transform& T, const b2Vec2& v)
{
    float32 x = (T.q.c * v.x - T.q.s * v.y) + T.p.x;
    float32 y = (T.q.s * v.x + T.q.c * v.y) + T.p.y;

    return b2Vec2(x, y);
}

所以我认为问题出在这里,但我看不到它!

我正在使用gcc与gcc,

感谢您的帮助。

1 个答案:

答案 0 :(得分:0)

首先,将x重命名为独特的内容,例如&#34; my_field_named_x&#34;所以你可以更容易地找到它,使用-save-temps,http://gcc.gnu.org/onlinedocs/gcc/Debugging-Options.html并准确发布你的&#34; my_field_named_x&#34;发生在。我们将从那里开始。