summaryrefslogtreecommitdiff
path: root/Runtime/Dynamics/RaycastHit.cpp
blob: b888d5e1a8e61aa1ab7d7c6e9544844243d40db0 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
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