void InitHistogramLookups() { // Init histogram GPU buffer HistogramData.Clear(); foreach (var path in SceneHierarchy) { var hist = new HistStruct { parent = -1, all = 0, cutaway = 0, occluding = 0, visible = 0 }; if (MyUtility.IsPathRoot(path)) { hist.parent = -1; } else { var parentPath = MyUtility.GetParentUrlPath(path); if (!SceneHierarchy.Contains(parentPath)) { throw new Exception("Hierarchy corrupted"); } hist.parent = SceneHierarchy.IndexOf(parentPath); } HistogramData.Add(hist); } //*******************************// IngredientToNodeLookup.Clear(); foreach (var ingredientName in AllIngredientNames) { if (SceneHierarchy.Contains(ingredientName)) { IngredientToNodeLookup.Add(SceneHierarchy.IndexOf(ingredientName)); } } //*******************************// NodeToIngredientLookup.Clear(); foreach (var path in SceneHierarchy) { if (AllIngredientNames.Contains(path)) { NodeToIngredientLookup.Add(AllIngredientNames.IndexOf(path)); } else { NodeToIngredientLookup.Add(-1); } } int a = 0; }
//*** Membrane Ingredients ****// public void AddMembrane(string filePath, Vector3 position, Quaternion rotation) { var groupName = "membrane"; var groupPath = "root.envelope." + groupName; var nameInner = "inner_membrane"; var nameOuter = "outer_membrane"; var pathInner = groupPath + "." + nameInner; var pathOuter = groupPath + "." + nameOuter; RemoveElementFromHierarchy("membrane"); RemoveIngredientGroupFromName("membrane"); RemoveIngredientGroupFromName("membrane"); _ingredientNames.Clear(); LipidIngredientNames.Clear(); RemoveIngredientGroup(groupPath); RemoveElementFromHierarchy(groupPath); CPUBuffers.Get.LipidAtomPositions.Clear(); CPUBuffers.Get.LipidInstanceInfos.Clear(); CPUBuffers.Get.LipidInstanceInfos2.Clear(); CPUBuffers.Get.LipidInstancePositions.Clear(); //*****// AddIngredientToHierarchy(pathInner); AddIngredientToHierarchy(pathOuter); LipidIngredientNames.Add(pathInner); LipidIngredientNames.Add(pathOuter); var ingredientIdInner = AllIngredientNames.IndexOf(pathInner); var ingredientIdOuter = AllIngredientNames.IndexOf(pathOuter); var envelopeSurfaceGroup = GetIngredientGroup("root.envelope.surface"); var envelopeMembraneGroup = new IngredientGroup(); envelopeMembraneGroup.Ingredients = new List <Ingredient>(); envelopeMembraneGroup.compartment_id = envelopeSurfaceGroup.compartment_id; envelopeMembraneGroup.unique_id = IngredientGroups.Count; envelopeMembraneGroup._groupType = -1; envelopeMembraneGroup.name = groupName; envelopeMembraneGroup.path = groupPath; envelopeMembraneGroup.NumIngredients = 2; var innerMembraneIngredient = new Ingredient(); innerMembraneIngredient.nbMol = 1; innerMembraneIngredient._nbChains = 1; innerMembraneIngredient._ingredientGroupId = envelopeMembraneGroup.unique_id; innerMembraneIngredient._ingredientId = ingredientIdInner; innerMembraneIngredient.name = nameInner; innerMembraneIngredient.path = pathInner; var outerMembraneIngredient = new Ingredient(); outerMembraneIngredient.nbMol = 1; outerMembraneIngredient.nbChains = 1; outerMembraneIngredient.ingredient_group_id = envelopeMembraneGroup.unique_id; outerMembraneIngredient._ingredientId = ingredientIdOuter; outerMembraneIngredient.name = nameOuter; outerMembraneIngredient.path = pathOuter; envelopeMembraneGroup.Ingredients.Add(innerMembraneIngredient); envelopeMembraneGroup.Ingredients.Add(outerMembraneIngredient); IngredientGroups.Add(envelopeMembraneGroup); ColorManager.Get.InitColors(); //int a = 0; var currentLipidAtoms = new List <Vector4>(); var membraneData = MyUtility.ReadBytesAsFloats(filePath); var step = 5; var dataIndex = 0; var lipidAtomStart = 0; var previousLipidId = -1; while (true) { var flushCurrentBatch = false; var breakAfterFlushing = false; if (dataIndex >= membraneData.Count()) { flushCurrentBatch = true; breakAfterFlushing = true; } else { var lipidId = (int)membraneData[dataIndex + 4]; if (previousLipidId < 0) { previousLipidId = lipidId; } if (lipidId != previousLipidId) { flushCurrentBatch = true; previousLipidId = lipidId; } } if (flushCurrentBatch) { var bounds = AtomHelper.ComputeBounds(currentLipidAtoms); var center = new Vector4(bounds.center.x, bounds.center.y, bounds.center.z, 0); for (var j = 0; j < currentLipidAtoms.Count; j++) { currentLipidAtoms[j] -= center; } var innerMembrane = Vector3.Magnitude(bounds.center) < 727; Vector4 batchPosition = position + bounds.center; batchPosition.w = Vector3.Magnitude(bounds.extents); CPUBuffers.Get.LipidInstancePositions.Add(batchPosition); CPUBuffers.Get.LipidInstanceInfos.Add(new Vector4(innerMembrane ? ingredientIdInner : ingredientIdOuter, lipidAtomStart, currentLipidAtoms.Count)); CPUBuffers.Get.LipidInstanceInfos2.Add(new Vector4((int)InstanceState.Normal, 0, 0)); lipidAtomStart += currentLipidAtoms.Count; CPUBuffers.Get.LipidAtomPositions.AddRange(currentLipidAtoms); currentLipidAtoms.Clear(); if (breakAfterFlushing) { break; } } var currentAtom = new Vector4(membraneData[dataIndex], membraneData[dataIndex + 1], membraneData[dataIndex + 2], membraneData[dataIndex + 3]); currentLipidAtoms.Add(currentAtom); dataIndex += step; } }
//*** Membrane Ingredients ****// public void AddMembrane(string filePath, Vector3 position, Quaternion rotation) { var pathInner = "root.membrane.inner_membrane"; var pathOuter = "root.membrane.outer_membrane"; AddIngredientToHierarchy(pathInner); AddIngredientToHierarchy(pathOuter); LipidIngredientNames.Clear(); LipidIngredientNames.Add(pathInner); LipidIngredientNames.Add(pathOuter); LipidAtomPositions.Clear(); LipidInstanceInfos.Clear(); LipidInstancePositions.Clear(); var currentLipidAtoms = new List <Vector4>(); var membraneData = MyUtility.ReadBytesAsFloats(filePath); var ingredientIdInner = AllIngredientNames.IndexOf(pathInner); var ingredientIdOuter = AllIngredientNames.IndexOf(pathOuter); var step = 5; var dataIndex = 0; var lipidAtomStart = 0; var previousLipidId = -1; while (true) { var flushCurrentBatch = false; var breakAfterFlushing = false; if (dataIndex >= membraneData.Count()) { flushCurrentBatch = true; breakAfterFlushing = true; } else { var lipidId = (int)membraneData[dataIndex + 4]; if (previousLipidId < 0) { previousLipidId = lipidId; } if (lipidId != previousLipidId) { flushCurrentBatch = true; previousLipidId = lipidId; } } if (flushCurrentBatch) { var bounds = AtomHelper.ComputeBounds(currentLipidAtoms); var center = new Vector4(bounds.center.x, bounds.center.y, bounds.center.z, 0); for (var j = 0; j < currentLipidAtoms.Count; j++) { currentLipidAtoms[j] -= center; } var innerMembrane = Vector3.Magnitude(bounds.center) < 727; Vector4 batchPosition = position + bounds.center; batchPosition.w = Vector3.Magnitude(bounds.extents); LipidInstancePositions.Add(batchPosition); LipidInstanceInfos.Add(new Vector4(innerMembrane ? ingredientIdInner : ingredientIdOuter, lipidAtomStart, currentLipidAtoms.Count)); lipidAtomStart += currentLipidAtoms.Count; LipidAtomPositions.AddRange(currentLipidAtoms); currentLipidAtoms.Clear(); if (breakAfterFlushing) { break; } } var currentAtom = new Vector4(membraneData[dataIndex], membraneData[dataIndex + 1], membraneData[dataIndex + 2], AtomHelper.AtomRadii[(int)membraneData[dataIndex + 3]]); currentLipidAtoms.Add(currentAtom); dataIndex += step; } int a = 0; }