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; }
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; } }