void Update()
{
if (aud_shakeIt_springingBegin == true)
{
aud_shakeIt_springingBegin = false;
}
selectedGO = UnityEditor.Selection.activeGameObject;
hitpoint_camToMouse = mouseRaycast_script.hitpoint;
Input_DoubleClick();
// *****************************
// new Delaunay of only the void points...because our mesh needs to be made out of triangles anyway
newDelaunay_Vertices2D = new List <Vector2>();
colorsForDelaunay = new List <uint>();
sumX = 0;
sumZ = 0;
for (int i = 0; i < boundingQbits_allInfo.Count; i++)
{
// stuff for new delaunay...
Vector3 positionForDelaunay;
if (boundingQbits_allInfo[i].qbitMovementScript.qtype == 1)
{
positionForDelaunay = boundingQbits_allInfo[i].transform.position;
}
else
{
positionForDelaunay = boundingQbits_allInfo[i].qbitMovementScript.jittery_centerPosition;
}
newDelaunay_Vertices2D.Add(new Vector2(positionForDelaunay.x, positionForDelaunay.z));
sumX += positionForDelaunay.x;
sumZ += positionForDelaunay.z;
colorsForDelaunay.Add(0);
}
Delaunay.Voronoi voronoi = new Delaunay.Voronoi(newDelaunay_Vertices2D, colorsForDelaunay, new Rect(0, 0, floorWidth, floorHeight));
trianglesFromNewDelaunay = voronoi.Triangles();
convexHullPts_FromNewDelaunay = voronoi.HullPointsInOrder();
meshArea = 0;
voidMesh_Vertices3D = new Vector3[trianglesFromNewDelaunay.Count * 3];
voidMesh_Triangles = new int[trianglesFromNewDelaunay.Count * 3];
if (swarmParams_script.void_upsideDownReveal_on == true && iAmOpen == true)
{
// prepare randRange for Y values for voidMesh_Vertices3D generated below
upsideDownReveal_amp = swarmParams_script.void_upsideDownReveal_ampLocal;
// the max allowed Y height is scaled from the current upsideDownReveal_amp
upsideDownReveal_meshY_randRange = new Vector2(0f, Scale(upsideDownReveal_amp, 0f, 1f, 0f, upsideDownReveal_meshY_maxHeight));
}
else
{
// 0 Y height, cuz not upsideDownReveal
upsideDownReveal_meshY_randRange = Vector2.one * 0f;
}
for (int t = 0; t < trianglesFromNewDelaunay.Count; t++)
{
int index0 = t * 3;
int index1 = (t * 3) + 1;
int index2 = (t * 3) + 2;
voidMesh_Triangles[index0] = index0;
voidMesh_Triangles[index1] = index1;
voidMesh_Triangles[index2] = index2;
float[] y_values = new float[3];
int indexRand = Random.Range(0, 3);
float randValue = Random.Range(upsideDownReveal_meshY_randRange[0], upsideDownReveal_meshY_randRange[1]);
for (int i = 0; i < y_values.Length; i++)
{
if (i == indexRand)
{
y_values[i] = randValue;
}
else
{
y_values[i] = 0;
}
}
voidMesh_Vertices3D[index0] = new Vector3(trianglesFromNewDelaunay[t].sites[0].Coord.x, y_values[0], trianglesFromNewDelaunay[t].sites[0].Coord.y);
voidMesh_Vertices3D[index1] = new Vector3(trianglesFromNewDelaunay[t].sites[1].Coord.x, y_values[1], trianglesFromNewDelaunay[t].sites[1].Coord.y);
voidMesh_Vertices3D[index2] = new Vector3(trianglesFromNewDelaunay[t].sites[2].Coord.x, y_values[2], trianglesFromNewDelaunay[t].sites[2].Coord.y);
meshArea += delaunayScript.TriangleArea(trianglesFromNewDelaunay[t]);
}
// *****************************
// opening and closing the void...
// destroy me if below area thresh
if (meshArea < trackingAreaThresh)
{
AllPolysOff();
Destroy(gameObject);
// Destroy() finishes excecuting the Update() loop, which leads to the polys turning back on - boo
// so we create a bool here telling the ReportOSC() to not execute this frame
destroyMe = true;
}
// opening...
if (meshArea >= xfadeAreaThresh && startOpening == true)
{
startOpening = false;
isClosing = false;
isOpening = true;
voidXfadePhase = 0;
xfadeStartTime = Time.time;
colorStart = colorClosed;
colorEnd = colorOpen;
}
// closing...
if (meshArea < xfadeAreaThresh && isOpening == false && startOpening == false)
{
startClosing = true;
}
if (startClosing == true)
{
isClosing = true;
startClosing = false;
startOpening = true;
voidXfadePhase = 0;
xfadeStartTime = Time.time;
colorStart = colorOpen;
colorEnd = colorClosed;
}
// xfading for opening and closing...
if (voidXfadePhase != -1)
{
if (isOpening == true)
{
voidXfadePhase = (Time.time - xfadeStartTime) / xfadeTotalTime;
voidMaterial.color = Color.Lerp(colorStart, colorEnd, voidXfadePhase);
if (voidXfadePhase >= 1.0f)
{
iAmOpen = true;
aud_voidOpen_click = true;
isOpening = false;
voidXfadePhase = -1;
}
}
else if (isClosing == true)
{
voidXfadePhase = (Time.time - xfadeStartTime) / xfadeTotalTime;
voidMaterial.color = Color.Lerp(colorStart, colorEnd, voidXfadePhase);
if (voidXfadePhase >= 1.0f)
{
iAmOpen = false;
isClosing = false;
aud_voidClose_click = true;
// EdgeMovingPolyOff(); <-- todo delete
ShakeItPolyOff();
}
}
}
// *****************************
// draw mesh
// draw the mesh...
voidMesh.Clear();
voidMesh.vertices = voidMesh_Vertices3D;
voidMesh.triangles = voidMesh_Triangles;
voidMesh.RecalculateNormals();
meshCentroid = new Vector3(sumX / boundingQbits_allInfo.Count, 0, sumZ / boundingQbits_allInfo.Count);
// ScaleAround( this.gameObject, meshCentroid, new Vector3( voidScale, voidScale, voidScale) );
// *****************************
// static, shakeIt
if ((isOpening == true || iAmOpen == true) && isClosing == false)
{
Input_ShakeIt();
// EdgeMoving();
}
if (iAmOpen == true && isClosing == false)
{
VoidStatic();
}
// *****************************
// prepare data for Qbits, etc
// this method includes concave detection:
Build_ConvexHullOrder_AllInfo();
// we also separately maintain an array of all the positions because the Method in QbitMovement.cs that checks for
// qbits inside voids needs a Vector2[] - and I did not write that method:
boundingQbits_convexHullOrder_positions = new Vector2[convexHullPts_FromNewDelaunay.Count];
convexHullPts_FromNewDelaunay.CopyTo(boundingQbits_convexHullOrder_positions);
// to self_voidAllInfo contribute info...
// area, centroid, and convexHullOrder_allInfo, igniterEvent, shakeIt etc
self_voidAllInfo.area = meshArea;
self_voidAllInfo.centroid = meshCentroid;
self_voidAllInfo.isOpening = isOpening;
self_voidAllInfo.isOpen = iAmOpen;
self_voidAllInfo.boundingQbits_convexHullOrder_positions = boundingQbits_convexHullOrder_positions;
self_voidAllInfo.boundingQbits_convexHullOrder_allInfo = boundingQbits_convexHullOrder_allInfo;
self_voidAllInfo.hitby_igniter = aud_hitby_igniter;
self_voidAllInfo.hitby_voidIgniterType = hitby_voidIgniterType;
self_voidAllInfo.shakeIt_displacingBegin = aud_shakeIt_displacingBegin;
self_voidAllInfo.shakeIt_springingBegin = aud_shakeIt_springingBegin;
// *****************************
// osc
if (destroyMe == false)
{
ReportOsc();
}
/*
* if (selectedGO != null)
* {
* if (selectedGO.name == this.transform.name)
* { Debug.Log("allInfo " + ( self_voidAllInfo == null ) + " prev " + ( self_voidAllInfoPrev == null)); }
* }*/
// *****************************
// prev, setbacks
self_voidAllInfoPrev = self_voidAllInfo.DeepCopy();
mouse_hitMePrev = mouse_hitMe;
localPosPrev = transform.position;
aud_static_oneClick = false;
}