private void UpdateParts()
    {
        double[] conv = Math.Mul44x44(Math.Mul44x44(VtsUtil.U2V44(mapTrans.localToWorldMatrix), VtsUtil.U2V44(VtsUtil.SwapYZ)), Math.Inverse44(draws.camera.view));

        Dictionary<VtsMesh, DrawTask> tasksByMesh = new Dictionary<VtsMesh, DrawTask>();
        foreach (DrawTask t in draws.colliders)
        {
            VtsMesh k = t.mesh as VtsMesh;
            if (!tasksByMesh.ContainsKey(k))
                tasksByMesh.Add(k, t);
        }

        HashSet<VtsMesh> partsToRemove = new HashSet<VtsMesh>(partsCache.Keys);

        foreach (KeyValuePair<VtsMesh, DrawTask> tbm in tasksByMesh)
        {
            if (!partsCache.ContainsKey(tbm.Key))
            {
                GameObject o = Instantiate(colliderPrefab);
                partsCache.Add(tbm.Key, o);
                UnityEngine.Mesh msh = (tbm.Value.mesh as VtsMesh).Get();
                o.GetComponent<MeshCollider>().sharedMesh = msh;
                VtsUtil.Matrix2Transform(o.transform, VtsUtil.V2U44(Math.Mul44x44(conv, System.Array.ConvertAll(tbm.Value.data.mv, System.Convert.ToDouble))));
            }
            partsToRemove.Remove(tbm.Key);
        }

        foreach (VtsMesh m in partsToRemove)
        {
            Destroy(partsCache[m]);
            partsCache.Remove(m);
        }
    }
Ejemplo n.º 2
0
    private void UpdateOpaqueDraws()
    {
        if (originHasShifted)
        {
            originHasShifted = false;
            foreach (var l in opaquePartsCache)
            {
                foreach (var p in l.Value)
                {
                    DestroyWithMaterial(p);
                }
            }
            opaquePartsCache.Clear();
        }

        Dictionary <VtsMesh, List <DrawSurfaceTask> > tasksByMesh = new Dictionary <VtsMesh, List <DrawSurfaceTask> >();

        foreach (DrawSurfaceTask t in draws.opaque)
        {
            VtsMesh k = t.mesh as VtsMesh;
            if (!tasksByMesh.ContainsKey(k))
            {
                tasksByMesh.Add(k, new List <DrawSurfaceTask>());
            }
            tasksByMesh[k].Add(t);
        }

        HashSet <VtsMesh> partsToRemove = new HashSet <VtsMesh>(opaquePartsCache.Keys);

        foreach (KeyValuePair <VtsMesh, List <DrawSurfaceTask> > tbm in tasksByMesh)
        {
            if (!opaquePartsCache.ContainsKey(tbm.Key))
            {
                opaquePartsCache.Add(tbm.Key, new List <GameObject>(tbm.Value.Count));
            }
            UpdateOpaqueParts(tbm.Value, opaquePartsCache[tbm.Key]);
            partsToRemove.Remove(tbm.Key);
        }

        foreach (VtsMesh m in partsToRemove)
        {
            foreach (GameObject p in opaquePartsCache[m])
            {
                DestroyWithMaterial(p);
            }
            opaquePartsCache.Remove(m);
        }

        foreach (var l in opaquePartsCache)
        {
            foreach (var p in l.Value)
            {
                UpdateMaterialDynamic(p.GetComponent <MeshRenderer>().material);
            }
        }
    }
Ejemplo n.º 3
0
    protected override void CameraUpdate()
    {
        double[] conv = Math.Mul44x44(Math.Mul44x44(VtsUtil.U2V44(mapTrans.localToWorldMatrix), VtsUtil.U2V44(VtsUtil.SwapYZ)), Math.Inverse44(draws.camera.view));

        Dictionary <VtsMesh, List <DrawTask> > tasksByMesh = new Dictionary <VtsMesh, List <DrawTask> >();

        foreach (DrawTask t in draws.opaque)
        {
            VtsMesh k = t.mesh as VtsMesh;
            if (!tasksByMesh.ContainsKey(k))
            {
                tasksByMesh.Add(k, new List <DrawTask>());
            }
            tasksByMesh[k].Add(t);
        }

        HashSet <VtsMesh> partsToRemove = new HashSet <VtsMesh>(partsCache.Keys);

        foreach (KeyValuePair <VtsMesh, List <DrawTask> > tbm in tasksByMesh)
        {
            if (!partsCache.ContainsKey(tbm.Key))
            {
                partsCache.Add(tbm.Key, new List <GameObject>(tbm.Value.Count));
            }
            UpdateParts(tbm.Value, partsCache[tbm.Key], conv);
            partsToRemove.Remove(tbm.Key);
        }

        foreach (VtsMesh m in partsToRemove)
        {
            foreach (GameObject o in partsCache[m])
            {
                Destroy(o);
            }
            partsCache.Remove(m);
        }
    }