

using UnityEngine;
using System.Collections;
using ProceduralToolkit;
using System.Collections.Generic;
using System.IO;
using UnityEngine.UI;
public class ArgosMoon : MonoBehaviour
{
//StreamWriter sWrite;
public float radius = 1f;
public int longitudeSegments = 64;
public int latitudeSegments = 64;
//public Slider angVelSlider;
//public Text avSlideVal;
//float angularVelDegsPerSec = 0f;
//public Text DBG_Text;
public class H_Element
{
public MeshDraft mdH = new MeshDraft();
public float timer;
public int[] neighborLoc = new int[6];
public int myIndex;
public Vector3 GetCenter()
{
Vector3 vc = mdH.vertices[0] + mdH.vertices[1] + mdH.vertices[2] + mdH.vertices[3];
return vc / 4f;
}
public Quaternion GetQuat()
{
Vector3 vFwd = GetCenter().normalized;
Vector3 vUp = (mdH.vertices[0] - mdH.vertices[1]).normalized;
return Quaternion.LookRotation(vFwd, vUp);
}
}
public class Quad_Element
{
public MeshDraft mdQuad = new MeshDraft();
public H_Element[] H = new H_Element[4];
public int[] H_idx = new int[4]; //Hex locations
public int myIndex;
}
public List<Quad_Element> LLQuads = new List<Quad_Element>();
public List<H_Element> HexQuads = new List<H_Element>();
MeshDraft meshDraft_Sphere = new MeshDraft();
private void Awake()
{
//sWrite = new StreamWriter("Argos_Topology.txt");
meshDraft_Sphere = new MeshDraft();
meshDraft_Sphere = MeshDraft.Sphere(radius, longitudeSegments, latitudeSegments);
GetComponent<MeshFilter>().mesh = meshDraft_Sphere.ToMesh();
//Build_LLQuad_List();
//Build_HexQuad_List();
//LinkLists();
transform.RotateAround(transform.position, transform.forward, 0f);
}
void OnApplicationQuit()
{
//sWrite.Close();
}
public void OnSliderChanged()
{
//angularVelDegsPerSec = angVelSlider.value;
//avSlideVal.text = angularVelDegsPerSec.ToString("F0") + " dps";
}
private void Update()
{
//transform.RotateAround(transform.position, transform.up, angularVelDegsPerSec * Time.deltaTime);
}
public Vector2 getLatLong(Vector3 point)
{
float fLat, fLong;
fLong = Mathf.Atan2(point.x, point.z);
if (fLong < 0.0f)
{
fLong = 2f * Mathf.PI + fLong;
}
fLat = Mathf.Atan2(point.y, Mathf.Sqrt(point.x * point.x + point.z * point.z));
return new Vector2(fLat, fLong);
}
public int getHexIdx(Vector3 point)//error code means point outside of 1% tolerance
{
int qIdx = getLLQuadIdx(point);
if (qIdx == -1) return -1; //point outside of 1% radius tolerance
//DBG_Text.text = "qIdx = " + qIdx.ToString() + " H0 = " + LLQuads[qIdx].H_idx[0].ToString() + " H1 = " + LLQuads[qIdx].H_idx[1].ToString() + " H2 = " + LLQuads[qIdx].H_idx[2].ToString() + " H3 = " + LLQuads[qIdx].H_idx[3].ToString();
Vector3 v0 = LLQuads[qIdx].mdQuad.vertices[0];
Vector3 v1 = LLQuads[qIdx].mdQuad.vertices[1];
Vector3 v2 = LLQuads[qIdx].mdQuad.vertices[2];
Vector3 v3 = LLQuads[qIdx].mdQuad.vertices[3];
Vector3 vXn = v2 - v0; float magX = vXn.magnitude; vXn.Normalize();
Vector3 vYn = v1 - v0; float magY = vYn.magnitude; vYn.Normalize();
Vector3 vP = point - v0;
//float magP = vP.magnitude;
if (Vector3.Dot(vXn, vP) < (1f / 6f) * magX) return LLQuads[qIdx].H_idx[0];
if (Vector3.Dot(vXn, vP) > (5f / 6f) * magX) return LLQuads[qIdx].H_idx[3];
if (Vector3.Dot(vXn, vP) > ((1f / 3f) * magX) && Vector3.Dot(vXn, vP) < ((2f / 3f) * magX))
{
if (Vector3.Dot(vYn, vP) < (1f / 2f) * magY) return LLQuads[qIdx].H_idx[1];
else return LLQuads[qIdx].H_idx[2];
}
Vector3 A = v0 + (1f / 6f) * vXn * magX;
Vector3 B = v0 + (1f / 3f) * vXn * magX + (1f/2f) * vYn * magY;
Vector3 C = v1 + (1f / 6f) * vXn * magX;
Vector3 D = v2 - (1f / 6f) * vXn * magX;
Vector3 E = v2 - (1f / 3f) * vXn * magX + (1f / 2f) * vYn * magY;
Vector3 F = v3 - (1f / 6f) * vXn * magX;
Vector3 APos = point - A;
Vector3 AB = B - A;
Vector3 CPos = point - C;
Vector3 CB = B - C;
Vector3 vFwd = point.normalized;
//float yDot = Vector3.Dot(vYn, vP);
//float halfMag = (1f / 2f) * magY;
//float outDot = Vector3.Dot(Vector3.Cross(DPos, DE), vFwd);
//DBG_Text.text = "qIdx = " + qIdx.ToString() + " H0 = " + LLQuads[qIdx].H_idx[0].ToString() + " H1 = " + LLQuads[qIdx].H_idx[1].ToString() + " H2 = " + LLQuads[qIdx].H_idx[2].ToString() + " H3 = " + LLQuads[qIdx].H_idx[3].ToString();
//DBG_Text.text = "yDot = " + yDot.ToString("F4") + " (1f/2f)* magY " + halfMag.ToString("F4") + " outDot = " + outDot.ToString("F4") + " H2 = " + LLQuads[qIdx].H_idx[2].ToString() + " H3 = " + LLQuads[qIdx].H_idx[3].ToString();
if (Vector3.Dot(vXn, vP) > (1f/6f)*magX && Vector3.Dot(vXn, vP) < (1f/3f)*magX)
{
if (Vector3.Dot(vYn, vP) < (1f/2f)* magY)
{
if (Vector3.Dot(Vector3.Cross(APos, AB), vFwd) > 0) return LLQuads[qIdx].H_idx[0];
return LLQuads[qIdx].H_idx[1];
}
else
{
if (Vector3.Dot(Vector3.Cross(CPos, CB), vFwd) < 0) return LLQuads[qIdx].H_idx[0];
return LLQuads[qIdx].H_idx[2];
}
}
Vector3 DPos = point - D;
Vector3 DE = E - D;
Vector3 FPos = point - F;
Vector3 FE = E - F;
if (Vector3.Dot(vXn, vP) > (2f/3f) * magX && Vector3.Dot(vXn, vP) < (5f/6f) * magX)
{
if (Vector3.Dot(vYn, vP) < (1f/2f)*magY)
{
if(Vector3.Dot(Vector3.Cross(DPos, DE), vFwd) > 0) return LLQuads[qIdx].H_idx[1];
return LLQuads[qIdx].H_idx[3];
}
else
{
if (Vector3.Dot(Vector3.Cross(FPos, FE), vFwd) > 0) return LLQuads[qIdx].H_idx[3];
return LLQuads[qIdx].H_idx[2];
}
}
return -1;
}




