예제 #1
0
    void OnGUI()
    {
        EditorGUILayout.BeginVertical();

        EditorGUILayout.Separator();

        GUIStyle helpStyle = new GUIStyle(GUI.skin.label);

        helpStyle.wordWrap  = true;
        helpStyle.alignment = TextAnchor.UpperLeft;
        EditorGUILayout.LabelField("This window can be use to create Puzzle Maker file that can be used to load puzzle maker class data from file, or you can save only puzzle pieces images created by puzzle maker", helpStyle);

        EditorGUILayout.Separator();
        EditorGUILayout.Separator();

        _piecesInRow = EditorGUILayout.IntSlider("Pieces in row : ", _piecesInRow, 2, 10);

        _piecesInCol = EditorGUILayout.IntSlider("Pieces in col : ", _piecesInCol, 2, 10);

        _selectedTexture = (Texture2D)EditorGUILayout.ObjectField("Puzzle Image", _selectedTexture, typeof(Texture2D), false);

        EditorGUILayout.Separator();

        _noOfJointMasks = EditorGUILayout.IntField("Joints Mask Images", _noOfJointMasks);

        if (_pieceJointMaskImages.Length != _noOfJointMasks)
        {
            _pieceJointMaskImages = new Texture2D[_noOfJointMasks];
        }

        for (int i = 0; i < _noOfJointMasks; i++)
        {
            _pieceJointMaskImages[i] = (Texture2D)EditorGUILayout.ObjectField("Joint Mask Image " + (i + 1).ToString(),
                                                                              _pieceJointMaskImages[i], typeof(Texture2D), false);
        }

        EditorGUILayout.Separator();

        _fileOptions = (EFileCreateOptions)EditorGUILayout.EnumPopup("File Options", _fileOptions);

        if (_fileOptions == EFileCreateOptions.SavePiecesImage)
        {
            _saveGeneratedBackground = EditorGUILayout.Toggle("Save Created Background Image : ", _saveGeneratedBackground);
        }
        else
        {
            _pmFileName = EditorGUILayout.TextField("Enter PM Filename", _pmFileName);
        }

        EditorGUILayout.Separator();
        EditorGUILayout.Separator();



        if (GUILayout.Button(_fileOptions == EFileCreateOptions.CreatePuzzleFile ? "Generate File" : "Save Pieces Images", GUILayout.Height(45)))
        {
            bool JointMaskNull = false;

            for (int i = 0; i < _pieceJointMaskImages.Length; i++)
            {
                if (_pieceJointMaskImages[i] == null)
                {
                    JointMaskNull = true;
                    break;
                }
            }


            if (JointMaskNull)
            {
                EditorUtility.DisplayDialog("Error", "You must select all Joint Mask Images", "OK");
            }
            else if (_selectedTexture == null)
            {
                EditorUtility.DisplayDialog("Error", "You must select puzzle image", "OK");
            }
            else
            {
                if (_fileOptions == EFileCreateOptions.CreatePuzzleFile)
                {
                    //string FilePath = EditorUtility.SaveFilePanel("Select file path", "c:\\", "PmFile.pm", "pm");

                    if (!System.IO.Directory.Exists(Application.streamingAssetsPath))
                    {
                        System.IO.Directory.CreateDirectory(Application.streamingAssetsPath);
                    }

                    if (_pmFileName == "" || _pmFileName.Length <= 3)
                    {
                        EditorUtility.DisplayDialog("Filename Error", "Filename cannot be empty", "Let me change");
                    }
                    else
                    {
                        Debug.Log(_pmFileName.Substring(_pmFileName.Length - 3, 3));

                        string FileName = _pmFileName.Substring(_pmFileName.Length - 3, 3) != ".pm" ?
                                          _pmFileName + ".pm" : _pmFileName;

                        //Check if file already exists
                        if (System.IO.File.Exists(Application.streamingAssetsPath + "/" + FileName))
                        {
                            EditorUtility.DisplayDialog("File creation error", "File with name" + FileName + " already exists", "Let me change");
                        }
                        else
                        {
                            try
                            {
                                PuzzlePieceMaker Temp = new PuzzlePieceMaker(_selectedTexture, _pieceJointMaskImages,
                                                                             _piecesInRow, _piecesInCol);

                                Temp.SaveData(Application.streamingAssetsPath + "/" + FileName);

                                Debug.Log(FileName);

                                EditorUtility.DisplayDialog("Success", "File created succesfully", "Ok");
                                AssetDatabase.Refresh();
                            }
                            catch (UnityException ex)
                            {
                                EditorUtility.DisplayDialog("Failed", "File creation failed :" + ex.Message, "Ok");
                            }
                        }
                    }
                }
                else if (_fileOptions == EFileCreateOptions.SavePiecesImage)
                {
                    string FolderPath = EditorUtility.SaveFolderPanel("Select folder path", "c:\\PiecesData", "PiecesData");

                    if (FolderPath != "")
                    {
                        PuzzlePieceMaker Temp = new PuzzlePieceMaker(_selectedTexture, _pieceJointMaskImages,
                                                                     _piecesInRow, _piecesInCol);

                        for (int RowTrav = 0; RowTrav < _piecesInCol; RowTrav++)
                        {
                            for (int ColTrav = 0; ColTrav < _piecesInRow; ColTrav++)
                            {
                                byte[] Epng = Temp._CreatedImagePiecesData[RowTrav, ColTrav].PieceImage.EncodeToPNG();
                                System.IO.File.WriteAllBytes(FolderPath + "\\Piece" + RowTrav.ToString() + "_" +
                                                             ColTrav.ToString() + ".png", Epng);
                            }
                        }

                        if (_saveGeneratedBackground)
                        {
                            byte[] Epng = Temp.CreatedBackgroundImage.EncodeToPNG();
                            System.IO.File.WriteAllBytes(FolderPath + "\\Background Image.png", Epng);
                        }
                    }
                }
            }
        }


        EditorGUILayout.EndVertical();
    }
예제 #2
0
    /// <summary>
    /// Generates jigsaw puzzle and initialize pieces with data according to user selected options
    /// </summary>
    /// <returns>Coroutine</returns>
    public virtual IEnumerator Start()
    {
        if (!UseFilePath)
        {
            _puzzlePieceMaker = new PuzzlePieceMaker(PuzzleImage, JointMaskImage, PiecesInRow, PiecesInCol);

            //Enable below code and provide a file path to save data created by _puzzlemaker class using provided image
            //_PuzzleMaker.SaveData("File Path here e.g c:\\Images\\Temp.pm");
        }
        else
        {
            if (PuzzlePieceMaker.IsPMFileSupportedPlatform())
            {
                try
                {
                    _puzzlePieceMaker      = new PuzzlePieceMaker(PMFilePath);
                    PiecesInCol            = _puzzlePieceMaker.NoOfPiecesInCol;
                    PiecesInRow            = _puzzlePieceMaker.NoOfPiecesInRow;
                    _isFileLoadingComplete = true;
                }
                catch (System.Exception e)
                {
                    Debug.LogError("Please check if you have provided correct file path : " + e.Message);
                    Destroy(gameObject);
                    yield break;
                }
            }
            else if (Application.platform == RuntimePlatform.WebGLPlayer ||
                     Application.platform == RuntimePlatform.WindowsWebPlayer)
            {
                WebPmFileLoader Temp = GetComponent <WebPmFileLoader>();

                if (Temp != null)
                {
                    yield return(StartCoroutine(Temp.LoadFileToStream(PMFilePath)));

                    if (Temp.PMFileStream != null)
                    {
                        _puzzlePieceMaker      = new PuzzlePieceMaker(Temp.PMFileStream);
                        PiecesInCol            = _puzzlePieceMaker.NoOfPiecesInCol;
                        PiecesInRow            = _puzzlePieceMaker.NoOfPiecesInRow;
                        _isFileLoadingComplete = true;
                    }
                    else
                    {
                        Debug.LogError("File loading failed");
                        yield break;
                    }
                }
                else
                {
                    Debug.LogError("Prefab not set correctly");
                }
            }
        }


        yield return(new WaitForEndOfFrame());


        //Get main instance of puzzle piece
        _puzzlePieceInst = gameObject.transform.FindChild("Piece").gameObject;

        //Set puzzle image to Puzzle piece instance
        _puzzlePieceInst.GetComponent <Renderer>().material.mainTexture = _puzzlePieceMaker.PuzzleImage;

        //Seperate from cam for cam resizing to adjust whole puzzle in cam view
        parentCamTransform          = gameObject.transform.parent;
        parentCam                   = parentCamTransform.GetComponent <Camera>();
        gameObject.transform.parent = null;


        //Set background
        if (DisplayCompletedImage)
        {
            GetComponent <Renderer>().enabled = true;
            GetComponent <Renderer>().material.mainTexture = _puzzlePieceMaker.CreatedBackgroundImage;
        }

        //Resize gameobject to match size for pieces
        transform.localScale = new Vector3((float)PiecesInRow, (PiecesInCol * ((float)PuzzleImage.height / (float)PuzzleImage.width)), 1f);


        //Translate to zero
        transform.position = Vector3.zero;
        transform.rotation = Quaternion.Euler(Vector3.zero);


        //Initialize all pieces and joints resize them and place them on screen randomly
        _puzzlePieces = new GameObject[PiecesInRow * PiecesInCol];


        //Scale piece according to puzzle
        float PieceScaleX = 1;
        float PieceScaleY = 1 * ((float)_puzzlePieceMaker.PuzzleImageHeight / (float)_puzzlePieceMaker.PuzzleImageWidth);

        _puzzlePieceInst.transform.localScale = new Vector3(PieceScaleX, PieceScaleY, 1);


        //Create joints instances for each side from _puzzle piece
        GameObject _leftJointInst = Object.Instantiate(_puzzlePieceInst) as GameObject;

        Component[] AllCompoenents = _leftJointInst.GetComponents <Component>();
        foreach (Component item in AllCompoenents)
        {
            if (!(item is Renderer || item is Transform || item is MeshFilter))
            {
                Destroy(item);
            }
        }

        yield return(new WaitForEndOfFrame());

        GameObject _rightJointInst  = Object.Instantiate(_leftJointInst) as GameObject;
        GameObject _topJointInst    = Object.Instantiate(_leftJointInst) as GameObject;
        GameObject _bottomJointInst = Object.Instantiate(_leftJointInst) as GameObject;


        //Initialize joints instances
        _leftJointInst.GetComponent <Renderer>().material.mainTexture   = _puzzlePieceMaker.LeftJointsMaskImage;
        _rightJointInst.GetComponent <Renderer>().material.mainTexture  = _puzzlePieceMaker.RightJointsMaskImage;
        _topJointInst.GetComponent <Renderer>().material.mainTexture    = _puzzlePieceMaker.TopJointsMaskImage;
        _bottomJointInst.GetComponent <Renderer>().material.mainTexture = _puzzlePieceMaker.BotJointsMaskImage;

        //Name joints
        _leftJointInst.name   = "LeftJoint";
        _rightJointInst.name  = "RightJoint";
        _topJointInst.name    = "TopJoint";
        _bottomJointInst.name = "BottomJoint";

        //Position joints
        float JointWidth  = _leftJointInst.transform.localScale.x;
        float JointHeight = _leftJointInst.transform.localScale.y;


        //Make joints child of piece
        _leftJointInst.transform.parent     = _puzzlePieceInst.transform;
        _leftJointInst.transform.localScale = Vector3.one;
        _leftJointInst.SetActive(true);

        _rightJointInst.transform.parent     = _puzzlePieceInst.transform;
        _rightJointInst.transform.localScale = Vector3.one;
        _rightJointInst.SetActive(true);

        _topJointInst.transform.parent     = _puzzlePieceInst.transform;
        _topJointInst.transform.localScale = Vector3.one;
        _topJointInst.SetActive(true);

        _bottomJointInst.transform.parent     = _puzzlePieceInst.transform;
        _bottomJointInst.transform.localScale = Vector3.one;
        _bottomJointInst.SetActive(true);


        //Position joints
        _leftJointInst.transform.localPosition   = new Vector3(-1, 0, 0);
        _rightJointInst.transform.localPosition  = new Vector3(1, 0, 0);
        _topJointInst.transform.localPosition    = new Vector3(0, 1, 0);
        _bottomJointInst.transform.localPosition = new Vector3(0, -1, 0);


        //Initialize pieces
        for (int RowTrav = 0; RowTrav < PiecesInCol; RowTrav++)
        {
            for (int ColTrav = 0; ColTrav < PiecesInRow; ColTrav++)
            {
                GameObject Temp = Object.Instantiate(_puzzlePieceInst) as GameObject;


                //Name for this piece
                Temp.name = "Piece" + ((RowTrav * PiecesInRow) + ColTrav).ToString();

                SetPuzzlePieceUV(Temp, ColTrav, RowTrav, PiecesInCol, PiecesInRow);

                //Enable piece
                Temp.SetActive(true);

                SPieceInfo ThisPieceData = _puzzlePieceMaker._CreatedPiecesData[RowTrav, ColTrav];
                bool       TempOut       = false;

                bool HaveTopJoint = ThisPieceData.HaveJoint(EJointPosition.Top);
                if (HaveTopJoint)
                {
                    HaveTopJoint = ThisPieceData.GetJoint(EJointPosition.Top, out TempOut).JointType != EJointType.Female;
                }

                bool HaveBotJoint = ThisPieceData.HaveJoint(EJointPosition.Bottom);
                if (HaveBotJoint)
                {
                    HaveBotJoint = ThisPieceData.GetJoint(EJointPosition.Bottom, out TempOut).JointType != EJointType.Female;
                }

                bool HaveLeftJoint = ThisPieceData.HaveJoint(EJointPosition.Left);
                if (HaveLeftJoint)
                {
                    HaveLeftJoint = ThisPieceData.GetJoint(EJointPosition.Left, out TempOut).JointType != EJointType.Female;
                }

                bool HaveRightJoint = ThisPieceData.HaveJoint(EJointPosition.Right);
                if (HaveRightJoint)
                {
                    HaveRightJoint = ThisPieceData.GetJoint(EJointPosition.Right, out TempOut).JointType != EJointType.Female;
                }



                //Set joints uvs
                Transform LeftJoint = Temp.transform.FindChild("LeftJoint");
                if (HaveLeftJoint && ColTrav > 0)
                {
                    SetPuzzlePieceUV(LeftJoint.gameObject, ColTrav - 1, RowTrav, PiecesInCol, PiecesInRow);
                }
                else
                {
                    LeftJoint.gameObject.SetActive(false);
                }


                Transform RightJoint = Temp.transform.FindChild("RightJoint");
                if (HaveRightJoint && ColTrav < PiecesInCol - 1)
                {
                    SetPuzzlePieceUV(RightJoint.gameObject, ColTrav + 1, RowTrav, PiecesInCol, PiecesInRow);
                }
                else
                {
                    RightJoint.gameObject.SetActive(false);
                }


                Transform TopJoint = Temp.transform.FindChild("TopJoint");
                if (HaveTopJoint && RowTrav < PiecesInRow - 1)
                {
                    SetPuzzlePieceUV(TopJoint.gameObject, ColTrav, RowTrav + 1, PiecesInCol, PiecesInRow);
                }
                else
                {
                    TopJoint.gameObject.SetActive(false);
                }


                Transform BotJoint = Temp.transform.FindChild("BottomJoint");
                if (HaveBotJoint && RowTrav > 0)
                {
                    SetPuzzlePieceUV(BotJoint.gameObject, ColTrav, RowTrav - 1, PiecesInCol, PiecesInRow);
                }
                else
                {
                    BotJoint.gameObject.SetActive(false);
                }


                _puzzlePieces[(RowTrav * PiecesInRow) + ColTrav] = Temp;
            }
        }
    }
예제 #3
0
    void Start()
    {
        if (!UseFilePath)
        {
            _PuzzleMaker = new PuzzlePieceMaker(PuzzleImage, JointMaskImage, PiecesInRow, PiecesInCol);

            //Enable below code and provide a file path to save data created by _puzzlemaker class using provided image
            //_PuzzleMaker.SaveData("File Path here e.g c:\\Images\\Temp.pm");
        }
        else
        {
            try
            {
                _PuzzleMaker = new PuzzlePieceMaker(PMFilePath);
                PiecesInRow  = _PuzzleMaker.NoOfPiecesInRow;
                PiecesInCol  = _PuzzleMaker.NoOfPiecesInCol;
            }
            catch (System.Exception e)
            {
                Debug.LogError("Please check if you have provided correct file path :" + e.Message);
                Destroy(gameObject);
                return;
            }
        }

        //Get main instance of puzzle piece
        PuzzlePiecePrefab = gameObject.transform.FindChild("PPPiece").gameObject;

        //Seperate from cam for cam resizing to adjust whole puzzle in cam view
        Transform parentCamTransform = gameObject.transform.parent;
        Camera    parentCam          = parentCamTransform.GetComponent <Camera>();

        gameObject.transform.parent = null;

        //Store current transform and translate to origin for everythings placement
        Vector3 OrigionalScale    = transform.localScale;
        Vector3 OrigionalPosition = transform.position;
        Vector3 OrigionalRotation = transform.localRotation.eulerAngles;


        //Set background
        GetComponent <Renderer>().material.mainTexture = _PuzzleMaker.CreatedBackgroundImage;

        //Resize gameobject to match size for pieces
        transform.localScale = new Vector3((float)PiecesInRow, (PiecesInCol * ((float)PuzzleImage.height / (float)PuzzleImage.width)), 1f);

        //Translate to zero
        transform.position = Vector3.zero;
        transform.rotation = Quaternion.Euler(Vector3.zero);


        //Initialize and set Colliders to detect piece in place

        //Get child colider object
        GameObject _ChildCollider = gameObject.transform.FindChild("Collider").gameObject;

        //Instantiate required number of childcollider objects
        _ChildColliders = new GameObject[PiecesInCol * PiecesInRow];

        //Hold created puzzle pieces instances
        _PuzzlePieces = new GameObject[PiecesInCol * PiecesInRow];

        //Holds initial positions for puzzle pieces
        _PuzzlePiecesOrigPos = new Vector3[_PuzzlePieces.Length];


        float PieceWidthInBackground  = 1;
        float PieceHeightInBackground = ((float)PuzzleImage.height / (float)PuzzleImage.width);


        for (int CCArray = 0; CCArray < PiecesInCol * PiecesInRow; CCArray++)
        {
            _ChildColliders[CCArray] = Object.Instantiate(_ChildCollider) as GameObject;

            BoxCollider CollisionDetector = _ChildColliders[CCArray].GetComponent <BoxCollider>();

            //Set colliders size
            CollisionDetector.size = new Vector3(0.2f, ((float)PuzzleImage.height / (float)PuzzleImage.width) * 0.2f, 1f);

            _ChildColliders[CCArray].name = "BackgroundCollider" + CCArray.ToString();


            float CalculatedX = transform.position.x - (transform.localScale.x / 2) +
                                PieceWidthInBackground * Mathf.Repeat(CCArray, PiecesInRow) + (PieceWidthInBackground / 2);
            float CalculatedY = transform.position.y - (transform.localScale.y / 2) +
                                (PieceHeightInBackground * (CCArray / PiecesInRow)) + (PieceHeightInBackground / 2);


            _ChildColliders[CCArray].transform.position = new Vector3(CalculatedX, CalculatedY, transform.position.z - 0.1f);
            _ChildColliders[CCArray].transform.parent   = transform;
        }

        Destroy(_ChildCollider);


        #region "Pieces Initialization And Placement"

        float PieceZ = transform.position.z - (PiecesInRow * PiecesInCol) * 0.01f;
        float PieceX = transform.position.x - (transform.localScale.x / 2) - PieceWidthInBackground;
        float PieceY = transform.position.y - (transform.localScale.y / 2) + PieceHeightInBackground;

        for (int RowTrav = 0; RowTrav < PiecesInCol; RowTrav++)
        {
            for (int ColTrav = 0; ColTrav < PiecesInRow; ColTrav++, PieceZ -= 0.01f)
            {
                Texture2D Img = _PuzzleMaker._CreatedImagePiecesData[RowTrav, ColTrav].PieceImage;

                float PieceScaleX = (float)Img.width / (float)_PuzzleMaker.PieceWidthWithoutJoint;
                float PieceScaleY = PieceHeightInBackground * ((float)Img.height / (float)_PuzzleMaker.PieceHeightWithoutJoint);


                //Initialize all pieces with images and resize appropriately
                GameObject Temp = Instantiate(PuzzlePiecePrefab) as GameObject;
                Temp.GetComponent <Renderer>().material.mainTexture = Img;

                Temp.transform.localScale = new Vector3(PieceScaleX, PieceScaleY, 1);

                //Place pieces
                Temp.transform.position = new Vector3(PieceX, PieceY, PieceZ);

                //Assign name
                Temp.name = "Piece" + ((RowTrav * PiecesInRow) + ColTrav).ToString();

                //Enable piece
                Temp.SetActive(true);

                _PuzzlePieces[(RowTrav * PiecesInRow) + ColTrav] = Temp;
            }
        }

        #endregion


        #region "Piece Shuffling"

        if (ShufflePieces)
        {
            //Shuffle pieces position using Fisher-Yates shuffle algorithm
            Vector3[] TempPosHolder = new Vector3[_PuzzlePieces.Length];

            for (int i = 0; i < _PuzzlePieces.Length; i++)
            {
                TempPosHolder[i] = _PuzzlePieces[i].transform.position;
            }

            Random.seed = System.DateTime.Now.Second;

            for (int i = _PuzzlePieces.Length - 1; i > 0; i--)
            {
                int RndPos = Random.Range(0, i - 1);

                Vector3 Swapvar = TempPosHolder[i];
                TempPosHolder[i]      = TempPosHolder[RndPos];
                TempPosHolder[RndPos] = Swapvar;

                //Apply changed location to piece
                _PuzzlePieces[i].transform.position = TempPosHolder[i];
            }
        }

        #endregion


        //Make all puzzle pieces child of gameobjects
        for (int i = 0; i < _PuzzlePieces.Length; i++)
        {
            _PuzzlePieces[i].transform.parent = transform;

            //Hold positions for pieces
            _PuzzlePiecesOrigPos[i] = _PuzzlePieces[i].transform.localPosition;
        }


        //Translate everything back to its origional position
        transform.position = OrigionalPosition;
        transform.rotation = Quaternion.Euler(OrigionalRotation);

        gameObject.GetComponent <Renderer>().enabled = true;


        #region "Camera  Resizing And Placement"

        //Resize camera to display whole puzzle in camera view
        float widthToBeSeen  = gameObject.GetComponent <Renderer>().bounds.size.x + PieceWidthInBackground * 1.35f;
        float heightToBeSeen = gameObject.GetComponent <Renderer>().bounds.size.y;

        parentCam.orthographicSize = widthToBeSeen > heightToBeSeen ? widthToBeSeen * 0.4f : heightToBeSeen * 0.4f;


        //parentCamTransform.position = new Vector3(CalcCameraX, CalcCameraY, _pieceInstances[1][0].transform.position.z - 3);
        parentCamTransform.position = new Vector3(0.28f, 0, transform.position.z - 10);


        #endregion
    }
예제 #4
0
    void Start()
    {
        if (!UseFilePath)
        {
            //random image selection
            PuzzleImage = new Texture2D(1, 1);
            PuzzleImage.LoadImage(File.ReadAllBytes(getPath() + "/dewa/" + Random.Range(0, 6) + ".jpg"));
            //Debug.Log(getPath()+ "/Puzzle Maker/PM Free Images/dewa/" + "1" + ".jpg");
            //Random.Range(0, 3) //KIDS PUZZLE IMAGES
            //Random.Range(3,6)  //ADULTS PUZZLE IMAGES
            _PuzzleMaker = new PuzzlePieceMaker(PuzzleImage, JointMaskImage, PiecesInRow, PiecesInCol);

            //Enable below code and provide a file path to save data created by _puzzlemaker class using provided image
            //_PuzzleMaker.SaveData("File Path here e.g c:\\Images\\Temp.pm");
        }
        else
        {
            try
            {
                _PuzzleMaker = new PuzzlePieceMaker(PMFilePath);
                PiecesInCol  = _PuzzleMaker.NoOfPiecesInCol;
                PiecesInRow  = _PuzzleMaker.NoOfPiecesInRow;
            }
            catch (System.Exception e)
            {
                Debug.LogError("Please check if you have provided correct file path : " + e.Message);
                Destroy(gameObject);
                return;
            }
        }


        //Get main instance of puzzle piece
        _jpPuzzlePieceInst = gameObject.transform.FindChild("JPPiece").gameObject;

        //Seperate from cam for cam resizing to adjust whole puzzle in cam view
        Transform parentCamTransform = gameObject.transform.parent;
        Camera    parentCam          = parentCamTransform.GetComponent <Camera>();

        gameObject.transform.parent = null;

        //Store current transform and translate to origin for everythings placement
        Vector3 OrigionalScale    = transform.localScale;
        Vector3 OrigionalPosition = transform.position;
        Vector3 OrigionalRotation = transform.localRotation.eulerAngles;


        //Set background
        if (DisplayCompletedImage)
        {
            GetComponent <Renderer>().enabled = true;
            GetComponent <Renderer>().material.mainTexture = _PuzzleMaker.CreatedBackgroundImage;
        }

        //Resize gameobject to match size for pieces
        transform.localScale = new Vector3((float)PiecesInRow, (PiecesInCol * ((float)PuzzleImage.height / (float)PuzzleImage.width)), 1f);

        //Translate to zero
        transform.position = new Vector3(0, 0, 0);
        transform.rotation = Quaternion.Euler(Vector3.zero);


        #region "Pieces Initialization And Placement"

        //Initialize all pieces resize them and place them on screen randomly
        _PuzzlePieces = new GameObject[PiecesInRow * PiecesInCol];

        Random.seed = System.DateTime.Now.Millisecond;

        for (int RowTrav = 0; RowTrav < PiecesInCol; RowTrav++)
        {
            for (int ColTrav = 0; ColTrav < PiecesInRow; ColTrav++)
            {
                GameObject Temp = Object.Instantiate(_jpPuzzlePieceInst) as GameObject;

                //AudioSettings name for this piece
                Temp.name = "Piece" + ((RowTrav * PiecesInRow) + ColTrav).ToString();


                Texture2D Img = _PuzzleMaker._CreatedImagePiecesData[RowTrav, ColTrav].PieceImage;

                float PieceScaleX = (float)Img.width / (float)_PuzzleMaker.PieceWidthWithoutJoint;
                float PieceScaleY = this.PieceHeightInWorld * ((float)Img.height / (float)_PuzzleMaker.PieceHeightWithoutJoint);


                JPPieceController TempPieceControllerInst = Temp.GetComponent <JPPieceController>();
                TempPieceControllerInst.JpPuzzleControllerInstance = this;


                //Get this piece information
                SPieceInfo ThisPieceData = _PuzzleMaker._CreatedImagePiecesData[RowTrav, ColTrav].PieceMetaData.MakeCopy();
                TempPieceControllerInst.ThisPieceData = ThisPieceData;

                //Assign image to piece
                Temp.GetComponent <Renderer>().material.mainTexture = Img;

                //Resize piece in world
                Temp.transform.localScale = new Vector3(PieceScaleX, PieceScaleY, 1);


                //Position pieces randomly on screen
                Vector3 CalcPosition = Camera.main.ScreenToWorldPoint(
                    new Vector3(Random.Range(_PuzzleMaker.PieceWidthWithoutJoint, Screen.width - _PuzzleMaker.PieceWidthWithoutJoint),
                                Random.Range(_PuzzleMaker.PieceHeightWithoutJoint, Screen.height - _PuzzleMaker.PieceHeightWithoutJoint),
                                0));
                CalcPosition.z = transform.position.z - 0.4f;

                Temp.transform.position = CalcPosition;


                //Enable collider for this piece
                Temp.GetComponent <BoxCollider>().enabled = true;
                TempPieceControllerInst.enabled           = true;

                //Enable piece
                Temp.SetActive(true);

                _PuzzlePieces[(RowTrav * PiecesInRow) + ColTrav] = Temp;
            }
        }

        #endregion


        #region "Camera Resizing And Placement"

        //Resize camera to display whole puzzle in camera view
        float widthToBeSeen  = PiecesInRow * PieceWidthInWorld;
        float heightToBeSeen = PiecesInCol * PieceHeightInWorld;

        parentCam.orthographicSize = widthToBeSeen > heightToBeSeen ? widthToBeSeen * 0.4f : heightToBeSeen * 0.4f;

        //Position camera in centre of puzzle
        //float CalcCameraX = ;
        //float CalcCameraY = ;

        //parentCamTransform.position = new Vector3(CalcCameraX, CalcCameraY, _pieceInstances[1][0].transform.position.z - 3);
        parentCamTransform.position = new Vector3(0, 0, transform.position.z - 10);

        #endregion
    }