B2Collision.cpp
(manifold *B2Manifold, xfA B2Transform, radiusA float64, xfB B2Transform, radiusB float64)
| 268 | /////////////////////////////////////////////////////////////////////////////// |
| 269 | |
| 270 | func (wm *B2WorldManifold) Initialize(manifold *B2Manifold, xfA B2Transform, radiusA float64, xfB B2Transform, radiusB float64) { |
| 271 | if manifold.PointCount == 0 { |
| 272 | return |
| 273 | } |
| 274 | |
| 275 | switch manifold.Type { |
| 276 | case B2Manifold_Type.E_circles: |
| 277 | { |
| 278 | wm.Normal.Set(1.0, 0.0) |
| 279 | pointA := B2TransformVec2Mul(xfA, manifold.LocalPoint) |
| 280 | pointB := B2TransformVec2Mul(xfB, manifold.Points[0].LocalPoint) |
| 281 | if B2Vec2DistanceSquared(pointA, pointB) > B2_epsilon*B2_epsilon { |
| 282 | wm.Normal = B2Vec2Sub(pointB, pointA) |
| 283 | wm.Normal.Normalize() |
| 284 | } |
| 285 | |
| 286 | cA := B2Vec2Add(pointA, B2Vec2MulScalar(radiusA, wm.Normal)) |
| 287 | cB := B2Vec2Sub(pointB, B2Vec2MulScalar(radiusB, wm.Normal)) |
| 288 | |
| 289 | wm.Points[0] = B2Vec2MulScalar(0.5, B2Vec2Add(cA, cB)) |
| 290 | wm.Separations[0] = B2Vec2Dot(B2Vec2Sub(cB, cA), wm.Normal) |
| 291 | } |
| 292 | break |
| 293 | |
| 294 | case B2Manifold_Type.E_faceA: |
| 295 | { |
| 296 | wm.Normal = B2RotVec2Mul(xfA.Q, manifold.LocalNormal) |
| 297 | planePoint := B2TransformVec2Mul(xfA, manifold.LocalPoint) |
| 298 | |
| 299 | for i := 0; i < manifold.PointCount; i++ { |
| 300 | clipPoint := B2TransformVec2Mul(xfB, manifold.Points[i].LocalPoint) |
| 301 | cA := B2Vec2Add( |
| 302 | clipPoint, |
| 303 | B2Vec2MulScalar( |
| 304 | radiusA-B2Vec2Dot( |
| 305 | B2Vec2Sub(clipPoint, planePoint), |
| 306 | wm.Normal, |
| 307 | ), |
| 308 | wm.Normal, |
| 309 | ), |
| 310 | ) |
| 311 | cB := B2Vec2Sub(clipPoint, B2Vec2MulScalar(radiusB, wm.Normal)) |
| 312 | wm.Points[i] = B2Vec2MulScalar(0.5, B2Vec2Add(cA, cB)) |
| 313 | wm.Separations[i] = B2Vec2Dot( |
| 314 | B2Vec2Sub(cB, cA), |
| 315 | wm.Normal, |
| 316 | ) |
| 317 | } |
| 318 | } |
| 319 | break |
| 320 | |
| 321 | case B2Manifold_Type.E_faceB: |
| 322 | { |
| 323 | wm.Normal = B2RotVec2Mul(xfB.Q, manifold.LocalNormal) |
| 324 | planePoint := B2TransformVec2Mul(xfB, manifold.LocalPoint) |
| 325 | |
| 326 | for i := 0; i < manifold.PointCount; i++ { |
| 327 | clipPoint := B2TransformVec2Mul(xfA, manifold.Points[i].LocalPoint) |
nothing calls this directly
no test coverage detected