Example #1
0
    private void DrawDirectorProperties()
    {
        EditorGUILayout.BeginVertical("GroupBox");
        EditorGUILayout.LabelField("Director Data", m_resources.m_smallLabel);
        EditorGUILayout.Space(5);


        if (GUILayout.Button("Calculate Distributions"))
        {
            CalculateDirectorDistributions();
        }

        if (m_storyboardData.m_directorData != null && m_storyboardData.m_directorData != null)
        {
            StoryboardDirectorData dirData = m_storyboardData.m_directorData;
            EditorGUILayout.BeginVertical("GroupBox");
            GUILayout.Label("Calculated Data", m_resources.m_miniBoldLabel);

            EditorGUILayout.Space();
            GUIStyle labelstyle = new GUIStyle();
            labelstyle.alignment        = TextAnchor.MiddleLeft;
            labelstyle.normal.textColor = new Color(1, 1, 0, 1);

            for (int i = 0; i < m_storyboardData.m_directorData.m_categories.Count; i++)
            {
                CinematographyTechniqueCategory category = m_storyboardData.m_directorData.m_categories[i];

                category.m_foldout = EditorGUILayout.Foldout(category.m_foldout, category.m_title);

                if (category.m_foldout)
                {
                    for (int j = 0; j < category.m_techniques.Count; j++)
                    {
                        CinematographyTechnique techniqueData = category.m_techniques[j];

                        GUILayout.Label(" " + techniqueData.m_title, labelstyle);
                        EditorGUILayout.BeginHorizontal();
                        GUILayout.Label("PD: " + techniqueData.m_probabilityDistribution.ToString());
                        GUILayout.FlexibleSpace();
                        GUILayout.Label("Pace: " + techniqueData.m_pace.ToString());
                        EditorGUILayout.EndHorizontal();
                        EditorGUILayout.BeginHorizontal();
                        GUILayout.Label("CD: " + techniqueData.m_classDistribution.ToString());
                        GUILayout.FlexibleSpace();
                        GUILayout.Label("Dram: " + techniqueData.m_dramatization.ToString());
                        EditorGUILayout.EndHorizontal();
                    }
                }
            }

            EditorGUILayout.EndVertical();
        }


        EditorGUILayout.EndVertical();
    }
Example #2
0
    private CinematographyTechnique GetTechnique(string categoryID, StoryboardNode previousNode, StoryboardNode node, StoryboardDirectorData dirData, DecisionTechniquePreference pref, float dramThresh, float paceThresh, bool useFX)
    {
        int selectedIndex = -1;
        int it            = 0;

        CinematographyTechniqueCategory category         = dirData.m_categories.Find(o => o.m_title.CompareTo(categoryID) == 0);
        List <CinematographyTechnique>  dataList         = new List <CinematographyTechnique>(category.m_techniques);
        CinematographyTechnique         defaultTechnique = category.m_defaultTechnique;

        if (categoryID.CompareTo("FX") == 0 && !useFX)
        {
            return(dataList.Find(o => o.m_title.CompareTo("NoFX") == 0));
        }


        // Eliminate some techniques from the data list based on the previous node's technique information if necessary.
        if (previousNode != null)
        {
            ApplyShotBasedRuleset(categoryID, ref dataList, previousNode);
        }

        // Eliminate some techniques based on the current node's categories.
        ApplyNodeBasedRuleset(categoryID, ref dataList, node);

        // After we've selected the closest random technique, compare it's dramatization & pace.
        while (it < m_iterationTimeout)
        {
            // Select technique.
            if (pref == DecisionTechniquePreference.ProbabilityDistribution)
            {
                selectedIndex = MathUtility.GetCumulativeDistribution(dataList.Select(o => o.m_probabilityDistribution).ToArray());
            }
            else if (pref == DecisionTechniquePreference.ExponentialDistribution)
            {
                selectedIndex = MathUtility.GetCumulativeDistribution(dataList.Select(o => o.m_classDistribution).ToArray());
            }

            if (selectedIndex != -1)
            {
                // Check dramatization & pace thresholds for the selected technique.
                CinematographyTechnique techniqueData = dataList[selectedIndex];
                bool dramatizationChecks = dramThresh == 1.0f || (node.m_marker.m_dramatization > techniqueData.m_dramatization && node.m_marker.m_dramatization - techniqueData.m_dramatization < dramThresh);
                bool paceChecks          = paceThresh == 1.0f || (node.m_marker.m_pace > techniqueData.m_pace && node.m_marker.m_pace - techniqueData.m_pace < dramThresh);

                if (dramatizationChecks && paceChecks)
                {
                    return(techniqueData);
                }
            }

            it++;
        }
        dataList = null;
        return(defaultTechnique);
    }
    public bool CalculateProbabilityAndClassDistribution(ref List <CinematographyTechniqueImplementation> implementations)
    {
        for (int i = 0; i < m_categories.Count; i++)
        {
            int defaultTechniqueIndex = m_categories[i].m_techniques.FindIndex(o => o.m_title.CompareTo(m_categories[i].m_defaultTechniqueTitle) == 0);

            if (defaultTechniqueIndex < 0)
            {
                Debug.LogError("Techniques inside the category does not contain the default technique, please check your JSON file!");
                return(false);
            }

            m_categories[i].m_defaultTechnique = m_categories[i].m_techniques[defaultTechniqueIndex];

            m_categories[i].m_techniques.OrderBy(o => o.m_probabilityDistribution);

            float sum    = m_categories[i].m_techniques.Sum(o => o.m_value);
            float sumExp = m_categories[i].m_techniques.Sum(o => Mathf.Exp(o.m_value));

            for (int j = 0; j < m_categories[i].m_techniques.Count; j++)
            {
                CinematographyTechnique technique = m_categories[i].m_techniques[j];
                technique.CalculateDistributions(sum, sumExp);

                // Check whether implementations exist.
                int implementationIndex = implementations.FindIndex(o => o.GetType().ToString().CompareTo(technique.m_title) == 0);
                if (implementationIndex < 0)
                {
                    Debug.LogError("Implementation for " + technique.m_title + " could not be found. Make sure you have an implementation class deriving from" +
                                   "CinematographyTechniqueImplementation base class and is the same name as the technique's title.");
                    return(false);
                }
                else
                {
                    technique.m_implementation = implementations[implementationIndex];
                }
            }
        }

        return(true);
    }