Example #1
0
    private void  UpdateData()
    {
        /* NEW VERSION VARIABLE UPDATE PROCEDURE */
        //if the old 'fixed grid variable(bool) ' is used, transfer the information to the new one without damage done to the user.
        if (fixedPositioning)
        {
            fixedPositioning = false;
            scatterMode      = 1;
        }
        /*---------------------------------------*/


        //Debug.Log("update data called");
        if (population < 0)
        {
            population = 0;
            return;
        }

        if (raycastPositions != null)
        {
            if (raycastPositions.Length != population)     //Instantiate
            {
                InstantiateNew();
            }
            else
            {
                bitmask = new Bitmask(population);
                for (uint r = 0; r < population; r++)
                {
                    RaycastHit hit;
                    if (!Raycast(out hit, (int)r) && scatterMode != 0)
                    {
                        raycastPositionsBeta[r] = transform.position + raycastPositions[r];
                    }
                    else
                    if (bitmask != null)
                    {
                        if (bitmask.EvaluateAll())                                //if any raycast is hitting a surface
                        {
                            while (Raycast(out hit, (int)r) ? ((avoidMask & 1 << hit.transform.gameObject.layer) == 1 << hit.transform.gameObject.layer) : true)
                            {
                                raycastPositions[r] = GenerateRandomRaycast();
                            }
                        }
                    }

                    Quaternion normalQuaternion = Quaternion.FromToRotation(Vector3.up, hit.normal);
                    if (!followNormalsOrientation)                    //if follow normals is :off: reset the rotation
                    {
                        normalQuaternion = Quaternion.identity;
                    }

                    if (instanceObjects.Length > 0)
                    {
                        if (instanceObjects[r])
                        {
                            if (bitmask != null)
                            {
                                instanceObjects[r].SetActive(bitmask.Evaluate(r));
                            }
                            instanceObjects[r].transform.position    = raycastPositionsBeta[r] + hit.normal * offset;
                            instanceObjects[r].transform.eulerAngles = new Vector3(normalQuaternion.eulerAngles.x, normalQuaternion.eulerAngles.y, normalQuaternion.eulerAngles.z);
                            instanceObjects[r].transform.Rotate(0, yRotations[r], 0, Space.Self);
                        }
                    }
                }
            }
        }
    }