예제 #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
    public static float scatterdirprob(Vector3 dir, Vector3 d2)
    {
        Vector3 adj1 = IcecubeDust.AnizoAdjust(dir);
        Vector3 adj2 = IcecubeDust.AnizoAdjust(d2);
        float   cosn = Vector3.Dot(adj1, adj2) / (adj1.magnitude * adj2.magnitude);

        return(scatterprob(cosn));
    }