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); } }
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); } } }
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); } }