コード例 #1
0
surface_points_t* EvalSurfaceNormals( surface_points_t *in )
{
    vec3d_t		un, vn;
    vec3d_t		center;
    vec3d_t		tmp;
    int		unum, vnum;
    int		u, v;
    vec3d_t		norm;


    surface_points_t *nmesh;

    unum = in->upointnum;
    vnum = in->vpointnum;

    nmesh = NewSurfacePoints( unum, vnum );

    for ( u = 0; u < unum; u++ )
        for ( v = 0; v < vnum; v++ )
        {
            GetSurfacePoint( in, u, v, center );

            Vec3dInit( vn, 0, 0, 0 );
            Vec3dInit( un, 0, 0, 0 );

            if ( IsPointValid( u-1, v, unum, vnum ) )
            {
                GetSurfacePoint( in, u-1, v, tmp );
                Vec3dSub( tmp, center, tmp );
                Vec3dAdd( un, tmp, un );
            }
            if ( IsPointValid( u+1, v, unum, vnum ) )
            {
                GetSurfacePoint( in, u+1, v, tmp );
                Vec3dSub( tmp, tmp, center );
                Vec3dAdd( un, tmp, un );
            }
            if ( IsPointValid( u, v-1, unum, vnum ) )
            {
                GetSurfacePoint( in, u, v-1, tmp );
                Vec3dSub( tmp, center, tmp );
                Vec3dAdd( vn, tmp, vn );
            }
            if ( IsPointValid( u, v+1, unum, vnum ) )
            {
                GetSurfacePoint( in, u, v+1, tmp );
                Vec3dSub( tmp, tmp, center );
                Vec3dAdd( vn, tmp, vn );
            }

            Vec3dCrossProduct( norm, un, vn );
            Vec3dUnify( norm );

            SetSurfacePoint( nmesh, u, v, norm );
        }

    return nmesh;
}
コード例 #2
0
void TerritoryRegion::TestNode( int x,  int y, const unsigned char player, const unsigned char radius, const bool check_barriers)
{
    // check whether his node is within the area we may have territory in
    if (check_barriers && !IsPointValid(gwb, gwb->GetPlayer(player)->GetRestrictedArea(), x, y))
        return;

    // Gucken, ob der Punkt überhaupt mit in diese Region gehört
    if(x + gwb->GetWidth() >= int(x1) && x + gwb->GetWidth() < int(x2))
        x += gwb->GetWidth();
    else if(x - gwb->GetWidth() >= int(x1) && x - gwb->GetWidth() < int(x2))
        x -= gwb->GetWidth();
    else if(x < int(x1) || x >= int(x2))
        return;

    if(y + gwb->GetHeight() >= int(y1) && y + gwb->GetHeight() < int(y2))
        y += gwb->GetHeight();
    else if(y - gwb->GetHeight() >= int(y1) && y - gwb->GetHeight() < int(y2))
        y -= gwb->GetHeight();
    else if(y < int(y1) || y >= int(y2))
        return;

    /// Wenn das Militargebäude jetzt näher dran ist, dann geht dieser Punkt in den Besitz vom jeweiligen Spieler
    /// oder wenn es halt gar nicht besetzt ist
    unsigned idx = (y - y1) * (x2 - x1) + (x - x1);
    if(radius < nodes[idx].radius || !nodes[(y - y1) * (x2 - x1) + (x - x1)].owner)
    {
        nodes[idx].owner = player + 1;
        nodes[idx].radius = radius;
    }
}