void OnEnable()
    {
        m_camera = GetComponent <Camera>();

        if (!CheckSupport())
        {
            enabled = false;
            return;
        }

        if (WorkerThreads <= 0)
        {
            WorkerThreads = Mathf.Max(Environment.ProcessorCount / 2, 1);               // half of CPU threads; non-busy idle
        }
        m_workerThreadPool = new AmplifyMotion.WorkerThreadPool();
        m_workerThreadPool.InitializeAsyncUpdateThreads(WorkerThreads, SystemThreadPool);

        m_starting = true;

        if (!CreateMaterials())
        {
            Debug.LogError("[AmplifyMotion] Failed loading or compiling necessary shaders. Please try reinstalling Amplify Motion or contact [email protected]");
            enabled = false;
            return;
        }

        if (AutoRegisterObjs)
        {
            UpdateActiveObjects();
        }

        InitializeCameras();

        UpdateRenderTextures(true);

        m_linkedCameras.TryGetValue(m_camera, out m_baseCamera);

        if (m_baseCamera == null)
        {
            Debug.LogError("[AmplifyMotion] Failed setting up Base Camera. Please contact [email protected]");
            enabled = false;
            return;
        }

        if (m_currentPostProcess != null)
        {
            m_currentPostProcess.enabled = true;
        }

        m_qualityLevel = QualityLevel;
    }
Example #2
0
        internal override void RenderVectors(Camera camera, float scale, AmplifyMotion.Quality quality)
        {
            Profiler.BeginSample("Particle.Render");

            if (m_initialized && !m_error && m_renderer.isVisible)
            {
                bool mask = (m_owner.Instance.CullingMask & (1 << m_obj.gameObject.layer)) != 0;
                if (!mask || (mask && m_moved))
                {
                    const float rcp255   = 1 / 255.0f;
                    int         objectId = mask ? m_owner.Instance.GenerateObjectId(m_obj.gameObject) : 255;

                    Shader.SetGlobalFloat("_AM_OBJECT_ID", objectId * rcp255);
                    Shader.SetGlobalFloat("_AM_MOTION_SCALE", mask ? scale : 0);

                    int qualityPass = (quality == AmplifyMotion.Quality.Mobile) ? 0 : 2;

                    for (int i = 0; i < m_sharedMaterials.Length; i++)
                    {
                        MaterialDesc matDesc = m_sharedMaterials[i];
                        int          pass    = qualityPass + (matDesc.coverage ? 1 : 0);

                        if (matDesc.coverage)
                        {
                            m_owner.Instance.SolidVectorsMaterial.mainTexture = matDesc.material.mainTexture;
                            if (matDesc.cutoff)
                            {
                                m_owner.Instance.SolidVectorsMaterial.SetFloat("_Cutoff", matDesc.material.GetFloat("_Cutoff"));
                            }
                        }

                        var enumerator = m_particleDict.GetEnumerator();
                        while (enumerator.MoveNext())
                        {
                            KeyValuePair <uint, Particle> pair = enumerator.Current;

                            Matrix4x4 prevModelViewProj = m_owner.PrevViewProjMatrixRT * pair.Value.prevLocalToWorld;
                            Shader.SetGlobalMatrix("_AM_MATRIX_PREV_MVP", prevModelViewProj);

                            if (m_owner.Instance.SolidVectorsMaterial.SetPass(pass))
                            {
                                Graphics.DrawMeshNow(m_mesh, pair.Value.currLocalToWorld, i);
                            }
                        }
                    }
                }
            }

            Profiler.EndSample();
        }
    void OnPostRender()
    {
        bool qualityChanged = (QualityLevel != m_qualityLevel);

        if (qualityChanged)
        {
            CreateMaterials();
            m_qualityLevel = QualityLevel;
        }
        UpdateRenderTextures(qualityChanged);

        RenderBuffer prevColor = Graphics.activeColorBuffer;
        RenderBuffer prevDepth = Graphics.activeDepthBuffer;

        bool cameraMotion = (CameraMotionMult > float.Epsilon);

        m_motionRT.DiscardContents();
        Graphics.SetRenderTarget(m_motionRT);
        GL.Clear(true, !cameraMotion || m_starting, Color.black);

        Shader.SetGlobalFloat("_EFLOW_MIN_VELOCITY", MinVelocity);
        Shader.SetGlobalFloat("_EFLOW_MAX_VELOCITY", MaxVelocity);
        Shader.SetGlobalFloat("_EFLOW_RCP_TOTAL_VELOCITY", 1.0f / (MaxVelocity - MinVelocity));

        float rcpDepthThreshold = (DepthThreshold > float.Epsilon) ? 1.0f / DepthThreshold : float.MaxValue;

        Shader.SetGlobalVector("_EFLOW_DEPTH_THRESHOLD", new Vector2(DepthThreshold, rcpDepthThreshold));

        m_motionScaleNorm      = (m_deltaTime >= float.Epsilon) ? MotionScale * (1.0f / m_deltaTime) : 0;
        m_fixedMotionScaleNorm = (m_fixedDeltaTime >= float.Epsilon) ? MotionScale * (1.0f / m_fixedDeltaTime) : 0;

        float objectScale      = !m_starting ? m_motionScaleNorm : 0;
        float objectFixedScale = !m_starting ? m_fixedMotionScaleNorm : 0;

        if (cameraMotion)
        {
            float cameraMotionScaleNorm = (m_deltaTime >= float.Epsilon) ? MotionScale * CameraMotionMult * (1.0f / m_deltaTime) : 0;
            float cameraScale           = !m_starting ? cameraMotionScaleNorm : 0;

            RenderReprojectionVectors(m_motionRT, cameraScale);
        }

        ResetObjectId();

        m_baseCamera.RenderVectors(objectScale, objectFixedScale, QualityLevel);

        m_starting = false;

        Graphics.SetRenderTarget(prevColor, prevDepth);
    }
    public void RenderVectors(CommandBuffer renderCB, float scale, float fixedScale, AmplifyMotion.Quality quality)
#endif
    {
        if (!m_initialized)
        {
            Initialize();
        }

        // For some reason Unity's own values weren't working correctly on Windows/OpenGL
        float   near = m_camera.nearClipPlane;
        float   far  = m_camera.farClipPlane;
        Vector4 zparam;

        if (AmplifyMotionEffectBase.IsD3D)
        {
            zparam.x = 1.0f - far / near;
            zparam.y = far / near;
        }
        else
        {
            // OpenGL
            zparam.x = (1.0f - far / near) / 2.0f;
            zparam.y = (1.0f + far / near) / 2.0f;
        }

        zparam.z = zparam.x / far;
        zparam.w = zparam.y / far;

        Shader.SetGlobalVector("_AM_ZBUFFER_PARAMS", zparam);

        if (m_affectedObjectsChanged)
        {
            UpdateAffectedObjects();
        }

        for (int i = 0; i < m_affectedObjects.Length; i++)
        {
            // don't render objects excluded via camera culling mask
            if ((m_camera.cullingMask & (1 << m_affectedObjects[i].gameObject.layer)) != 0)
            {
                        #if UNITY_4
                m_affectedObjects[i].OnRenderVectors(m_camera, m_affectedObjects[i].FixedStep ? fixedScale : scale, quality);
                        #else
                m_affectedObjects[i].OnRenderVectors(m_camera, renderCB, m_affectedObjects[i].FixedStep ? fixedScale : scale, quality);
                        #endif
            }
        }
    }
Example #5
0
    void OnEnable()
    {
        m_camera = GetComponent <Camera>();

        if (!CheckSupport())
        {
            enabled = false;
            return;
        }

        InitializeThreadPool();

        m_starting = true;

        if (!CreateMaterials())
        {
            Debug.LogError("[AmplifyMotion] Failed loading or compiling necessary shaders. Please try reinstalling Amplify Motion or contact [email protected]");
            enabled = false;
            return;
        }

        if (AutoRegisterObjs)
        {
            UpdateActiveObjects();
        }

        InitializeCameras();
        InitializeCommandBuffers();

        UpdateRenderTextures(true);

        m_linkedCameras.TryGetValue(m_camera, out m_baseCamera);

        if (m_baseCamera == null)
        {
            Debug.LogError("[AmplifyMotion] Failed setting up Base Camera. Please contact [email protected]");
            enabled = false;
            return;
        }
        if (m_currentPostProcess != null)
        {
            m_currentPostProcess.enabled = true;
        }

        m_qualityLevel = QualityLevel;
    }
Example #6
0
    void OnEnable()
    {
        if (!CheckSupport())
        {
            enabled = false;
            return;
        }

        if (workerThreads <= 0)
        {
            workerThreads = Mathf.Max(Environment.ProcessorCount / 2, 1);               // half of CPU threads; non-busy idle
        }
        m_workerThreadPool = new AmplifyMotion.WorkerThreadPool();
        m_workerThreadPool.InitializeAsyncUpdateThreads(workerThreads);

        m_starting = true;

        CreateMaterials();

        if (AutoRegisterObjs)
        {
            UpdateActiveObjects();
        }

        InitializeCameras();

        UpdateRenderTextures();

        m_linkedCameras.TryGetValue(this.GetComponent <Camera>(), out m_baseCamera);

        if (m_baseCamera == null)
        {
            Debug.LogError("[AmplifyMotion] Failed miserably during initialization. Disabling.");
            enabled = false;
            return;
        }

        if (m_currentPostProcess != null)
        {
            m_currentPostProcess.enabled = true;
        }

        m_qualityLevel = QualityLevel;
    }
Example #7
0
    void UpdateRenderTextures()
    {
        Camera camera = GetComponent <Camera>();

        int screenWidth  = Mathf.FloorToInt(camera.pixelWidth + 0.5f);
        int screenHeight = Mathf.FloorToInt(camera.pixelHeight + 0.5f);

        if (QualityLevel == AmplifyMotion.Quality.Mobile)
        {
            screenWidth  /= 2;
            screenHeight /= 2;
        }

        if (m_width != screenWidth || m_height != screenHeight || QualityLevel != m_qualityLevel)
        {
            m_qualityLevel = QualityLevel;

            m_width  = screenWidth;
            m_height = screenHeight;

            DestroyRenderTextures();
        }

        RenderTextureFormat    auxRGB = RenderTextureFormat.ARGB32;
        RenderTextureReadWrite auxRW  = RenderTextureReadWrite.Linear;
        RenderTextureFormat    colRGB = RenderTextureFormat.ARGB32;
        RenderTextureReadWrite colRW  = RenderTextureReadWrite.Default;

        SafeCreateRenderTexture(ref m_motionRT, "Motion", 24, auxRGB, auxRW, FilterMode.Point);
        SafeCreateRenderTexture(ref m_combinedRT, "Combined", 0, colRGB, colRW, FilterMode.Point);
        if (QualityLevel == AmplifyMotion.Quality.Mobile)
        {
            SafeCreateRenderTexture(ref m_blurRT, "Blur", 0, colRGB, colRW, FilterMode.Bilinear);
        }

        if (m_dummyTex == null)
        {
            m_dummyTex           = new Texture2D(4, 4, TextureFormat.ARGB32, false, true);
            m_dummyTex.wrapMode  = TextureWrapMode.Clamp;
            m_dummyTex.hideFlags = HideFlags.DontSave;
        }
    }
Example #8
0
        internal override void RenderVectors(Camera camera, float scale, AmplifyMotion.Quality quality)
        {
            Profiler.BeginSample("Skinned.Render");

            if (m_initialized && !m_error && m_renderer.isVisible)
            {
                WaitForAsyncUpdate();

                m_clonedMesh.vertices = m_currVertices;
                m_clonedMesh.normals  = m_prevVertices;

                const float rcp255   = 1 / 255.0f;
                int         objectId = m_mask ? m_owner.Instance.GenerateObjectId(m_obj.gameObject) : 255;

                Shader.SetGlobalFloat("_EFLOW_OBJECT_ID", objectId * rcp255);
                Shader.SetGlobalFloat("_EFLOW_MOTION_SCALE", m_mask ? scale : 0);

                int qualityPass = (quality == AmplifyMotion.Quality.Mobile) ? 0 : 2;

                for (int i = 0; i < m_sharedMaterials.Length; i++)
                {
                    MaterialDesc matDesc = m_sharedMaterials[i];
                    int          pass    = qualityPass + (matDesc.coverage ? 1 : 0);

                    if (matDesc.coverage)
                    {
                        m_owner.Instance.SkinnedVectorsMaterial.mainTexture = matDesc.material.mainTexture;
                        if (matDesc.cutoff)
                        {
                            m_owner.Instance.SkinnedVectorsMaterial.SetFloat("_Cutoff", matDesc.material.GetFloat("_Cutoff"));
                        }
                    }

                    if (m_owner.Instance.SkinnedVectorsMaterial.SetPass(pass))
                    {
                        Graphics.DrawMeshNow(m_clonedMesh, m_obj.transform.localToWorldMatrix, i);
                    }
                }
            }

            Profiler.EndSample();
        }
Example #9
0
    void OnEnable()
    {
        if (!CheckSupport())
        {
            enabled = false;
            return;
        }

        if (workerThreads <= 0)
        {
            workerThreads = Environment.ProcessorCount;
        }

        m_workerThreadPool = new AmplifyMotion.WorkerThreadPool();
        m_workerThreadPool.InitializeAsyncUpdateThreads(workerThreads);

        m_starting = true;

        CreateMaterials();

        if (AutoRegisterObjs)
        {
            UpdateActiveObjects();
        }

        InitializeCameras();

        UpdateRenderTextures();

        m_linkedCameras.TryGetValue(this.GetComponent <Camera>(), out m_baseCamera);

        if (m_currentPostProcess != null)
        {
            m_currentPostProcess.enabled = true;
        }

        m_qualityLevel = QualityLevel;
    }
 public void RenderVectors(float scale, float fixedScale, AmplifyMotion.Quality quality)
Example #11
0
        internal override void RenderVectors(Camera camera, CommandBuffer renderCB, float scale, AmplifyMotion.Quality quality)
        {
            if (m_initialized && !m_error && m_renderer.isVisible)
            {
                Profiler.BeginSample("Skinned.Update");

                if (!m_useFallback)
                {
                    if (!m_useGPU)
                    {
                        WaitForAsyncUpdate();
                    }
                }

                Profiler.EndSample();

                Profiler.BeginSample("Skinned.Render");
                if (!m_useGPU)
                {
                    if (!m_useFallback)
                    {
                        m_clonedMesh.vertices = m_currVertices;
                    }
                    m_clonedMesh.normals = m_prevVertices;
                }

                const float rcp255   = 1 / 255.0f;
                bool        mask     = (m_owner.Instance.CullingMask & (1 << m_obj.gameObject.layer)) != 0;
                int         objectId = mask ? m_owner.Instance.GenerateObjectId(m_obj.gameObject) : 255;

                Matrix4x4 prevModelViewProj;
                if (m_obj.FixedStep)
                {
                    prevModelViewProj = m_owner.PrevViewProjMatrixRT * m_currLocalToWorld;
                }
                else
                {
                    prevModelViewProj = m_owner.PrevViewProjMatrixRT * m_prevLocalToWorld;
                }

                renderCB.SetGlobalMatrix("_AM_MATRIX_PREV_MVP", prevModelViewProj);
                renderCB.SetGlobalFloat("_AM_OBJECT_ID", objectId * rcp255);
                renderCB.SetGlobalFloat("_AM_MOTION_SCALE", mask ? scale : 0);

                if (m_useGPU)
                {
                        #if !UNITY_4
                    Vector4 vertexTexelSize = new Vector4(1.0f / m_gpuVertexTexWidth, 1.0f / m_gpuVertexTexHeight, m_gpuVertexTexWidth, m_gpuVertexTexHeight);

                    renderCB.SetGlobalVector("_AM_VERTEX_TEXEL_SIZE", vertexTexelSize);
                    renderCB.SetGlobalVector("_AM_VERTEX_TEXEL_HALFSIZE", vertexTexelSize * 0.5f);

                    renderCB.SetGlobalTexture("_AM_PREV_VERTEX_TEX", m_gpuPrevVertices);
                    renderCB.SetGlobalTexture("_AM_CURR_VERTEX_TEX", m_gpuCurrVertices);
                        #endif
                }

                int hardwarePass = m_useGPU ? 4 : 0;
                int qualityPass  = (quality == AmplifyMotion.Quality.Mobile) ? 0 : 2;
                int basePass     = hardwarePass + qualityPass;

                for (int i = 0; i < m_sharedMaterials.Length; i++)
                {
                    MaterialDesc matDesc = m_sharedMaterials[i];
                    int          pass    = basePass + (matDesc.coverage ? 1 : 0);

                    if (matDesc.coverage)
                    {
                        Texture mainTex = matDesc.material.mainTexture;
                        if (mainTex != null)
                        {
                            matDesc.propertyBlock.SetTexture("_MainTex", mainTex);
                        }
                        if (matDesc.cutoff)
                        {
                            matDesc.propertyBlock.SetFloat("_Cutoff", matDesc.material.GetFloat("_Cutoff"));
                        }
                    }

                    renderCB.DrawMesh(m_clonedMesh, m_currLocalToWorld, m_owner.Instance.SkinnedVectorsMaterial, i, pass, matDesc.propertyBlock);
                }

                Profiler.EndSample();
            }
        }
Example #12
0
        internal override void RenderVectors(Camera camera, CommandBuffer renderCB, float scale, AmplifyMotion.Quality quality)
        {
            if (m_initialized && !m_error && m_meshRenderer.isVisible)
            {
                Profiler.BeginSample("Solid.Render");

                bool mask = (m_owner.Instance.CullingMask & (1 << m_obj.gameObject.layer)) != 0;
                if (!mask || (mask && m_moved))
                {
                    const float rcp255   = 1 / 255.0f;
                    int         objectId = mask ? m_owner.Instance.GenerateObjectId(m_obj.gameObject) : 255;

                    float cameraMotionScale = mask ? m_owner.Instance.CameraMotionMult * scale : 0;
                    float objectMotionScale = mask ? m_owner.Instance.ObjectMotionMult * scale : 0;

                    renderCB.SetGlobalMatrix("_AM_MATRIX_PREV_M", ( Matrix4x4 )m_prevLocalToWorld);
                    renderCB.SetGlobalMatrix("_AM_MATRIX_CURR_M", ( Matrix4x4 )m_currLocalToWorld);
                    renderCB.SetGlobalVector("_AM_MOTION_PARAMS", new Vector4(cameraMotionScale, objectMotionScale, objectId * rcp255, 0));

                    int qualityPass = (quality == AmplifyMotion.Quality.Mobile) ? 0 : 2;

                    for (int i = 0; i < m_sharedMaterials.Length; i++)
                    {
                        MaterialDesc matDesc = m_sharedMaterials[i];
                        int          pass    = qualityPass + (matDesc.coverage ? 1 : 0);

                        if (matDesc.coverage)
                        {
                            Texture mainTex = matDesc.material.mainTexture;
                            if (mainTex != null)
                            {
                                matDesc.propertyBlock.SetTexture("_MainTex", mainTex);
                            }
                            if (matDesc.cutoff)
                            {
                                matDesc.propertyBlock.SetFloat("_Cutoff", matDesc.material.GetFloat("_Cutoff"));
                            }
                        }

                        renderCB.DrawMesh(m_mesh, m_transform.localToWorldMatrix, m_owner.Instance.SolidVectorsMaterial, i, pass, matDesc.propertyBlock);
                    }
                }

                Profiler.EndSample();
            }
        }
        internal override void RenderVectors(Camera camera, float scale, AmplifyMotion.Quality quality)
        {
            Profiler.BeginSample("Cloth.Render");

            if (m_initialized && !m_error && m_renderer.isVisible)
            {
                const float rcp255   = 1 / 255.0f;
                bool        mask     = (m_owner.Instance.CullingMask & (1 << m_obj.gameObject.layer)) != 0;
                int         objectId = mask ? m_owner.Instance.GenerateObjectId(m_obj.gameObject) : 255;

                Vector3[] clothVertices = m_cloth.vertices;
                for (int i = 0; i < m_targetVertexCount; i++)
                {
                    m_currVertices[i] = clothVertices[m_targetRemap[i]];
                }

                if (m_starting || !m_wasVisible)
                {
                    Array.Copy(m_currVertices, m_prevVertices, m_targetVertexCount);
                }

                m_clonedMesh.vertices = m_currVertices;
                m_clonedMesh.normals  = m_prevVertices;

                Matrix4x4 prevModelViewProj;
                if (m_obj.FixedStep)
                {
                    prevModelViewProj = m_owner.PrevViewProjMatrixRT * m_currLocalToWorld;
                }
                else
                {
                    prevModelViewProj = m_owner.PrevViewProjMatrixRT * m_prevLocalToWorld;
                }

                Shader.SetGlobalMatrix("_EFLOW_MATRIX_PREV_MVP", prevModelViewProj);
                Shader.SetGlobalFloat("_EFLOW_OBJECT_ID", objectId * rcp255);
                Shader.SetGlobalFloat("_EFLOW_MOTION_SCALE", mask ? scale : 0);

                int qualityPass = (quality == AmplifyMotion.Quality.Mobile) ? 0 : 2;

                for (int i = 0; i < m_sharedMaterials.Length; i++)
                {
                    MaterialDesc matDesc = m_sharedMaterials[i];
                    int          pass    = qualityPass + (matDesc.coverage ? 1 : 0);

                    if (matDesc.coverage)
                    {
                        m_owner.Instance.ClothVectorsMaterial.mainTexture = matDesc.material.mainTexture;
                        if (matDesc.cutoff)
                        {
                            m_owner.Instance.ClothVectorsMaterial.SetFloat("_Cutoff", matDesc.material.GetFloat("_Cutoff"));
                        }
                    }

                    if (m_owner.Instance.ClothVectorsMaterial.SetPass(pass))
                    {
                                #if UNITY_4
                        Graphics.DrawMeshNow(m_clonedMesh, Matrix4x4.identity, i);
                                #else
                        Graphics.DrawMeshNow(m_clonedMesh, Matrix4x4.TRS(m_obj.transform.position, m_obj.transform.rotation, Vector3.one), i);
                                #endif
                    }
                }
            }

            Profiler.EndSample();
        }
Example #14
0
    void OnPostRender()
    {
        bool qualityChanged = (QualityLevel != m_qualityLevel);

        m_qualityLevel = QualityLevel;

        UpdateRenderTextures(qualityChanged);

        ResetObjectId();

        bool cameraMotion = (CameraMotionMult > float.Epsilon);
        bool clearColor   = !cameraMotion || m_starting;

        float rcpDepthThreshold = (DepthThreshold > float.Epsilon) ? 1.0f / DepthThreshold : float.MaxValue;

        m_motionScaleNorm      = (m_deltaTime >= float.Epsilon) ? MotionScale * (1.0f / m_deltaTime) : 0;
        m_fixedMotionScaleNorm = (m_fixedDeltaTime >= float.Epsilon) ? MotionScale * (1.0f / m_fixedDeltaTime) : 0;

        float objectScale      = !m_starting ? m_motionScaleNorm : 0;
        float objectFixedScale = !m_starting ? m_fixedMotionScaleNorm : 0;

        Shader.SetGlobalFloat("_AM_MIN_VELOCITY", MinVelocity);
        Shader.SetGlobalFloat("_AM_MAX_VELOCITY", MaxVelocity);
        Shader.SetGlobalFloat("_AM_RCP_TOTAL_VELOCITY", 1.0f / (MaxVelocity - MinVelocity));
        Shader.SetGlobalVector("_AM_DEPTH_THRESHOLD", new Vector2(DepthThreshold, rcpDepthThreshold));

        // pre-render base camera
        m_motionRT.DiscardContents();
        m_baseCamera.PreRenderVectors(m_motionRT, clearColor, rcpDepthThreshold);

        // pre-render overlay cameras
        for (int i = 0; i < m_linkedCameraValues.Length; i++)
        {
            AmplifyMotionCamera cam = m_linkedCameraValues[i];
            if (cam != null && cam.Overlay && cam.isActiveAndEnabled)
            {
                cam.PreRenderVectors(m_motionRT, clearColor, rcpDepthThreshold);
                cam.RenderVectors(objectScale, objectFixedScale, QualityLevel);
            }
        }

        if (cameraMotion)
        {
            float cameraMotionScaleNorm = (m_deltaTime >= float.Epsilon) ? MotionScale * CameraMotionMult * (1.0f / m_deltaTime) : 0;
            float cameraScale           = !m_starting ? cameraMotionScaleNorm : 0;

            m_motionRT.DiscardContents();
            m_baseCamera.RenderReprojectionVectors(m_motionRT, cameraScale);
        }

        // render base camera
        m_baseCamera.RenderVectors(objectScale, objectFixedScale, QualityLevel);

        // render overlay cameras
        for (int i = 0; i < m_linkedCameraValues.Length; i++)
        {
            AmplifyMotionCamera cam = m_linkedCameraValues[i];
            if (cam != null && cam.Overlay && cam.isActiveAndEnabled)
            {
                cam.RenderVectors(objectScale, objectFixedScale, QualityLevel);
            }
        }

        m_starting = false;
    }
Example #15
0
 internal void OnRenderVectors(Camera camera, CommandBuffer renderCB, float scale, AmplifyMotion.Quality quality)
 {
     AmplifyMotion.MotionState state;
     if (m_states.TryGetValue(camera, out state))
     {
         if (!state.Error)
         {
             state.RenderVectors(camera, renderCB, scale, quality);
             if (m_resetAtFrame > 0 && Time.frameCount >= m_resetAtFrame)
             {
                 m_resetAtFrame = -1;
             }
         }
     }
 }
Example #16
0
    internal void OnRenderVectors(Camera camera, CommandBuffer renderCB, float scale, AmplifyMotion.Quality quality)
#endif
    {
        AmplifyMotion.MotionState state;
        if (m_states.TryGetValue(camera, out state))
        {
            if (!state.Error)
            {
                        #if UNITY_4
                state.RenderVectors(camera, scale, quality);
                        #else
                state.RenderVectors(camera, renderCB, scale, quality);
                        #endif
            }
        }
    }
Example #17
0
    void OnPostRender()
    {
        bool qualityChanged = (QualityLevel != m_qualityLevel);

        if (qualityChanged)
        {
            CreateMaterials();
            m_qualityLevel = QualityLevel;
        }
        UpdateRenderTextures(qualityChanged);

        ResetObjectId();

        #if UNITY_4
        RenderBuffer prevColor = Graphics.activeColorBuffer;
        RenderBuffer prevDepth = Graphics.activeDepthBuffer;
        #endif
        bool cameraMotion = (CameraMotionMult > float.Epsilon);
        bool clearColor   = !cameraMotion || m_starting;

        float rcpDepthThreshold = (DepthThreshold > float.Epsilon) ? 1.0f / DepthThreshold : float.MaxValue;

        m_motionScaleNorm      = (m_deltaTime >= float.Epsilon) ? MotionScale * (1.0f / m_deltaTime) : 0;
        m_fixedMotionScaleNorm = (m_fixedDeltaTime >= float.Epsilon) ? MotionScale * (1.0f / m_fixedDeltaTime) : 0;

        float objectScale      = !m_starting ? m_motionScaleNorm : 0;
        float objectFixedScale = !m_starting ? m_fixedMotionScaleNorm : 0;

        DiscardContents(m_motionRT);

        #if UNITY_4
        Graphics.SetRenderTarget(m_motionRT);
        GL.Clear(true, clearColor, Color.black);

        Shader.SetGlobalFloat("_AM_MIN_VELOCITY", MinVelocity);
        Shader.SetGlobalFloat("_AM_MAX_VELOCITY", MaxVelocity);
        Shader.SetGlobalFloat("_AM_RCP_TOTAL_VELOCITY", 1.0f / (MaxVelocity - MinVelocity));
        Shader.SetGlobalVector("_AM_DEPTH_THRESHOLD", new Vector2(DepthThreshold, rcpDepthThreshold));
        #else
        m_updateCB.Clear();
        m_renderCB.Clear();

        m_renderCB.SetGlobalFloat("_AM_MIN_VELOCITY", MinVelocity);
        m_renderCB.SetGlobalFloat("_AM_MAX_VELOCITY", MaxVelocity);
        m_renderCB.SetGlobalFloat("_AM_RCP_TOTAL_VELOCITY", 1.0f / (MaxVelocity - MinVelocity));
        m_renderCB.SetGlobalVector("_AM_DEPTH_THRESHOLD", new Vector2(DepthThreshold, rcpDepthThreshold));

        m_renderCB.SetRenderTarget(m_motionRT);
        m_renderCB.ClearRenderTarget(true, clearColor, Color.black);
        #endif

        if (cameraMotion)
        {
            float cameraMotionScaleNorm = (m_deltaTime >= float.Epsilon) ? MotionScale * CameraMotionMult * (1.0f / m_deltaTime) : 0;
            float cameraScale           = !m_starting ? cameraMotionScaleNorm : 0;

                #if UNITY_4
            RenderReprojectionVectors(m_motionRT, cameraScale);
                #else
            RenderReprojectionVectors(m_renderCB, m_motionRT, cameraScale);
                #endif
        }

        #if UNITY_4
        m_baseCamera.RenderVectors(objectScale, objectFixedScale, QualityLevel);
        #else
        // base camera
        m_baseCamera.RenderVectors(m_renderCB, objectScale, objectFixedScale, QualityLevel);

        // overlay cameras
        for (int i = 0; i < m_linkedCameraValues.Length; i++)
        {
            AmplifyMotionCamera cam = m_linkedCameraValues[i];
            if (cam != null && cam.Overlay && cam.isActiveAndEnabled)
            {
                m_linkedCameraValues[i].RenderVectors(m_renderCB, objectScale, objectFixedScale, QualityLevel);
            }
        }
        #endif

        m_starting = false;

        #if UNITY_4
        Graphics.SetRenderTarget(prevColor, prevDepth);
        #endif
    }
	void OnEnable()
	{
		m_camera = GetComponent<Camera>();

		if ( !CheckSupport() )
		{
			enabled = false;
			return;
		}

		if ( WorkerThreads <= 0 )
			WorkerThreads = Mathf.Max( Environment.ProcessorCount / 2, 1 ); // half of CPU threads; non-busy idle

		m_workerThreadPool = new AmplifyMotion.WorkerThreadPool();
		m_workerThreadPool.InitializeAsyncUpdateThreads( WorkerThreads, SystemThreadPool );

		m_starting = true;

		if ( !CreateMaterials() )
		{
			Debug.LogError( "[AmplifyMotion] Failed loading or compiling necessary shaders. Please try reinstalling Amplify Motion or contact [email protected]" );
			enabled = false;
			return;
		}

		if ( AutoRegisterObjs )
			UpdateActiveObjects();

		InitializeCameras();

		UpdateRenderTextures( true );

		m_linkedCameras.TryGetValue( m_camera, out m_baseCamera );

		if ( m_baseCamera == null )
		{
			Debug.LogError( "[AmplifyMotion] Failed setting up Base Camera. Please contact [email protected]" );
			enabled = false;
			return;
		}

		if ( m_currentPostProcess != null )
			m_currentPostProcess.enabled = true;

		m_qualityLevel = QualityLevel;
	}
	void OnPostRender()
	{
		bool qualityChanged = ( QualityLevel != m_qualityLevel );
		if ( qualityChanged )
		{
			CreateMaterials();
			m_qualityLevel = QualityLevel;
		}
		UpdateRenderTextures( qualityChanged );

		RenderBuffer prevColor = Graphics.activeColorBuffer;
		RenderBuffer prevDepth = Graphics.activeDepthBuffer;

		bool cameraMotion = ( CameraMotionMult > float.Epsilon );

		m_motionRT.DiscardContents();
		Graphics.SetRenderTarget( m_motionRT );
		GL.Clear( true, !cameraMotion || m_starting, Color.black );

		Shader.SetGlobalFloat( "_EFLOW_MIN_VELOCITY", MinVelocity );
		Shader.SetGlobalFloat( "_EFLOW_MAX_VELOCITY", MaxVelocity );
		Shader.SetGlobalFloat( "_EFLOW_RCP_TOTAL_VELOCITY", 1.0f / ( MaxVelocity - MinVelocity ) );

		float rcpDepthThreshold = ( DepthThreshold > float.Epsilon ) ? 1.0f / DepthThreshold : float.MaxValue;
		Shader.SetGlobalVector( "_EFLOW_DEPTH_THRESHOLD", new Vector2( DepthThreshold, rcpDepthThreshold ) );

		m_motionScaleNorm = ( m_deltaTime >= float.Epsilon ) ? MotionScale * ( 1.0f / m_deltaTime ) : 0;
		m_fixedMotionScaleNorm = ( m_fixedDeltaTime >= float.Epsilon ) ? MotionScale * ( 1.0f / m_fixedDeltaTime ) : 0;

		float objectScale = !m_starting ? m_motionScaleNorm : 0;
		float objectFixedScale = !m_starting ? m_fixedMotionScaleNorm : 0;

		if ( cameraMotion )
		{
			float cameraMotionScaleNorm = ( m_deltaTime >= float.Epsilon ) ? MotionScale * CameraMotionMult * ( 1.0f / m_deltaTime ) : 0;
			float cameraScale = !m_starting ? cameraMotionScaleNorm : 0;

			RenderReprojectionVectors( m_motionRT, cameraScale );
		}

		ResetObjectId();

		m_baseCamera.RenderVectors( objectScale, objectFixedScale, QualityLevel );

		m_starting = false;

		Graphics.SetRenderTarget( prevColor, prevDepth );
	}
	void OnEnable()
	{
		m_camera = GetComponent<Camera>();

		if ( !CheckSupport() )
		{
			enabled = false;
			return;
		}

		InitializeThreadPool();

		m_starting = true;

		if ( !CreateMaterials() )
		{
			Debug.LogError( "[AmplifyMotion] Failed loading or compiling necessary shaders. Please try reinstalling Amplify Motion or contact [email protected]" );
			enabled = false;
			return;
		}

		if ( AutoRegisterObjs )
			UpdateActiveObjects();

		InitializeCameras();
		InitializeCommandBuffers();

		UpdateRenderTextures( true );

		m_linkedCameras.TryGetValue( m_camera, out m_baseCamera );

		if ( m_baseCamera == null )
		{
			Debug.LogError( "[AmplifyMotion] Failed setting up Base Camera. Please contact [email protected]" );
			enabled = false;
			return;
		}
		if ( m_currentPostProcess != null )
			m_currentPostProcess.enabled = true;

		m_qualityLevel = QualityLevel;
	}
Example #21
0
        internal override void RenderVectors(Camera camera, CommandBuffer renderCB, float scale, AmplifyMotion.Quality quality)
        {
            if (m_initialized && !m_error && m_meshRenderer.isVisible)
            {
                Profiler.BeginSample("Solid.Render");

                bool mask = (m_owner.Instance.CullingMask & (1 << m_obj.gameObject.layer)) != 0;
                if (!mask || (mask && m_moved))
                {
                    const float rcp255   = 1 / 255.0f;
                    int         objectId = mask ? m_owner.Instance.GenerateObjectId(m_obj.gameObject) : 255;

                    Matrix4x4 prevModelViewProj;
                    if (m_obj.FixedStep)
                    {
                        prevModelViewProj = m_owner.PrevViewProjMatrixRT * ( Matrix4x4 )m_currLocalToWorld;
                    }
                    else
                    {
                        prevModelViewProj = m_owner.PrevViewProjMatrixRT * ( Matrix4x4 )m_prevLocalToWorld;
                    }

                    renderCB.SetGlobalMatrix("_AM_MATRIX_PREV_MVP", prevModelViewProj);
                    renderCB.SetGlobalFloat("_AM_OBJECT_ID", objectId * rcp255);
                    renderCB.SetGlobalFloat("_AM_MOTION_SCALE", mask ? scale : 0);

                    // TODO: cache property blocks

                    int qualityPass = (quality == AmplifyMotion.Quality.Mobile) ? 0 : 2;

                    for (int i = 0; i < m_sharedMaterials.Length; i++)
                    {
                        MaterialDesc matDesc = m_sharedMaterials[i];
                        int          pass    = qualityPass + (matDesc.coverage ? 1 : 0);

                        if (matDesc.coverage)
                        {
                            Texture mainTex = matDesc.material.mainTexture;
                            if (mainTex != null)
                            {
                                matDesc.propertyBlock.SetTexture("_MainTex", mainTex);
                            }
                            if (matDesc.cutoff)
                            {
                                matDesc.propertyBlock.SetFloat("_Cutoff", matDesc.material.GetFloat("_Cutoff"));
                            }
                        }

                        renderCB.DrawMesh(m_mesh, m_transform.localToWorldMatrix, m_owner.Instance.SolidVectorsMaterial, i, pass, matDesc.propertyBlock);
                    }
                }

                Profiler.EndSample();
            }
        }
Example #22
0
 internal virtual void RenderVectors(Camera camera, float scale, AmplifyMotion.Quality quality)
 {
 }
Example #23
0
 internal virtual void RenderVectors(Camera camera, CommandBuffer renderCB, float scale, AmplifyMotion.Quality quality)
 {
 }
Example #24
0
        internal override void RenderVectors(Camera camera, CommandBuffer renderCB, float scale, AmplifyMotion.Quality quality)
        {
            if (m_initialized && !m_error && m_renderer.isVisible)
            {
                Profiler.BeginSample("Cloth.Render");

                const float rcp255   = 1 / 255.0f;
                bool        mask     = (m_owner.Instance.CullingMask & (1 << m_obj.gameObject.layer)) != 0;
                int         objectId = mask ? m_owner.Instance.GenerateObjectId(m_obj.gameObject) : 255;

                Vector3[] clothVertices = m_cloth.vertices;
                for (int i = 0; i < m_targetVertexCount; i++)
                {
                    m_currVertices[i] = clothVertices[m_targetRemap[i]];
                }

                if (m_starting || !m_wasVisible)
                {
                    Array.Copy(m_currVertices, m_prevVertices, m_targetVertexCount);
                }

                m_clonedMesh.vertices = m_currVertices;
                m_clonedMesh.normals  = m_prevVertices;

                Matrix4x4 prevModelViewProj;
                if (m_obj.FixedStep)
                {
                    prevModelViewProj = m_owner.PrevViewProjMatrixRT * ( Matrix4x4 )m_currLocalToWorld;
                }
                else
                {
                    prevModelViewProj = m_owner.PrevViewProjMatrixRT * ( Matrix4x4 )m_prevLocalToWorld;
                }

                renderCB.SetGlobalMatrix("_AM_MATRIX_PREV_MVP", prevModelViewProj);
                renderCB.SetGlobalFloat("_AM_OBJECT_ID", objectId * rcp255);
                renderCB.SetGlobalFloat("_AM_MOTION_SCALE", mask ? scale : 0);

                int qualityPass = (quality == AmplifyMotion.Quality.Mobile) ? 0 : 2;

                for (int i = 0; i < m_sharedMaterials.Length; i++)
                {
                    MaterialDesc matDesc = m_sharedMaterials[i];
                    int          pass    = qualityPass + (matDesc.coverage ? 1 : 0);

                    if (matDesc.coverage)
                    {
                        Texture mainTex = matDesc.material.mainTexture;
                        if (mainTex != null)
                        {
                            matDesc.propertyBlock.SetTexture("_MainTex", mainTex);
                        }
                        if (matDesc.cutoff)
                        {
                            matDesc.propertyBlock.SetFloat("_Cutoff", matDesc.material.GetFloat("_Cutoff"));
                        }
                    }

                    renderCB.DrawMesh(m_clonedMesh, m_currLocalToWorld, m_owner.Instance.ClothVectorsMaterial, i, pass, matDesc.propertyBlock);
                }

                Profiler.EndSample();
            }
        }
	void OnPostRender()
	{
		bool qualityChanged = ( QualityLevel != m_qualityLevel );
		if ( qualityChanged )
		{
			CreateMaterials();
			m_qualityLevel = QualityLevel;
		}
		UpdateRenderTextures( qualityChanged );

		ResetObjectId();

	#if UNITY_4
		RenderBuffer prevColor = Graphics.activeColorBuffer;
		RenderBuffer prevDepth = Graphics.activeDepthBuffer;
	#endif
		bool cameraMotion = ( CameraMotionMult > float.Epsilon );
		bool clearColor = !cameraMotion || m_starting;

		float rcpDepthThreshold = ( DepthThreshold > float.Epsilon ) ? 1.0f / DepthThreshold : float.MaxValue;

		m_motionScaleNorm = ( m_deltaTime >= float.Epsilon ) ? MotionScale * ( 1.0f / m_deltaTime ) : 0;
		m_fixedMotionScaleNorm = ( m_fixedDeltaTime >= float.Epsilon ) ? MotionScale * ( 1.0f / m_fixedDeltaTime ) : 0;

		float objectScale = !m_starting ? m_motionScaleNorm : 0;
		float objectFixedScale = !m_starting ? m_fixedMotionScaleNorm : 0;

		DiscardContents( m_motionRT );

	#if UNITY_4
		Graphics.SetRenderTarget( m_motionRT );
		GL.Clear( true, clearColor, Color.black );

		Shader.SetGlobalFloat( "_AM_MIN_VELOCITY", MinVelocity );
		Shader.SetGlobalFloat( "_AM_MAX_VELOCITY", MaxVelocity );
		Shader.SetGlobalFloat( "_AM_RCP_TOTAL_VELOCITY", 1.0f / ( MaxVelocity - MinVelocity ) );
		Shader.SetGlobalVector( "_AM_DEPTH_THRESHOLD", new Vector2( DepthThreshold, rcpDepthThreshold ) );
	#else
		m_updateCB.Clear();
		m_renderCB.Clear();

		m_renderCB.SetGlobalFloat( "_AM_MIN_VELOCITY", MinVelocity );
		m_renderCB.SetGlobalFloat( "_AM_MAX_VELOCITY", MaxVelocity );
		m_renderCB.SetGlobalFloat( "_AM_RCP_TOTAL_VELOCITY", 1.0f / ( MaxVelocity - MinVelocity ) );
		m_renderCB.SetGlobalVector( "_AM_DEPTH_THRESHOLD", new Vector2( DepthThreshold, rcpDepthThreshold ) );

		m_renderCB.SetRenderTarget( m_motionRT );
		m_renderCB.ClearRenderTarget( true, clearColor, Color.black );
	#endif

		if ( cameraMotion )
		{
			float cameraMotionScaleNorm = ( m_deltaTime >= float.Epsilon ) ? MotionScale * CameraMotionMult * ( 1.0f / m_deltaTime ) : 0;
			float cameraScale = !m_starting ? cameraMotionScaleNorm : 0;

		#if UNITY_4
			RenderReprojectionVectors( m_motionRT, cameraScale );
		#else
			RenderReprojectionVectors( m_renderCB, m_motionRT, cameraScale );
		#endif
		}

	#if UNITY_4
		m_baseCamera.RenderVectors( objectScale, objectFixedScale, QualityLevel );
	#else
		// base camera
		m_baseCamera.RenderVectors( m_renderCB, objectScale, objectFixedScale, QualityLevel );

		// overlay cameras
		for ( int i = 0; i < m_linkedCameraValues.Length; i++ )
		{
			AmplifyMotionCamera cam = m_linkedCameraValues[ i ];
			if ( cam != null && cam.Overlay && cam.isActiveAndEnabled )
				m_linkedCameraValues[ i ].RenderVectors( m_renderCB, objectScale, objectFixedScale, QualityLevel );
		}
	#endif

		m_starting = false;

	#if UNITY_4
		Graphics.SetRenderTarget( prevColor, prevDepth );
	#endif
	}