Exemplo n.º 1
0
    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;
    }
Exemplo n.º 2
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;
        }
    }
Exemplo n.º 3
0
    //*** 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;
    }