Initialize libbullet git in 2.0_beta.
[platform/upstream/libbullet.git] / Extras / PhysicsEffects / src / base_level / collision / pfx_contact_large_tri_mesh.cpp
1 /*\r
2 Physics Effects Copyright(C) 2010 Sony Computer Entertainment Inc.\r
3 All rights reserved.\r
4 \r
5 Physics Effects is open software; you can redistribute it and/or\r
6 modify it under the terms of the BSD License.\r
7 \r
8 Physics Effects is distributed in the hope that it will be useful,\r
9 but WITHOUT ANY WARRANTY; without even the implied warranty of\r
10 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\r
11 See the BSD License for more details.\r
12 \r
13 A copy of the BSD License is distributed with\r
14 Physics Effects under the filename: physics_effects_license.txt\r
15 */\r
16 \r
17 #include "../../../include/physics_effects/base_level/base/pfx_vec_utils.h"\r
18 #include "pfx_contact_tri_mesh_sphere.h"\r
19 #include "pfx_contact_tri_mesh_box.h"\r
20 #include "pfx_contact_tri_mesh_capsule.h"\r
21 #include "pfx_contact_tri_mesh_cylinder.h"\r
22 #include "pfx_contact_tri_mesh_convex.h"\r
23 #include "pfx_contact_large_tri_mesh.h"\r
24 #include "pfx_intersect_common.h"\r
25 #include "pfx_mesh_common.h"\r
26 \r
27 \r
28 namespace sce {\r
29 namespace PhysicsEffects {\r
30 \r
31 \r
32 PfxInt32 pfxContactLargeTriMesh(\r
33                                 PfxContactCache &contacts,\r
34                                 const PfxLargeTriMesh *lmeshA,\r
35                                 const PfxTransform3 &transformA,\r
36                                 const PfxShape &shapeB,\r
37                                 const PfxTransform3 &transformB,\r
38                                 PfxFloat distanceThreshold)\r
39 {\r
40         PfxTransform3 transformAB;\r
41         PfxMatrix3 matrixAB;\r
42         PfxVector3 offsetAB;\r
43         \r
44         // Bローカル→Aローカルへの変換\r
45         transformAB = orthoInverse(transformA) * transformB;\r
46         matrixAB = transformAB.getUpper3x3();\r
47         offsetAB = transformAB.getTranslation();\r
48         \r
49         // -----------------------------------------------------\r
50         // LargeTriMeshに含まれるTriMeshのAABBと凸体のAABBを判定し、\r
51         // 交差するものを個別に衝突判定する。※LargeMesh座標系\r
52         \r
53         PfxVector3 shapeHalf(0.0f);\r
54         PfxVector3 shapeCenter = offsetAB;\r
55         \r
56 \r
57         switch(shapeB.getType()) {\r
58                 case kPfxShapeSphere:\r
59                 shapeHalf = PfxVector3(shapeB.getSphere().m_radius);\r
60                 break;\r
61                 \r
62                 case kPfxShapeCapsule:\r
63                 {\r
64                         PfxCapsule capsule = shapeB.getCapsule();\r
65                         shapeHalf = absPerElem(matrixAB) * PfxVector3(capsule.m_halfLen+capsule.m_radius,capsule.m_radius,capsule.m_radius);\r
66                 }\r
67                 break;\r
68                 \r
69                 case kPfxShapeCylinder:\r
70                 {\r
71                         PfxCylinder cylinder = shapeB.getCylinder();\r
72                         shapeHalf = absPerElem(matrixAB) * PfxVector3(cylinder.m_halfLen,cylinder.m_radius,cylinder.m_radius);\r
73                 }\r
74                 break;\r
75                 \r
76                 case kPfxShapeBox:\r
77                 shapeHalf = absPerElem(matrixAB) * shapeB.getBox().m_half;\r
78                 break;\r
79                 \r
80                 case kPfxShapeConvexMesh:\r
81         shapeHalf = absPerElem(matrixAB) * shapeB.getConvexMesh()->m_half;\r
82                 break;\r
83                 \r
84                 default:\r
85                 break;\r
86         }\r
87 \r
88         // -----------------------------------------------------\r
89         // アイランドとの衝突判定\r
90 \r
91         PfxVecInt3 aabbMinL,aabbMaxL;\r
92         lmeshA->getLocalPosition((shapeCenter-shapeHalf),(shapeCenter+shapeHalf),aabbMinL,aabbMaxL);\r
93         \r
94         PfxUInt32 numIslands = lmeshA->m_numIslands;\r
95 \r
96         {\r
97         for(PfxUInt32 i=0;i<numIslands;i++) {\r
98                 // AABBチェック\r
99                 PfxAabb16 aabbB = lmeshA->m_aabbList[i];\r
100                 if(aabbMaxL.getX() < pfxGetXMin(aabbB) || aabbMinL.getX() > pfxGetXMax(aabbB)) continue;\r
101                 if(aabbMaxL.getY() < pfxGetYMin(aabbB) || aabbMinL.getY() > pfxGetYMax(aabbB)) continue;\r
102                 if(aabbMaxL.getZ() < pfxGetZMin(aabbB) || aabbMinL.getZ() > pfxGetZMax(aabbB)) continue;\r
103                 \r
104                 PfxTriMesh *island = &lmeshA->m_islands[i];\r
105 \r
106                         // 衝突判定\r
107                         PfxContactCache localContacts;\r
108                         switch(shapeB.getType()) {\r
109                                 case kPfxShapeSphere:\r
110                                 pfxContactTriMeshSphere(localContacts,island,transformA,shapeB.getSphere(),transformB,distanceThreshold);\r
111                                 break;\r
112                                 \r
113                                 case kPfxShapeCapsule:\r
114                                 pfxContactTriMeshCapsule(localContacts,island,transformA,shapeB.getCapsule(),transformB,distanceThreshold);\r
115                                 break;\r
116                                 \r
117                                 case kPfxShapeBox:\r
118                                 pfxContactTriMeshBox(localContacts,island,transformA,shapeB.getBox(),transformB,distanceThreshold);\r
119                                 break;\r
120                                 \r
121                                 case kPfxShapeCylinder:\r
122                                 pfxContactTriMeshCylinder(localContacts,island,transformA,shapeB.getCylinder(),transformB,distanceThreshold);\r
123                                 break;\r
124                                 \r
125                                 case kPfxShapeConvexMesh:\r
126                         pfxContactTriMeshConvex(localContacts,island,transformA,*shapeB.getConvexMesh(),transformB,distanceThreshold);\r
127                                 break;\r
128                                 \r
129                                 default:\r
130                                 break;\r
131                         }\r
132 \r
133                         \r
134                         // 衝突点を追加\r
135                         for(int j=0;j<localContacts.getNumContacts();j++) {\r
136                                 PfxSubData subData = localContacts.getSubData(j);\r
137                                 subData.setIslandId(i);\r
138                                 contacts.addContactPoint(\r
139                                         localContacts.getDistance(j),\r
140                                         localContacts.getNormal(j),\r
141                                         localContacts.getLocalPointA(j),\r
142                                         localContacts.getLocalPointB(j),\r
143                                         subData);\r
144                         }\r
145                 }\r
146         }\r
147 \r
148 \r
149         return contacts.getNumContacts();\r
150 }\r
151 } //namespace PhysicsEffects\r
152 } //namespace sce\r