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); } }
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]); } } }
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); }