// Configure a new sprite item data object properties, (could be new or recycled).
 protected override void ConfigureSpriteItemData(BaseSpriteItemData data)
 {
     // A new bolt is getting prepared, so let's schedule the sound effect.
     if (m_SkyProfile.IsFeatureEnabled(ProfileFeatureKeys.ThunderFeature))
     {
         Invoke("PlayThunderBoltSound", m_ThunderSoundDelay);
     }
 }
        // Select where the next sprite will be rendered at.
        protected override void CalculateSpriteTRS(BaseSpriteItemData data, out Vector3 spritePosition, out Quaternion spriteRotation, out Vector3 spriteScale)
        {
            // Create some variety in rain drop sizes.
            float minScale     = m_SplashScale * (1.0f - m_SplashScaleVarience);
            float uniformScale = Random.Range(minScale, m_SplashScale);

            spritePosition = data.spritePosition;
            spriteRotation = Quaternion.identity;
            spriteScale    = new Vector3(uniformScale, uniformScale, uniformScale);
        }
        public void Start()
        {
            state = SpriteState.Animating;

            // Schedule the start/end time of this sprite sheet animation in the GPU.
            startTime = BaseSpriteItemData.CalculateStartTimeWithDelay(delay);

            endTime = BaseSpriteItemData.CalculateEndTime(startTime,
                                                          spriteSheetData.frameCount,
                                                          spriteSheetData.frameRate);
        }
        // Setup any per-instance data you need to pass.
        protected override void PrepareDataArraysForRendering(int instanceId, BaseSpriteItemData data)
        {
            RainSplashData splash = data as RainSplashData;

            // We could probably move this into the shader to save some CPU calculations if necessary.
            Vector3 screenPoint = m_DepthCamera.WorldToScreenPoint(splash.spritePosition);
            Vector2 cameraUV    = new Vector2(screenPoint.x / m_DepthCamera.pixelWidth, screenPoint.y / m_DepthCamera.pixelHeight);

            splash.depthTextureUV = cameraUV;

            m_StartSplashYPositions[instanceId] = splash.spritePosition.y;
            m_DepthUs[instanceId] = splash.depthTextureUV.x;
            m_DepthVs[instanceId] = splash.depthTextureUV.y;
        }
        // Get or create a instance data field for a particle.
        BaseSpriteItemData DequeueNextSpriteItemData()
        {
            BaseSpriteItemData data = null;

            if (m_Available.Count == 0)
            {
                data = CreateSpriteItemData();
            }
            else
            {
                data = m_Available.Dequeue();
            }

            m_Active.Add(data);

            return(data);
        }
        void GenerateNewSprites()
        {
            int spawnCount = GetNextSpawnCount();

            Vector3    spritePosition;
            Vector3    spriteScale;
            Quaternion spriteRotation;

            for (int i = 0; i < spawnCount; i++)
            {
                // Dequeue a sprite item data, and configure it.
                BaseSpriteItemData data = DequeueNextSpriteItemData();
                data.spriteSheetData = m_SpriteSheetLayout;

                ConfigureSpriteItemData(data);
                CalculateSpriteTRS(data, out spritePosition, out spriteRotation, out spriteScale);

                data.SetTRSMatrix(spritePosition, spriteRotation, spriteScale);
                data.Start();
            }
        }
        // Select where the next sprite will be rendered at.
        protected override void CalculateSpriteTRS(BaseSpriteItemData data, out Vector3 spritePosition, out Quaternion spriteRotation, out Vector3 spriteScale)
        {
            LightningSpawnArea area = GetRandomLightningSpawnArea();

            float boltScale = CalculateLightningBoltScaleForArea(area);

            spriteScale = new Vector3(boltScale, boltScale, boltScale);

            spritePosition = GetRandomWorldPositionInsideSpawnArea(area);

            // Always face the sprite textures towards the main camera.
            if (Camera.main == null)
            {
                Debug.LogError("Can't billboard lightning to viewer since there is no main camera tagged.");
                spriteRotation = area.transform.rotation;
            }
            else
            {
                spriteRotation = Quaternion.LookRotation(spritePosition - Camera.main.transform.position, Vector3.up);
            }
        }
 void ReturnSpriteItemData(BaseSpriteItemData splash)
 {
     splash.Reset();
     m_Active.Remove(splash);
     m_Available.Enqueue(splash);
 }
 // Setup any per-instance data you need to pass.
 protected abstract void PrepareDataArraysForRendering(int instanceId, BaseSpriteItemData data);
 // Configure a new sprite item data object properties, (could be new or recycled).
 protected abstract void ConfigureSpriteItemData(BaseSpriteItemData data);
 // Select where the next sprite will be rendered at.
 protected abstract void CalculateSpriteTRS(BaseSpriteItemData data, out Vector3 spritePosition, out Quaternion spriteRotation, out Vector3 spriteScale);
 // Configure a new sprite item data object properties, (could be new or recycled).
 protected override void ConfigureSpriteItemData(BaseSpriteItemData data)
 {
     data.spritePosition = CreateWorldSplashPoint();
     data.delay          = Random.Range(0.0f, .5f);
 }
 // Setup any per-instance data you need to pass.
 protected override void PrepareDataArraysForRendering(int instanceId, BaseSpriteItemData data)
 {
     // No custom properties.
 }