public static void TryInstantiatingAnimatable(OvrAvatar.HandType hand, ShelfObject shelfObj)
        {
            if (RecognitionState != GestureRecognizerState.Default && RecognitionState != GestureRecognizerState.Recognizing)
            {
                return;
            }

            if (hand == OvrAvatar.HandType.Right &&
                (rightAlmostPointOn || rightPointOn || rightGrabOn || rightPinchOn))
            {
                var anim = shelfObj.InstantiateAnimatable();
                if (anim != null)
                {
                    ObjectInstantiator      = shelfObj;
                    ObjectBeingInstantiated = anim;
                    SetRecognitionState(GestureRecognizerState.Instantiating);
                }
            }
            else if (hand == OvrAvatar.HandType.Left &&
                     (leftAlmostPointOn || leftPointOn || leftGrabOn || leftPinchOn))
            {
                var anim = shelfObj.InstantiateAnimatable();
                if (anim != null)
                {
                    ObjectInstantiator      = shelfObj;
                    ObjectBeingInstantiated = anim;
                    SetRecognitionState(GestureRecognizerState.Instantiating);
                }
            }
        }
Beispiel #2
0
        public void TryChangeParticleShapeFromDroppedObject(ShelfObject obj)
        {
            try
            {
                ParticleMeshCreator = obj;
                GameObject particle = Instantiate(obj.ParticlePrefab);
                if (particle == null)
                {
                    Debug.LogWarning("No particle prefab found!");
                    return;
                }
                var mr = particle.GetComponentInChildren <MeshRenderer>();
                ParticleScale           = mr.transform.lossyScale;
                main.startSizeX         = ParticleScale.x;
                main.startSizeY         = ParticleScale.y;
                main.startSizeZ         = ParticleScale.z;
                InitialParticleRotation = mr.transform.rotation;

                var     psr   = GetComponent <ParticleSystemRenderer>();
                var     mesh  = mr.GetComponent <MeshFilter>().mesh;
                var     verts = mesh.vertices;
                Vector3 avg   = Vector3.zero;
                for (int i = 0; i < verts.Length; ++i)
                {
                    avg += verts[i];
                }
                avg /= verts.Length;
                for (int i = 0; i < verts.Length; ++i)
                {
                    verts[i] -= avg;
                }

                mesh.SetVertices(verts.ToList());
                psr.mesh     = mesh;
                psr.material = mr.GetComponent <MeshRenderer>().material;
                Destroy(particle);
                ps.Stop();
                ps.Play();
            }
            catch (Exception e)
            {
                Debug.LogWarning(e.Message);
                Debug.Log(e.StackTrace);
            }
        }
Beispiel #3
0
        public void Init(ShelfObject parent)
        {
            Creator = parent;
            OnInit?.Invoke();
            TimeManager.RegisterObject(this);

            foreach (var mf in GetComponentsInChildren <MeshFilter>())
            {
                mf.mesh = mf.sharedMesh;
            }

            foreach (var child in GetComponentsInChildren <Animatable>())
            {
                if (child.GetInstanceID() == GetInstanceID())
                {
                    continue;
                }

                child.Init(null);
            }
        }
Beispiel #4
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);
        }