// Create in/out function void LoadMoleculeFrame(int frame) { var fs = new FileStream(Application.dataPath + AtomDataFilePath, FileMode.Open); var offset = (long)frame * _molFrameSize; var frameBytes = new byte[_molFrameSize]; var frameData = new float[_molFrameSize / sizeof(float)]; fs.Seek(offset, SeekOrigin.Begin); fs.Read(frameBytes, 0, _molFrameSize); fs.Close(); Buffer.BlockCopy(frameBytes, 0, frameData, 0, _molFrameSize); // ... for (var i = 0; i < NumAtoms; i++) { _atomPositions[i].Set(frameData[i * NumFieldsPerAtom + 3], frameData[i * NumFieldsPerAtom + 4], frameData[i * NumFieldsPerAtom + 5], 1); if (_init) { continue; } _atomTypes[i] = (int)frameData[i * NumFieldsPerAtom]; _atomAminoAcidIds[i] = (int)frameData[i * NumFieldsPerAtom + 1]; _atomAminoAcidsTypes[i] = (int)frameData[i * NumFieldsPerAtom + 2]; } _atomPositionsBuffer.SetData(_atomPositions); if (!_init) { // Set buffer data _atomTypesBuffer.SetData(_atomTypes); _atomAminoAcidIdBuffer.SetData(_atomAminoAcidIds); _atomAminoAcidTypesBuffer.SetData(_atomAminoAcidsTypes); // Find bonds _atomBonds = PdbReader.GetAtomBonds(_atomPositions, _atomTypes, NumAtoms); NumAtomBonds = _atomBonds.Length / 2; _atomBondsBuffer = new ComputeBuffer(NumAtomBonds, 8); _atomBondsBuffer.SetData(_atomBonds); // Find focused atoms var aaa = new List <int>(); for (var i = 0; i < NumAtoms; i++) { var ap = _atomPositions[i]; if (aaa.Count > 0 && aaa.Last() == _atomAminoAcidIds[i]) { continue; } for (var j = 0; j < NumTunnelSpheres; j++) { var tsp = _tunnelPositions[j]; if (!(Vector3.Distance(ap, tsp) < 5)) { continue; } aaa.Add(_atomAminoAcidIds[i]); break; } } var aaaa = new int[NumAtoms]; for (var i = 0; i < NumAtoms; i++) { aaaa[i] = Convert.ToInt32(aaa.Contains(_atomAminoAcidIds[i])); } _focusedAtomBuffer.SetData(aaaa); _init = true; } }