summaryrefslogtreecommitdiff
path: root/Runtime/Dynamics/RaycastHit.cpp
diff options
context:
space:
mode:
authorchai <chaifix@163.com>2019-08-14 22:50:43 +0800
committerchai <chaifix@163.com>2019-08-14 22:50:43 +0800
commit15740faf9fe9fe4be08965098bbf2947e096aeeb (patch)
treea730ec236656cc8cab5b13f088adfaed6bb218fb /Runtime/Dynamics/RaycastHit.cpp
+Unity Runtime codeHEADmaster
Diffstat (limited to 'Runtime/Dynamics/RaycastHit.cpp')
-rw-r--r--Runtime/Dynamics/RaycastHit.cpp48
1 files changed, 48 insertions, 0 deletions
diff --git a/Runtime/Dynamics/RaycastHit.cpp b/Runtime/Dynamics/RaycastHit.cpp
new file mode 100644
index 0000000..b888d5e
--- /dev/null
+++ b/Runtime/Dynamics/RaycastHit.cpp
@@ -0,0 +1,48 @@
+#include "UnityPrefix.h"
+#if ENABLE_PHYSICS
+#include "RaycastHit.h"
+#include "MeshCollider.h"
+#include "Runtime/Filters/Mesh/LodMesh.h"
+#include "Runtime/Terrain/Heightmap.h"
+#include "Runtime/Graphics/Transform.h"
+#include "Runtime/Dynamics/TerrainCollider.h"
+
+Vector2f CalculateRaycastTexcoord (Collider* collider, const Vector2f& uv, const Vector3f& pos, UInt32 face, int texcoord)
+{
+ MeshCollider* meshCollider = dynamic_pptr_cast<MeshCollider*> (collider);
+ if (meshCollider != NULL)
+ {
+ Mesh* mesh = meshCollider->GetSharedMesh();
+ if (mesh == NULL)
+ return Vector2f::zero;
+ UInt32 indices[3];
+ if (!mesh->ExtractTriangle (face, indices))
+ return Vector2f::zero;
+ StrideIterator<Vector2f> uvs;
+ if (texcoord == 1 && mesh->IsAvailable (kShaderChannelTexCoord1))
+ uvs = mesh->GetUvBegin (1);
+ else if (mesh->IsAvailable (kShaderChannelTexCoord0))
+ uvs = mesh->GetUvBegin (0);
+ else
+ return Vector2f::zero;
+ Vector2f interpolated = uvs[indices[1]] * uv.x;
+ interpolated += uvs[indices[2]] * uv.y;
+ interpolated += uvs[indices[0]] * (1.0F - (uv.y + uv.x));
+ return interpolated;
+ }
+#if ENABLE_TERRAIN
+ TerrainCollider* terrainCollider = dynamic_pptr_cast<TerrainCollider*> (collider);
+ if (terrainCollider)
+ {
+ Vector2f uv;
+ Vector3f scale = terrainCollider->GetCachedInvSize();
+ Vector3f transformPos = terrainCollider->GetComponent(Transform).GetPosition();
+ uv.x = scale.x * (pos.x - transformPos.x);
+ uv.y = scale.z * (pos.z - transformPos.z);
+ return uv;
+ }
+ else
+#endif // ENABLE_TERRAIN
+ return Vector2f::zero;
+}
+#endif //ENABLE_PHYSICS