Mercurial > hg > Game > Games
comparison Orchestland/Assets/LeapMotion/DemoResources/Scripts/StemMesh.cs @ 3:0030a1b971fb default tip
merge
author | Yuta ANSE <e135745@ie.u-ryukyu.ac.jp> |
---|---|
date | Fri, 17 Jul 2015 23:23:43 +0900 |
parents | f7675884f2a1 |
children |
comparison
equal
deleted
inserted
replaced
2:fdab88fc2cb9 | 3:0030a1b971fb |
---|---|
1 /******************************************************************************\ | |
2 * Copyright (C) Leap Motion, Inc. 2011-2014. * | |
3 * Leap Motion proprietary. Licensed under Apache 2.0 * | |
4 * Available at http://www.apache.org/licenses/LICENSE-2.0.html * | |
5 \******************************************************************************/ | |
6 | |
7 using UnityEngine; | |
8 using System.Collections; | |
9 | |
10 public class StemMesh : MonoBehaviour { | |
11 | |
12 const int TRIANGLE_INDICES_PER_QUAD = 6; | |
13 const int VERTICES_PER_QUAD = 4; | |
14 | |
15 public Collider[] segments; | |
16 public int sides = 4; | |
17 public AnimationCurve stemCurve; | |
18 public float growthProgress = 0.0f; | |
19 public float stumpDiminishTime = 2.0f; | |
20 | |
21 private Vector3[] vertices_; | |
22 private bool[] broken; | |
23 private float stump_width_ = 1.0f; | |
24 private bool is_diminishing_ = false; | |
25 | |
26 void Start () { | |
27 broken = new bool[segments.Length]; | |
28 for (int i = 0; i < broken.Length; ++i) | |
29 broken[i] = false; | |
30 | |
31 MeshFilter filter = GetComponent<MeshFilter>(); | |
32 filter.mesh = new Mesh(); | |
33 InitMesh(); | |
34 filter.mesh.RecalculateBounds(); | |
35 filter.mesh.RecalculateNormals(); | |
36 } | |
37 | |
38 void Update () { | |
39 UpdateMesh(); | |
40 MeshFilter filter = GetComponent<MeshFilter>(); | |
41 | |
42 filter.mesh.MarkDynamic(); | |
43 filter.mesh.vertices = vertices_; | |
44 filter.mesh.RecalculateBounds(); | |
45 filter.mesh.RecalculateNormals(); | |
46 } | |
47 | |
48 public bool IsBroken() { | |
49 if (broken == null) | |
50 return false; | |
51 | |
52 for (int i = 0; i < broken.Length; ++i) { | |
53 if (broken[i]) | |
54 return true; | |
55 } | |
56 return false; | |
57 } | |
58 | |
59 public bool IsStumpClear() { | |
60 return stump_width_ == 0.0f; | |
61 } | |
62 | |
63 public void RemoveStump() { | |
64 is_diminishing_ = true; | |
65 } | |
66 | |
67 private void InitMesh() { | |
68 Mesh mesh = GetComponent<MeshFilter>().mesh; | |
69 | |
70 int num_vertices = sides * segments.Length; | |
71 vertices_ = new Vector3[num_vertices]; | |
72 Vector2[] uv = new Vector2[num_vertices]; | |
73 | |
74 int[] triangles = new int[TRIANGLE_INDICES_PER_QUAD * (num_vertices - sides)]; | |
75 | |
76 for (int v = 0; v < num_vertices; ++v) { | |
77 vertices_[v] = new Vector3(0, 0, 0); | |
78 uv[v] = new Vector3(0, 0, 0); | |
79 } | |
80 | |
81 int vertex_index = 0; | |
82 for (int seg = 0; seg < segments.Length - 1; ++seg) { | |
83 if (segments[seg + 1].GetComponent<HingeJoint>() == null) { | |
84 for (int i = 0; i < sides * TRIANGLE_INDICES_PER_QUAD; ++i) | |
85 triangles[vertex_index++] = 0; | |
86 } | |
87 else { | |
88 for (int side = 0; side < sides; ++side) { | |
89 int next_side = (side + 1) % sides; | |
90 triangles[vertex_index++] = sides * seg + side; | |
91 triangles[vertex_index++] = sides * seg + next_side; | |
92 triangles[vertex_index++] = sides * (seg + 1) + next_side; | |
93 | |
94 triangles[vertex_index++] = sides * seg + side; | |
95 triangles[vertex_index++] = sides * (seg + 1) + next_side; | |
96 triangles[vertex_index++] = sides * (seg + 1) + side; | |
97 } | |
98 } | |
99 } | |
100 | |
101 mesh.vertices = vertices_; | |
102 mesh.uv = uv; | |
103 mesh.triangles = triangles; | |
104 } | |
105 | |
106 protected void Separate(int index) { | |
107 for (int i = 0; i < index; ++i) | |
108 segments[i] = null; | |
109 } | |
110 | |
111 private void Break(int index) { | |
112 for (int i = index; i < segments.Length; ++i) { | |
113 segments[i] = null; | |
114 } | |
115 } | |
116 | |
117 private void KillStump() { | |
118 for (int i = 0; i < broken.Length && !broken[i]; ++i) | |
119 segments[i].GetComponent<Collider>().enabled = false; | |
120 } | |
121 | |
122 private void UpdateMesh() { | |
123 if (is_diminishing_ && stump_width_ != 0.0f) { | |
124 stump_width_ -= Time.deltaTime / stumpDiminishTime; | |
125 stump_width_ = Mathf.Clamp(stump_width_, 0.0f, 1.0f); | |
126 if (stump_width_ == 0.0f) | |
127 KillStump(); | |
128 } | |
129 | |
130 for (int i = 0; i < segments.Length; ++i) { | |
131 if (!broken[i] && segments[i].GetComponent<HingeJoint>() == null) { | |
132 InitMesh(); | |
133 broken[i] = true; | |
134 } | |
135 } | |
136 | |
137 int vertex_index = 0; | |
138 float angle = 360.0f / sides; | |
139 | |
140 bool is_stump = true; | |
141 for (int i = 0; i < segments.Length; ++i) { | |
142 float phase = (1.0f * i) / (segments.Length - 1); | |
143 float width = Mathf.Clamp(segments.Length * growthProgress - i, 0.0f, 1.0f); | |
144 | |
145 is_stump = is_stump && !broken[i]; | |
146 if (is_stump) | |
147 width *= stump_width_; | |
148 | |
149 Vector3 offset = new Vector3(width * stemCurve.Evaluate(phase), 0, 0); | |
150 | |
151 for (int side = 0; side < sides; ++side) { | |
152 vertices_[vertex_index++] = | |
153 transform.InverseTransformPoint(segments[i].transform.TransformPoint(offset)); | |
154 offset = Quaternion.AngleAxis(angle, Vector3.up) * offset; | |
155 } | |
156 } | |
157 } | |
158 } |