private void SplitMuscle(OrganismSetup organism)
    {
        if (organism.muscles.Count == 0)
        {
            return;
        }

        MuscleSetup muscleA = organism.muscles.OrderBy(v => Random.value).FirstOrDefault();
        float       lerp    = Random.Range(0.4f, 0.6f); //Where the slice will happen on the muscle
        MuscleSetup muscleB = muscle.Randomize(muscleA);

        muscleA.relaxedDistance *= lerp;
        muscleB.relaxedDistance *= (1 - lerp);

        JointSetup newJoint = joint.Randomize(
            organism.joints[muscleA.jointA].Lerp(organism.joints[muscleA.jointB], lerp)
            );

        int jointPos = organism.joints.Count;

        muscleA.jointB = jointPos;
        muscleB.jointA = jointPos;

        organism.joints.Add(newJoint);
        organism.muscles.Add(muscleB);
    }
    private void RemoveSpecificJoint(OrganismSetup organism, int removed)
    {
        organism.joints.RemoveAt(removed);

        //Removes the empty reference inside the organism and muscles which references to it.
        List <MuscleSetup> fixedMuscles = new List <MuscleSetup> ();

        for (int i = 0; i < organism.muscles.Count; i++)
        {
            MuscleSetup ms = organism.muscles [i];
            if (ms.jointA == removed || ms.jointB == removed)
            {
                continue;
            }

            if (ms.jointA > removed)
            {
                ms.jointA--;
            }
            if (ms.jointB > removed)
            {
                ms.jointB--;
            }

            fixedMuscles.Add(ms);
        }
        organism.muscles = fixedMuscles;
    }
Esempio n. 3
0
    public void Spawn(Vector3 pos)
    {
        Rect boundaries = new Rect(0, 0, 0, 0);

        for (int i = 0; i < setup.joints.Count; i++)
        {
            JointSetup s = setup.joints[i];
            if (s == null)
            {
                continue;
            }

            OrganismJoint joint = OrganismManager.JointPool.Take();
            joint.transform.SetParent(transform);
            s.Apply(joint);
            joints.Add(joint);

            Rect jointBounds = new Rect(s.position - Vector2.one * joint.Radius, new Vector2(joint.Radius * 2, joint.Radius * 2));
            if (i == 0 || jointBounds.xMin < boundaries.xMin)
            {
                boundaries.xMin = jointBounds.xMin;
            }
            if (i == 0 || jointBounds.xMax > boundaries.xMax)
            {
                boundaries.xMax = jointBounds.xMax;
            }
            if (i == 0 || jointBounds.yMin < boundaries.yMin)
            {
                boundaries.yMin = jointBounds.yMin;
                boundaries.yMax = jointBounds.yMax;
            }
        }

        for (int i = 0; i < setup.muscles.Count; i++)
        {
            MuscleSetup s = setup.muscles[i];

            if (setup.joints [s.jointA] == null || setup.joints [s.jointB] == null)
            {
                continue;
            }

            OrganismMuscle muscle = OrganismManager.MusclePool.Take();
            muscle.jointA = joints[s.jointA];
            muscle.jointB = joints[s.jointB];

            muscle.transform.SetParent(transform);
            s.Apply(muscle);
            muscles.Add(muscle);
        }

        transform.position = pos + new Vector3(boundaries.center.x, -boundaries.yMin + 0.01f);
        gameObject.SetActive(true);
    }
    public void CreateJoint(OrganismSetup organism)
    {
        int jointA = Random.Range(0, organism.joints.Count); //To which joint the new joint will be attached?
        int jointB = organism.joints.Count;                  //The new joint ID;

        JointSetup  newJoint  = joint.Randomize(organism.joints[jointA]);
        MuscleSetup newMuscle = muscle.FullRandomize();

        newMuscle.jointA = jointA;
        newMuscle.jointB = jointB;

        organism.joints.Add(newJoint);
        organism.muscles.Add(newMuscle);
    }
    public void RemoveMuscle(OrganismSetup organism)
    {
        int removedMuscle = Random.Range(0, organism.muscles.Count);
        //Get the joints attached to the muscle
        int a = organism.muscles [removedMuscle].jointA;
        int b = organism.muscles [removedMuscle].jointB;

        //Removes the muscle
        organism.muscles.RemoveAt(removedMuscle);

        //Verifies if the joints attached to the muscle still have connections.
        bool foundA = false;
        bool foundB = false;

        for (int i = 0; i < organism.muscles.Count; i++)
        {
            MuscleSetup ms = organism.muscles [i];
            if (ms.jointA == a || ms.jointB == a)
            {
                foundA = true;
            }
            if (ms.jointB == b || ms.jointA == b)
            {
                foundB = true;
            }
            if (foundA && foundB)
            {
                return;
            }
        }

        if (!foundA)
        {
            RemoveSpecificJoint(organism, a);
        }
        if (!foundB)
        {
            if (!foundA && b > a)
            {
                b--;
            }
            RemoveSpecificJoint(organism, b);
        }
    }
    public OrganismSetup FullRandomOrganism(OrganismSetup originalSetup)
    {
        OrganismSetup result = new OrganismSetup();

        result.joints  = new List <JointSetup> ();
        result.muscles = new List <MuscleSetup> ();

        for (int i = 0; i < originalSetup.joints.Count; i++)
        {
            result.joints.Add(joint.FullRandomize());
        }

        for (int i = 0; i < originalSetup.muscles.Count; i++)
        {
            MuscleSetup original  = originalSetup.muscles [i];
            MuscleSetup newMuscle = muscle.FullRandomize();
            newMuscle.jointA = original.jointA;
            newMuscle.jointB = original.jointB;
            result.muscles.Add(newMuscle);
        }

        return(result);
    }
    public void CreateMuscle(OrganismSetup organism)
    {
        int joints     = organism.joints.Count;
        int maxMuscles = 0;

        for (int i = 1; i < joints; i++)
        {
            maxMuscles += i;
        }

        if (organism.muscles.Count >= maxMuscles)
        {
            //no room for new muscles
            if (fallbackFromMuscleToJoint)
            {
                CreateJoint(organism);
                return;
            }
        }
        Dictionary <JointSetup, int> map = new Dictionary <JointSetup, int> ();

        for (int i = 0; i < joints; i++)
        {
            map.Add(organism.joints [i], i);
        }
        JointSetup[] jointsA = new List <JointSetup> (organism.joints).OrderBy(s => Random.value).ToArray();
        JointSetup[] jointsB = new List <JointSetup> (organism.joints).OrderBy(s => Random.value).ToArray();
        for (int a = 0; a < joints; a++)
        {
            for (int b = 0; b < joints; b++)
            {
                if (jointsA[a] == jointsB[b])
                {
                    continue;
                }

                bool found = false;
                int  ja    = map [jointsA [a]];
                int  jb    = map [jointsB [b]];

                for (int i = 0; i < organism.muscles.Count; i++)
                {
                    if (organism.muscles [i].Match(ja, jb))
                    {
                        found = true;
                        break;
                    }
                }

                if (!found)
                {
                    MuscleSetup newMuscle = muscle.FullRandomize();
                    newMuscle.jointA = ja;
                    newMuscle.jointB = jb;

                    organism.muscles.Add(
                        newMuscle
                        );
                    return;
                }
            }
        }
    }