public MultimeshObject PhotonsToMesh(List <ScatterPhoton> photons) { MultimeshObject ret = new MultimeshObject(); List <Vector3> verts = new List <Vector3>(); List <Vector2> uvs = new List <Vector2>(); //List<Color> clrs = new List<Color>(); List <int> indc = new List <int>(); // Debug.LogFormat("Photons started: {0}",photons.Count); int cntph = 0; foreach (ScatterPhoton ph in photons) { int cnt = 0; while (!ph.decayed) { verts.Add(ph.position - initialPos); // float shft = (en.time - mintime) / td; uvs.Add(new Vector2(ph.timeOffset, 0)); //65530 // clrs.Add(Color.Lerp(Color.red, Color.green, shft)); if (cnt == 0 && ph.decayed) { verts.RemoveAt(verts.Count - 1); uvs.RemoveAt(uvs.Count - 1); } if (cnt > 0) { indc.Add(verts.Count - 2); indc.Add(verts.Count - 1); } if (verts.Count > 65530) { break; } // Debug.LogFormat("Phdir: {0}", ph.direction); ph.Propagate(IcecubeDust.AbsorbtionLength(ph.position, ph.direction), IcecubeDust.ScatterLength(ph.position)); cnt += 1; } cntph++; if (cntph % 100 == 0) { // Debug.LogFormat("Photons now: {0}", cntph); } if (verts.Count > 65530) { Meshobject newM = new Meshobject(verts.ToArray(), uvs.ToArray(), indc.ToArray()); ret.meshes.Add(newM); verts.Clear(); uvs.Clear(); indc.Clear(); } } if (indc.Count > 1) { Meshobject newM = new Meshobject(verts.ToArray(), uvs.ToArray(), indc.ToArray()); ret.meshes.Add(newM); } //Debug.Log("Returning from sim"); return(ret); }
virtual public MultimeshObject Simulate() { int emittedPhotons = Mathf.RoundToInt(emissionRate * duration); MultimeshObject ret = new MultimeshObject(); List <ScatterPhoton> emitted = new List <ScatterPhoton>(); Debug.LogFormat("Emitted track photons: {0} ", emittedPhotons); for (int i = 0; i < emittedPhotons; i++) { float emitTime = (float)RandomGen3.NextDouble() * duration; Vector3 ppos = emitTime * speed * direction + initialPos; emitted.Add(EmitCherenkovPhoton(ppos, emitTime)); if (emitted.Count >= 16384) { ret.meshes.AddRange(PhotonsToMesh(emitted).meshes); emitted.Clear(); } } ret.meshes.AddRange(PhotonsToMesh(emitted).meshes); if (energyLosses != null) { foreach (CascadeData dat in energyLosses) { emitted = dat.Emit(0.02f); ret.meshes.AddRange(PhotonsToMesh(emitted).meshes); } } Debug.LogFormat("Total meshes: {0} ", ret.meshes.Count); return(ret); }
public void MaybeRecreateProperMesh(int run, int ev, Vector3 initialPos, Vector3 heading, float duration, float emrate, float itime) { if (run == runId && ev == evId) { //same event.. return; } foreach (extraData csc in cascades) { if (run == csc.runId && ev == csc.evId) { readCsv(csc); CascadeData[] cdat = new CascadeData[bursts.Length]; float maxEnergy = 0; float minnz = 0; for (int i = 0; i < bursts.Length; i++) { if (bursts[i].energy > maxEnergy) { maxEnergy = (float)bursts[i].energy; } if (minnz == 0 || (bursts[i].energy > 0 && minnz < bursts[i].energy)) { minnz = (float)bursts[i].energy; } } if (minnz * 5000 / maxEnergy < 1000) { maxEnergy = minnz * 1000; } for (int i = 0; i < bursts.Length; i++) { int en = (int)(bursts[i].energy * 5000 / maxEnergy); if (en > 5000) { en = 5000; } cdat[i] = new CascadeData(heading, 1.0f, (int)en, (float)bursts[i].time - itime); cdat[i].location = bursts[i].coords; Debug.Log("ENERGY"); Debug.Log(maxEnergy); Debug.Log(en); Debug.Log((int)bursts[i].energy); //cdat[i].in = bursts[i].coords; } //new CascadeData(heading, 1.0f, 9500); MuonTrack tr = new MuonTrack(initialPos, heading, duration, 0.299792458f, 6000 / maxEnergy, cdat);//emrate data = tr.Simulate(); data.SaveToFile(Application.persistentDataPath + "/" + "trail.gz"); data.LoadFromFile(Application.persistentDataPath + "/" + "trail.gz"); SpawnChildren(); runId = run; evId = ev; break; } } }
public void Clear() { foreach (Transform tr in gameObject.transform) { Destroy(tr.gameObject); } data = null; runId = -1; evId = -1; }
public void UseMesh(int run, int ev, MultimeshObject mmesh) { Activate(); if (run == runId && ev == evId) { //same event.. return; } data = mmesh; SpawnChildren(); runId = run; evId = ev; }
public void MaybeRecreateMesh(int run, int ev, Vector3 initialPos, Vector3 heading, float duration, float emrate) { if (run == runId && ev == evId) { //same event.. return; } CascadeData cdat = new CascadeData(heading, 1.0f, 9500, 0); cdat.location = initialPos; MuonTrack tr = new MuonTrack(initialPos, heading, duration, 0.299792458f, emrate, cdat);//emrate data = tr.Simulate(); SpawnChildren(); runId = run; evId = ev; }
public void updateToSet(bool force = false) { if (EventRestAPI.Instance == null) { Debug.Log("Nyanya: no instance"); return; } if (EventRestAPI.Instance.currentEvent == null) { // Debug.Log("Nyanya: noevent"); return; } float nsld = 0.0f; if (timeController != null) { nsld = timeController.value; } if (deltaController != null) { tgap = deltaController.value; } if (nsld == prevSld && beforeBalls != null && !force) { return; } if (beforeBalls != null) { foreach (ballIntegratedData id in beforeBalls) { ballArray[id.stId].balls[id.domId].setScale(baseScale); ballArray[id.stId].balls[id.domId].setColor(new Color(0.9f, 0.9f, 0.9f)); if (force) { ballArray[id.stId].balls[id.domId].resetSig(); } } } List <ballIntegratedData> afterBalls = new List <ballIntegratedData>(); float start = timeSpan.value; // float end = timeSpan.value2; // if (end > 1.0f) { end = 1.0f; } List <ballIntegratedData> collectedBalls = EventRestAPI.Instance.currentEvent.ballData; foreach (ballIntegratedData ball in collectedBalls) { if (ball.ballAffectedInTs(start, end)) { afterBalls.Add(ball); float tscl = 0.0f; double sig = ball.getInSpan(start, end, tgap, nsld, ref tscl); if (sig != -1) { float dsig = ballArray[ball.stId].balls[ball.domId].setAndCompareSig((float)sig); if (dsig > 0 && playbackController != null && playbackController.IsPlaying) { //NoteSelector inst = NoteSelector.GetMainInstance(); // Debug.LogFormat("Sig :{0}", sig); //if(inst) //{ // inst.PlayNote(ballArray[ball.stId].balls[ball.domId].transform.localPosition,(float) sig, 0.12f); // } int str = (int)(sig * 40); if (str < 20) { str = 20; } if (str > 70) { str = 70; } stringArray[ball.stId - 1].HitBall(ball.domId, str); } double scale = (double)baseScale + (EventRestAPI.settings.scaleMul * Math.Pow((0.2 * sig), EventRestAPI.settings.scalePower)); ballArray[ball.stId].balls[ball.domId].setScale((float)scale); ballArray[ball.stId].balls[ball.domId].setColor(colorFromBasicMap(tscl)); } else { ballArray[ball.stId].balls[ball.domId].resetSig(); ballArray[ball.stId].balls[ball.domId].setScale(baseScale); ballArray[ball.stId].balls[ball.domId].setColor(new Color(0.9f, 0.9f, 0.9f)); } } } // public float delay = 0.01f; //public float tgap = 0.1f; beforeBalls = afterBalls; //track trackData track = null; if (EventRestAPI.Instance.currentEvent.track == null) { EventRestAPI.Instance.currentEvent.track = EventRestAPI.Instance.currentEvent.description.track; } if (EventRestAPI.Instance.currentEvent.track != null) { track = EventRestAPI.Instance.currentEvent.track; } else { if (ftrack != null && EventRestAPI.Instance.currentEvent.description.run == ftrack.eid.Key && EventRestAPI.Instance.currentEvent.description.evn == ftrack.eid.Value) { track = ftrack.frc; EventRestAPI.Instance.currentEvent.track = track; //EventRestAPI.Instance.currentEvent.sav // Debug.Log("Forcing track "); } } if (force) { Debug.Log("Force updating"); } float t1 = EventRestAPI.Instance.currentEvent.maxPureTime; float t0 = EventRestAPI.Instance.currentEvent.minPureTime; if (t0 > t1) { float tt = t0; t0 = t1; t1 = tt; } float atime = nsld * (t1 - t0) + t0; var cdesc = EventRestAPI.Instance.currentEvent.description; var ceid = new KeyValuePair <long, long>(cdesc.run, cdesc.evn); if (track == null || track.rec_t0 > atime + 0.001f || EventRestAPI.Instance.eventTrackIsSuppressed(ceid)) { pole.SetActive(false); cone.SetActive(false); } else { pole.SetActive(true); cone.SetActive(true); } if (track != null) { if (ref1 == null || ref2 == null || ref3 == null || ref4 == null) { Debug.Log("Need reference points"); return; } if (cone == null || pole == null) { Debug.Log("Need cone and pole"); return; } if (trackmesh != null) { if (EventRestAPI.Instance.currentEvent != null) { var desc = EventRestAPI.Instance.currentEvent.description; var eid = new KeyValuePair <long, long>(desc.run, desc.evn); if (EventRestAPI.Instance.eventHasSim(eid)) { if (hairControl != null) { hairCover?.SetActive(true); } } else { if (hairControl != null) { hairCover?.SetActive(false); } } } } // Debug.Log(atime); Debug.LogFormat("Trackt0 {0} atime: {1}", track.rec_t0, atime); if (track.rec_t0 > atime) { trackmesh?.Inactivate(); return; } Vector3 tdir = new Vector3(Mathf.Sin(track.zen_rad) * Mathf.Cos(track.azi_rad), Mathf.Sin(track.zen_rad) * Mathf.Sin(track.azi_rad), Mathf.Cos(track.zen_rad)); float vel = 0.299792458f;/// ni; float dt = atime - track.rec_t0; Vector3 ice_offs = -tdir * vel * dt; Vector3 ice_pos = new Vector3(track.rec_x, track.rec_y, track.rec_z) + ice_offs; if (trackmesh != null) { var desc = EventRestAPI.Instance.currentEvent.description; MultimeshObject mesh = EventRestAPI.Instance.DemandMMesh(desc); Debug.LogFormat("DMesh {0}", mesh); if (mesh != null) { trackmesh.UseMesh((int)desc.run, (int)desc.evn, mesh); } else { trackmesh.Inactivate(); } //trackmesh.MaybeRecreateMesh((int)desc.run, (int)desc.evn, new Vector3(track.rec_x, track.rec_y, track.rec_z), -tdir/tdir.magnitude, 5000, 10); //trackmesh.MaybeRecreateProperMesh((int)desc.run, (int)desc.evn, new Vector3(track.rec_x, track.rec_y, track.rec_z), -tdir / tdir.magnitude, 5000, 10, track.rec_t0); Debug.LogFormat("Tdir {0}", tdir); } //ref1.gameObject.transform.localPosition; Matrix4x4 trans = new Matrix4x4(); Vector3 c1 = ref1.gameObject.transform.localPosition; Vector3 c2 = ref2.gameObject.transform.localPosition; Vector3 c3 = ref3.gameObject.transform.localPosition; Vector3 c4 = ref4.gameObject.transform.localPosition; trans.SetColumn(0, new Vector4(c1.x, c1.y, c1.z, 1)); trans.SetColumn(1, new Vector4(c2.x, c2.y, c2.z, 1)); trans.SetColumn(2, new Vector4(c3.x, c3.y, c3.z, 1)); trans.SetColumn(3, new Vector4(c4.x, c4.y, c4.z, 1)); Matrix4x4 ice = new Matrix4x4(); Vector3 i1 = ref1.icecube_pt; Vector3 i2 = ref2.icecube_pt; Vector3 i3 = ref3.icecube_pt; Vector3 i4 = ref4.icecube_pt; ice.SetColumn(0, new Vector4(i1.x, i1.y, i1.z, 1)); ice.SetColumn(1, new Vector4(i2.x, i2.y, i2.z, 1)); ice.SetColumn(2, new Vector4(i3.x, i3.y, i3.z, 1)); ice.SetColumn(3, new Vector4(i4.x, i4.y, i4.z, 1)); Matrix4x4 inv = trans * ice.inverse; Vector3 un_pos0 = inv.MultiplyPoint3x4(new Vector3(track.rec_x, track.rec_y, track.rec_z)); if (trackmesh != null) { trackmesh.gameObject.transform.localPosition = un_pos0; float stime = start * (t1 - t0) + t0; float etime = end * (t1 - t0) + t0; trackmesh.SetTime(atime - track.rec_t0); trackmesh.SetTimeScale((etime - track.rec_t0)); // Vector3 un = inv.MultiplyPoint3x4(new Vector3(track.rec_x, track.rec_y, track.rec_z-1)); lhs = m_Matrix.GetColumn(2), /* var lhs = inv.GetColumn(2); * var rhs = inv.GetColumn(1); * Quaternion rtt = Quaternion.identity; * if (lhs == Vector4.zero && rhs == Vector4.zero) * rtt= Quaternion.identity; * else * rtt= Quaternion.LookRotation(lhs, rhs); * trackmesh.gameObject.transform.localRotation = rtt;// Quaternion.LookRotation(un_pos0 - un); * trackmesh.gameObject.transform.localScale = new Vector3(0.1f,0.1f,0.1f);*/ // Debug.LogFormat("Setting meshtimescale: {0} {1}", inv, (t1 - track.rec_t0)); } Vector3 un_pos1 = inv.MultiplyPoint3x4(ice_pos); Quaternion rot = Quaternion.LookRotation(un_pos0 - un_pos1); pole.transform.localRotation = rot; cone.transform.localRotation = rot; float sclen = (un_pos0 - un_pos1).magnitude; pole.transform.localScale = new Vector3(1, 1, sclen / 10); pole.transform.localPosition = un_pos1; cone.transform.localPosition = un_pos1; } else { if (hairControl != null) { hairCover?.SetActive(false); hairCover?.SetActive(false); } if (trackmesh != null) { trackmesh.Inactivate(); } } }
void Start() { MultimeshObject output = new MultimeshObject(); output.meshes = new List <Meshobject>(); //string meshPath="Assets/csmesh800/cmesh800_"; string fs = csvFile.text; string[] fLines = Regex.Split(fs, "\n|\r|\r\n"); int cnt = 0; int curMesh = -1; int curId = -1; List <Vector3> verts = new List <Vector3>(); List <Vector2> uvs = new List <Vector2>(); List <Color> clrs = new List <Color>(); List <int> indc = new List <int>(); Mesh curM = null; Vector3 avg = Vector3.zero; float mintime = -1; float maxtime = -1; foreach (string line in fLines) { if (line.Length < 2) { continue; } PosEntry en = entryFromLine(line); lst.Add(en); cnt++; avg += en.pos; if (maxtime < 0 || en.time > maxtime) { maxtime = en.time; } if (mintime < 0 || en.time < mintime) { mintime = en.time; } /* if(curMesh!=en.meshnum) * { * if(curM!=null) * { * AssetDatabase.CreateAsset(curM, "Assets/csmesh/cmesh_" + curMesh.ToString() + ".asset"); * } * } * if(curMesh==-1) curMesh=en.meshnum; * if(curId==-1) curId=en.id; * * * cnt++; * if(cnt>100) * break;*/ } Debug.Log(mintime); Debug.Log(maxtime); Debug.Log(avg / cnt); avg /= (float)cnt; cnt = 0; float td = maxtime - mintime; foreach (PosEntry en in lst) { if (curMesh != en.meshnum) { Meshobject msh = new Meshobject(verts.ToArray(), uvs.ToArray(), indc.ToArray()); output.meshes.Add(msh); //msh.indices = indc.ToArray(); // msh.verts = verts.ToArray(); // msh.uvs = uvs.ToArray(); //if(curM!=null) // { // curM.vertices=verts.ToArray(); // curM.uv=uvs.ToArray(); // curM.colors=clrs.ToArray(); // curM.SetIndices(indc.ToArray(),MeshTopology.Lines,0); //AssetDatabase.CreateAsset(curM, meshPath + curMesh.ToString() + ".asset"); //} verts.Clear(); uvs.Clear(); clrs.Clear(); indc.Clear(); curMesh = en.meshnum; curM = new Mesh(); cnt = 0; } if (curId == en.id) { indc.Add(cnt - 1); indc.Add(cnt); } else { curId = en.id; } verts.Add(en.pos + offset);// -avg); float shft = (en.time - mintime); if (System.Array.IndexOf(jet, en.id) > -1) { //ccolor.b = 0.8f; uvs.Add(new Vector2(shft, 1)); } else { uvs.Add(new Vector2(shft, 0)); } clrs.Add(Color.Lerp(Color.red, Color.green, shft)); cnt++; } if (verts.Count >= 2 && indc.Count > 0) { Meshobject msh = new Meshobject(verts.ToArray(), uvs.ToArray(), indc.ToArray()); output.meshes.Add(msh); } //if(curM!=null) // { // curM.vertices=verts.ToArray(); // curM.uv=uvs.ToArray(); // curM.colors=clrs.ToArray(); // curM.SetIndices(indc.ToArray(),MeshTopology.Lines,0); // AssetDatabase.CreateAsset(curM, meshPath + curMesh.ToString() + ".asset"); // } // output.SaveToFile(Application.persistentDataPath + "/" + "csvparsed.gz"); }