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
|