11
11
using System . Text ;
12
12
using System . Threading . Tasks ;
13
13
using UnityEngine ;
14
+ using static UnityEditor . FilePathAttribute ;
14
15
15
16
namespace OpenTS2 . Scenes . ParticleEffects
16
17
{
@@ -22,6 +23,7 @@ public class SwarmDecal : MonoBehaviour
22
23
private Vector3 _position ;
23
24
private Vector3 _rotation ;
24
25
private Material _material ;
26
+ private Mesh _decalMesh ;
25
27
26
28
private void Start ( )
27
29
{
@@ -47,12 +49,11 @@ public void Initialize()
47
49
var meshFilter = GetComponent < MeshFilter > ( ) ;
48
50
var meshRenderer = GetComponent < MeshRenderer > ( ) ;
49
51
50
- meshFilter . sharedMesh = terrainMeshFilter . sharedMesh ;
52
+ BuildDecalMesh ( terrainMeshFilter . sharedMesh ) ;
53
+ meshFilter . sharedMesh = _decalMesh ;
51
54
52
- _material = new Material ( Shader . Find ( "OpenTS2/NeighborhoodDecal " ) ) ;
55
+ _material = new Material ( Shader . Find ( "OpenTS2/BakedDecal " ) ) ;
53
56
_material . mainTexture = _textureAsset . GetSelectedImageAsUnityTexture ( ) ;
54
- _material . SetVector ( Location , _position ) ;
55
- _material . SetVector ( Rotation , _rotation ) ;
56
57
57
58
meshRenderer . sharedMaterial = _material ;
58
59
transform . SetParent ( null ) ;
@@ -61,10 +62,89 @@ public void Initialize()
61
62
transform . localScale = Vector3 . one ;
62
63
}
63
64
65
+ private Vector2 RotateUV ( Vector2 uv , float angle )
66
+ {
67
+ var cos = Mathf . Cos ( angle ) ;
68
+ var sin = Mathf . Sin ( angle ) ;
69
+ var x = uv . x * cos - uv . y * sin ;
70
+ var y = uv . x * sin + uv . y * cos ;
71
+ return new Vector2 ( x , y ) ;
72
+ }
73
+
74
+ private Vector2 GetUV ( Vector3 point )
75
+ {
76
+ var radius = 80f ;
77
+ var radiusHalf = radius * 0.5f ;
78
+ var minPos = _position ;
79
+ minPos -= new Vector3 ( radiusHalf , radiusHalf , radiusHalf ) ;
80
+ var maxPos = minPos + new Vector3 ( radius , radius , radius ) ;
81
+
82
+ point -= minPos ;
83
+ point /= radius ;
84
+
85
+ var uv = new Vector2 ( point . x - 0.5f , point . z - 0.5f ) ;
86
+ uv = RotateUV ( GetUV ( uv ) , _rotation . y * Mathf . Deg2Rad ) ;
87
+ uv += new Vector2 ( 0.5f , 0.5f ) ;
88
+ return uv ;
89
+ }
90
+ private void BuildDecalMesh ( Mesh terrainMesh )
91
+ {
92
+ _decalMesh = new Mesh ( ) ;
93
+ var vertices = terrainMesh . vertices ;
94
+ var uvs = new Vector2 [ terrainMesh . vertices . Length ] ;
95
+
96
+ var oTriangles = terrainMesh . triangles ;
97
+ var triangles = new List < int > ( ) ;
98
+
99
+ var radius = 80f ;
100
+ var radiusHalf = radius * 0.5f ;
101
+ var decalPositionMatrix = Matrix4x4 . Translate ( new Vector3 ( - _position . x + radiusHalf , 0f , - _position . z + radiusHalf ) ) ;
102
+ var decalRotationMatrix = Matrix4x4 . Rotate ( Quaternion . Euler ( 0f , _rotation . y , 0f ) ) ;
103
+
104
+ for ( var i = 0 ; i < vertices . Length ; i ++ )
105
+ {
106
+ var v = decalPositionMatrix . MultiplyPoint ( vertices [ i ] ) ;
107
+ v /= radius ;
108
+ v . x -= 0.5f ;
109
+ v . z -= 0.5f ;
110
+ v = decalRotationMatrix . MultiplyPoint ( v ) ;
111
+ v . x += 0.5f ;
112
+ v . z += 0.5f ;
113
+
114
+ uvs [ i ] = new Vector2 ( v . x , v . z ) ;
115
+ }
116
+
117
+ for ( var i = 0 ; i < oTriangles . Length ; i += 3 )
118
+ {
119
+ var v1i = oTriangles [ i ] ;
120
+ var v2i = oTriangles [ i + 1 ] ;
121
+ var v3i = oTriangles [ i + 2 ] ;
122
+
123
+ var v1 = uvs [ v1i ] ;
124
+ var v2 = uvs [ v2i ] ;
125
+ var v3 = uvs [ v3i ] ;
126
+
127
+ if ( ( v1 . x < 1f && v1 . y < 1f && v1 . x > 0f && v1 . y > 0f ) ||
128
+ ( v2 . x < 1f && v2 . y < 1f && v2 . x > 0f && v2 . y > 0f ) ||
129
+ ( v3 . x < 1f && v3 . y < 1f && v3 . x > 0f && v3 . y > 0f ) )
130
+ {
131
+ triangles . Add ( v1i ) ;
132
+ triangles . Add ( v2i ) ;
133
+ triangles . Add ( v3i ) ;
134
+ }
135
+ }
136
+
137
+ _decalMesh . SetVertices ( vertices ) ;
138
+ _decalMesh . SetUVs ( 0 , uvs ) ;
139
+ _decalMesh . SetTriangles ( triangles , 0 ) ;
140
+ }
141
+
64
142
private void OnDestroy ( )
65
143
{
66
144
if ( _material != null )
67
145
_material . Free ( ) ;
146
+ if ( _decalMesh != null )
147
+ _decalMesh . Free ( ) ;
68
148
}
69
149
}
70
150
}
0 commit comments