Ejemplo n.º 1
0
        public SerializableScene(int nF, Animatable[] sceneObjects)
        {
            NumFrame = nF;
            Objects  = new List <SerializableAnimatable>(sceneObjects.Length);

            foreach (var sceneObj in sceneObjects)
            {
                // only get top-level objects, the others will be saved in the
                // Children lists via calls to `new SerializableAnimatable(Animatable)`
                if (sceneObj.GetComponentsInParent <Animatable>().Length != 1)
                {
                    continue;
                }

                var obj = new SerializableAnimatable(sceneObj, true);

                Objects.Add(obj);
            }
        }
Ejemplo n.º 2
0
        private static void SetPropertiesFromJsonObject(Animatable sceneObject, SerializableAnimatable obj)
        {
            TimeManager.RegisterObject(sceneObject, false);
            sceneObject.StartFrame = obj.StartFrame;

            foreach (var pair in obj.TranslationKeys)
            {
                sceneObject.AddTranslationKey(pair.Item2, pair.Item1 + obj.StartFrame);
            }
            foreach (var pair in obj.RotationKeys)
            {
                sceneObject.AddRotationKey(pair.Item2, pair.Item1 + obj.StartFrame);
            }
            foreach (var pair in obj.ScaleKeys)
            {
                sceneObject.AddScaleKey(pair.Item2, pair.Item1 + obj.StartFrame);
            }

            sceneObject.EvaluateTransform(0);

            // recurse for top-level folks
            if (obj.IsTopLevel)
            {
                var sceneChildren = sceneObject.GetComponentsInChildren <Animatable>();
                Debug.Assert(sceneChildren.Length - 1 == obj.Children.Count,
                             "#children in saved file differs from loaded object! " +
                             sceneChildren.Length + " != " + obj.Children.Count);

                // Since GetComponentsInChildren<T> uses depth-first search, the first
                // component must be `obj` itself, which we skip
                for (int i = 1; i < sceneChildren.Length; ++i)
                {
                    SetPropertiesFromJsonObject(sceneChildren[i], obj.Children[i - 1]);
                }
            }
        }
Ejemplo n.º 3
0
        private static void InstantiateFromSaved(SerializableAnimatable obj, Dictionary <string, ShelfObject> shelfObjMap)
        {
            bool        isShelfObjectAvailable = false;
            ShelfObject shelfObj = null;

            isShelfObjectAvailable = shelfObjMap.TryGetValue(obj.ShelfParent, out shelfObj);

            if (!isShelfObjectAvailable)
            {
                Debug.LogWarning("File load warning: Could not find a shelfobject named " + obj.ShelfParent);
                return;
            }

            var sceneObject = shelfObj.InstantiateAnimatable();

            SetPropertiesFromJsonObject(sceneObject, obj);

            // Emitters are only supported on top-level objects
            var emitter = obj.Emitter;

            // Assuming that for no "Emitter" in the JSON, its default value
            // is created, and so a list subfield should be empty
            if (emitter.CurveControlPoints != null &&
                emitter.CurveControlPoints.Count > 0)
            {
                var sceneEmitter = sceneObject.GetComponentInChildren <ParticleEmitter>();
                if (sceneEmitter == null)
                {
                    Debug.LogWarning(
                        "JSON indicated the presence of a particle emitter for " +
                        shelfObj.name +
                        " but no emitter was found on the object!");
                }

                var ctrlPoints = new List <Vector3>(emitter.CurveControlPoints.Count);
                foreach (var pt in emitter.CurveControlPoints)
                {
                    ctrlPoints.Add(pt);
                }

                sceneEmitter.SetEmissionConeFromFile(
                    ctrlPoints,
                    emitter.TimeCache,
                    emitter.EmissionDataKeys);

                sceneEmitter.GravityInfluence = emitter.GravityInfluence;
                sceneEmitter.WindInfluence    = emitter.WindInfluence;

                sceneEmitter.MaxPositionNoise = emitter.MaxPositionNoise;
                sceneEmitter.MaxRotationNoise = emitter.MaxRotationNoise;

                sceneEmitter.PositionNoiseFrequency = emitter.PositionNoiseFrequency;
                sceneEmitter.RotationNoiseFrequency = emitter.RotationNoiseFrequency;

                sceneEmitter.SpiralFrequency = emitter.SpiralFrequency;

                sceneEmitter.InitialParticleRotation = emitter.InitialParticleRotation;
                sceneEmitter.ParticleScale           = emitter.ParticleScale;

                if (emitter.ParticleShelfObject != null)
                {
                    bool res = shelfObjMap.TryGetValue(emitter.ParticleShelfObject, out ShelfObject particleMeshParent);
                    if (res)
                    {
                        sceneEmitter.TryChangeParticleShapeFromDroppedObject(particleMeshParent);
                    }
                }

                sceneEmitter.TestMode = false;
            }

            sceneObject.Init(shelfObj);
        }