private void CreateCombineMeshHyperBall(int type, int start, int end, ArrayList atomLocationalist, Color c, Vector3 v, int order)
        {
            GameObject SpriteManager;

            if (!GameObject.Find("SpriteManager"))
            {
                SpriteManager      = GameObject.CreatePrimitive(PrimitiveType.Cube);
                SpriteManager.name = "SpriteManager";
            }
            else
            {
                SpriteManager = GameObject.Find("SpriteManager");
            }

            GameObject Atom;

            if (UIData.toggleClip)
            {
                Atom = Clip4RayCasting.CreateClip();
            }
            else
            {
                Atom = GameObject.CreatePrimitive(PrimitiveType.Plane);
            }

            Atom.transform.parent = SpriteManager.transform;
            float[] fLocation = atomLocationalist[start] as float[];
            Vector3 location  = new Vector3(fLocation[0], fLocation[1], fLocation[2]);

            Atom.transform.Translate(location);
            Atom.renderer.material.SetColor("_Color", c);
            MoleculeModel.atoms.Add(Atom);
            Atom.AddComponent("CameraFacingBillboard");
            Atom.GetComponent <CameraFacingBillboard>().cameraToLookAt = GameObject.Find("Camera").camera;
            Atom.transform.renderer.material.shader = Shader.Find("FvNano/Ball HyperBalls OpenGL");
            Atom.AddComponent("BallUpdateHB");
            BallUpdateHB comp = Atom.GetComponent <BallUpdateHB>();

            comp.rayon     = (float)(v[0]);
            comp.atomcolor = c;
            comp.number    = order;
            comp.enabled   = true;
            switch (type)
            {
            case 0: Atom.tag = "C"; break;

            case 1: Atom.tag = "N"; break;

            case 2: Atom.tag = "O"; break;

            case 3: Atom.tag = "S"; break;

            case 4: Atom.tag = "P"; break;

            case 5: Atom.tag = "H"; break;

            default: Atom.tag = "X"; break;
            }
        }
    // Update is called once per frame
    void LateUpdate()
    {
        if (Input.GetMouseButton(1))
        {
            Ray        sRay = camera.ScreenPointToRay(Input.mousePosition);
            RaycastHit sHit;
            if (!Physics.Raycast(sRay, out sHit))
            {
                //	MonoBehaviour.print(Input.mousePosition);
                Vector3 pos = Input.mousePosition;
                pos.z = 1;
                pos   = Camera.main.ScreenToWorldPoint(pos);
                pos.z = -8;
                //			pos.x *= Camera.main.pixelWidth;
                //			pos.y *= Camera.main.pixelHeight;
                //
                MonoBehaviour.print(pos);
                GameObject Atom;
                Atom = GameObject.CreatePrimitive(PrimitiveType.Cube);
                Atom.transform.position = pos;
                Material newMat = new Material(Shader.Find("FvNano/Single Cube Sphere Raycasting new"));
                newMat.SetColor("_Color", new Vector4(1.0f, 0.0f, 0.0f, 1.0f));
                Atom.renderer.material = newMat;
                Atom.AddComponent("BallUpdateHB");
                BallUpdateHB comp = Atom.GetComponent <BallUpdateHB>();
                comp.rayon = 1.0f;


                Atom.AddComponent <Rigidbody>();
                Atom.rigidbody.useGravity    = false;
                Atom.rigidbody.interpolation = RigidbodyInterpolation.Interpolate;
                Atom.rigidbody.drag          = 0.6f;
                Atom.AddComponent <SpringJoint>();
                Atom.AddComponent <MouseOverMolecule>();

                if (last != null)
                {
                    GameObject bond    = GameObject.CreatePrimitive(PrimitiveType.Cube);
                    Material   bondMat = new Material(Shader.Find("FvNano/Hyperbole Stick new"));
                    bondMat.SetFloat("_Shrink", 0.03f);
                    bond.renderer.material = bondMat;
                    bond.AddComponent("StickUpdate");
                    StickUpdate bondComp = bond.GetComponent <StickUpdate>();
                    bondComp.atompointer1 = last;
                    bondComp.atompointer2 = Atom;
                    //last.GetComponent<SpringJoint>().connectedBody = Atom.GetComponent<Rigidbody>();
                }

                last = Atom;
            }
        }
    }
        private void CreateAtomRCSprite(int type, int start, int end, ArrayList atomLocationalist, Color c, Vector3 v, int order)
        {
            LinkedSpriteManager linkedSpriteManager = null;
            GameObject          SpriteManager;

            if (!GameObject.Find("SpriteManager"))
            {
                SpriteManager      = new GameObject();
                SpriteManager.name = "SpriteManager";
            }
            else
            {
                SpriteManager = GameObject.Find("SpriteManager");
            }

            SpriteManager.GetComponent <MeshRenderer>().enabled = true;

            if (SpriteManager.GetComponent <LinkedSpriteManager>() == null)
            {
                SpriteManager.AddComponent("LinkedSpriteManager");
                linkedSpriteManager = (LinkedSpriteManager)Component.FindObjectOfType(typeof(LinkedSpriteManager));
                Material mat = Resources.Load("Materials/hyperballshader", typeof(Material)) as Material;
                linkedSpriteManager.material       = mat;
                linkedSpriteManager.allocBlockSize = atomLocationalist.Count;
            }
            else
            {
                linkedSpriteManager = (LinkedSpriteManager)Component.FindObjectOfType(typeof(LinkedSpriteManager));
                linkedSpriteManager.allocBlockSize = atomLocationalist.Count;
                linkedSpriteManager.enabled        = true;
            }
            GameObject Atom;

            float[] fLocation = atomLocationalist[start] as float[];
            Vector3 location  = new Vector3(fLocation[0], fLocation[1], fLocation[2]);

            UnityEngine.Object o;
            o    = MonoBehaviour.Instantiate(Resources.Load("HBspriteplane"), location, new Quaternion(0f, 0f, 0f, 0f));
            Atom = (GameObject)o;
            MoleculeModel.atoms.Add(Atom);
            Atom.renderer.material.SetColor("_Color", c);
            BallUpdateHB comp = Atom.GetComponent <BallUpdateHB>();

            comp.rayon     = (float)(v[0]);
            comp.atomcolor = c;
            comp.number    = order;
            comp.enabled   = true;
            linkedSpriteManager.AddSprite(Atom, 1f, 1f, 0, 0, 256, 256, true);
            switch (type)
            {
            case 0: Atom.tag = "C"; break;

            case 1: Atom.tag = "N"; break;

            case 2: Atom.tag = "O"; break;

            case 3: Atom.tag = "S"; break;

            case 4: Atom.tag = "P"; break;

            case 5: Atom.tag = "H"; break;

            default: Atom.tag = "X"; break;
            }
        }
        //iType : Atom type index (element)
        //iAtom : Atom index in atomLocationalist
        private void CreateAtomHB(int iType, int iAtom, ArrayList atomLocationalist, Color c, Vector3 v, int order)
        {
            GameObject Atom;

            Atom = GameObject.CreatePrimitive(PrimitiveType.Cube);

/*
 *                      UnityEngine.Object.Destroy(Atom.collider);
 *                      Object.DestroyImmediate(Atom.collider);
 *                      GameObject.DestroyImmediate(Atom.collider); // "good" one
 *                      Atom.AddComponent<Rigidbody>();
 *                      Atom.rigidbody.isKinematic = true;
 *                      Debug.Log("Atom collider?");
 *                      Debug.Log(Atom.collider.ToString());
 *                      GameObject.DestroyObject(Atom.collider);
 */
            float[] fLocation = atomLocationalist[iAtom] as float[];
            Vector3 location  = new Vector3(fLocation[0], fLocation[1], fLocation[2]);

            Atom.transform.Translate(location);
            Atom.renderer.material.SetColor("_Color", c);
//			Atom.transform.parent = AtomCubeParent.transform;
//			Debug.Log(Atom.collider.ToString());

            MoleculeModel.atoms.Add(Atom);

            BallUpdate script;

            if (atomtype == UIData.AtomType.hyperball)
            {
                RuntimePlatform platform = Application.platform;
                switch (platform)
                {
                case RuntimePlatform.WindowsPlayer:
                case RuntimePlatform.WindowsWebPlayer:
                case RuntimePlatform.WindowsEditor:
                    Atom.renderer.material.shader = Shader.Find("FvNano/Ball HyperBalls OpenGL");
                    break;

                default:
                    Atom.renderer.material.shader = Shader.Find("FvNano/Ball HyperBalls OpenGL");
                    break;
                }

                Atom.AddComponent("BallUpdateHB");
                BallUpdateHB comp = Atom.GetComponent <BallUpdateHB>();
                script         = comp;
                comp.rayon     = (float)(v[0]);
                comp.atomcolor = c;
                comp.number    = order;
                comp.z         = (float)(fLocation[2]);
//				Projector proj = Atom.AddComponent<Projector>();
                Atom.AddComponent <Projector>();
//				if(UI.GUIDisplay.file_extension=="xgmml")comp.xgmml=true;
                comp.enabled = true;
                switch (iType)
                {
                case 0:
                    comp.oldrayonFactor = (MoleculeModel.carbonScale) / 100; break;

                case 1:
                    comp.oldrayonFactor = (MoleculeModel.nitrogenScale) / 100; break;

                case 2:
                    comp.oldrayonFactor = (MoleculeModel.oxygenScale) / 100; break;

                case 3:
                    comp.oldrayonFactor = (MoleculeModel.sulphurScale) / 100; break;

                case 4:
                    comp.oldrayonFactor = (MoleculeModel.phosphorusScale) / 100; break;

                case 5:
                    comp.oldrayonFactor = (MoleculeModel.hydrogenScale) / 100; break;

                default:
                    comp.oldrayonFactor = 2.0f; break;
                }
            }
            else
            {
                Atom.AddComponent("BallUpdateCube");
                BallUpdateCube comp1 = Atom.GetComponent <BallUpdateCube>();
                script = comp1;
//				comp1.rayon = Atom.transform.localScale.x*2;
                comp1.rayon = (float)(v[0]) * 2;
                float rayonfactor;
                switch (iType)
                {
                case 0:
                    rayonfactor = (MoleculeModel.carbonScale) / 100; break;

                case 1:
                    rayonfactor = (MoleculeModel.nitrogenScale) / 100; break;

                case 2:
                    rayonfactor = (MoleculeModel.oxygenScale) / 100; break;

                case 3:
                    rayonfactor = (MoleculeModel.sulphurScale) / 100; break;

                case 4:
                    rayonfactor = (MoleculeModel.phosphorusScale) / 100; break;

                case 5:
                    rayonfactor = (MoleculeModel.hydrogenScale) / 100; break;

                default:
                    rayonfactor = 1.0f; break;
                }
                comp1.SetRayonFactor(rayonfactor);
                comp1.number  = order;
                comp1.enabled = true;
            }

            switch (iType)
            {
            case 0: Atom.tag = "C"; break;

            case 1: Atom.tag = "N"; break;

            case 2: Atom.tag = "O"; break;

            case 3: Atom.tag = "S"; break;

            case 4: Atom.tag = "P"; break;

            case 5: Atom.tag = "H"; break;

            default: Atom.tag = "X"; break;
            }
            if (atomtype == UIData.AtomType.particleball)
            {
                Atom.renderer.enabled = false;
            }

            BoxCollider collider = Atom.collider as BoxCollider;
            float       newSize  = script.rayon * 60 / 100;

            collider.size = new Vector3(newSize, newSize, newSize);
        }