-
Notifications
You must be signed in to change notification settings - Fork 32
/
ClothRenderer.cs
106 lines (97 loc) · 3.59 KB
/
ClothRenderer.cs
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
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
using UnityEngine;
//[ExecuteInEditMode]
// ReSharper disable once CheckNamespace
public class ClothRenderer : MonoBehaviour {
public Material mat;
public Light lightgameObject;
public MeshTopology meshTopology;
private ComputeBuffer computeBufferPosition;
private ComputeBuffer computeBufferVelocity;
private ComputeBuffer computeBufferTexcoord;
private ComputeBuffer computeBufferTriangle;
private ComputeBuffer computeBufferNormal;
private ComputeBuffer computeBufferForce;
private ComputeBuffer computeBufferCollisionResult;
int vertn;
int vertm;
int numVertex;
private Vector4 lightP;
private Vector3 lightI;
private ClothSimulation anchor;
[HideInInspector]
public bool ready;
private void linker()
{
computeBufferPosition = anchor.computeBufferWorldPosition;
computeBufferVelocity = anchor.computeBufferVelocity;
computeBufferTexcoord = anchor.computeBufferTexcoord;
computeBufferTriangle = anchor.triangleBuffer;
computeBufferNormal = anchor.normalBuffer;
computeBufferForce = anchor.forceBuffer;
vertn = anchor.vertexColumn;
vertm = anchor.vertexRow;
numVertex = anchor.numVertex;
}
public void controller()
{
anchor = GetComponent<ClothSimulation>();
linker();
initLight(lightgameObject);
initMat();
ready = true;
}
private void initMat()
{
mat.SetBuffer("Forces",computeBufferForce);
mat.SetFloat("maxForce", 200.0f);
mat.SetBuffer("CollisionResult", computeBufferCollisionResult);
mat.SetBuffer("Position", computeBufferPosition);
mat.SetBuffer("Velocity", computeBufferVelocity);
mat.SetBuffer("TC", computeBufferTexcoord);
mat.SetBuffer("Trimap", computeBufferTriangle);
mat.SetBuffer("Nor", computeBufferNormal);
mat.SetInt("vertn", vertn);
mat.SetInt("vertm", vertm);
mat.SetVector("Light_P", lightP);
mat.SetVector("Light_I", lightI);
mat.SetVector("Kd", new Vector3(1.0f, 1.0f, 1.0f));
mat.SetVector("Ka", new Vector3(0.4f, 0.4f, 0.4f));
mat.SetVector("Ks", new Vector3(0.8f, 0.8f, 0.8f));
mat.SetFloat("Shininess", 256.0f);
}
#region initialize Light values
private void initLight(Light inputLight)
{
lightP = new Vector4(inputLight.transform.position.x, inputLight.transform.position.y, inputLight.transform.position.z, 1.0f);
lightI = new Vector3(inputLight.intensity, inputLight.intensity, inputLight.intensity);
lightI = new Vector3(1.0f, 1.0f, 1.0f);
}
#endregion
// ReSharper disable once InconsistentNaming
// ReSharper disable once UnusedMember.Local
private void OnRenderObject()
{
if (!ready) return;
mat.SetPass(0);
switch (meshTopology)
{
case MeshTopology.Points:
Graphics.DrawProcedural(meshTopology, numVertex, 1);
break;
case MeshTopology.Triangles:
Graphics.DrawProcedural(meshTopology, (vertn - 1) * (vertm - 1) * 6, 1);
break;
case MeshTopology.LineStrip:
Graphics.DrawProcedural(meshTopology, (vertn - 1) * (vertm - 1) * 6, 1);
break;
case MeshTopology.Quads:
Graphics.DrawProcedural(meshTopology, numVertex / 4, 1);
break;
case MeshTopology.Lines:
break;
default:
Debug.Log("unhandled Mesh Topology\n");
break;
}
}
}