Пример #1
0
    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);
    }
Пример #2
0
    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);
    }
Пример #3
0
    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;
            }
        }
    }
Пример #4
0
 public void Clear()
 {
     foreach (Transform tr in gameObject.transform)
     {
         Destroy(tr.gameObject);
     }
     data  = null;
     runId = -1;
     evId  = -1;
 }
Пример #5
0
 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;
 }
Пример #6
0
    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;
    }
Пример #7
0
    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();
            }
        }
    }
Пример #8
0
    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");
    }