.. DO NOT EDIT.
.. THIS FILE WAS AUTOMATICALLY GENERATED BY SPHINX-GALLERY.
.. TO MAKE CHANGES, EDIT THE SOURCE PYTHON FILE:
.. "auto_examples/13_shaders/viz_shader.py"
.. LINE NUMBERS ARE GIVEN BELOW.

.. only:: html

    .. note::
        :class: sphx-glr-download-link-note

        :ref:`Go to the end <sphx_glr_download_auto_examples_13_shaders_viz_shader.py>`
        to download the full example code.

.. rst-class:: sphx-glr-example-title

.. _sphx_glr_auto_examples_13_shaders_viz_shader.py:


=============
Varying Color
=============

This example shows how to use shaders to generate a shaded output. We will
demonstrate how to load polydata then use a custom shader calls to render
a custom shaded model.
First, let's import FURY

.. GENERATED FROM PYTHON SOURCE LINES 12-15

.. code-block:: Python


    import fury


.. GENERATED FROM PYTHON SOURCE LINES 16-17

Let's download  and load the model

.. GENERATED FROM PYTHON SOURCE LINES 17-23

.. code-block:: Python



    fury.data.fetch_viz_models()
    model = fury.data.read_viz_models("utah.obj")



.. GENERATED FROM PYTHON SOURCE LINES 24-27

Let's start by loading the polydata of choice.
For this example we use the standard utah teapot model.
currently supported formats include OBJ, VTK, FIB, PLY, STL and XML

.. GENERATED FROM PYTHON SOURCE LINES 28-35

.. code-block:: Python


    utah = fury.io.load_polydata(model)
    utah = fury.utils.get_polymapper_from_polydata(utah)
    utah = fury.utils.get_actor_from_polymapper(utah)
    mapper = utah.GetMapper()



.. GENERATED FROM PYTHON SOURCE LINES 36-39

To change the default shader we add a shader replacement.
Specify vertex shader using vtkShader.Vertex
Specify fragment shader using vtkShader.Fragment

.. GENERATED FROM PYTHON SOURCE LINES 39-67

.. code-block:: Python

    vertex_shader_code_decl = """
        out vec4 myVertexVC;
        """

    vertex_shader_code_impl = """
        myVertexVC = vertexMC;
        """

    fragment_shader_code_decl = """
        uniform float time;
        varying vec4 myVertexVC;
        """

    fragment_shader_code_impl = """
        vec2 iResolution = vec2(1024,720);
        vec2 uv = myVertexVC.xy/iResolution;
        vec3 col = 0.5 + 0.5 * cos((time/30) + uv.xyx + vec3(0, 2, 4));
        fragOutput0 = vec4(col, fragOutput0.a);
        """

    fury.shaders.shader_to_actor(
        utah, "vertex", impl_code=vertex_shader_code_impl, decl_code=vertex_shader_code_decl
    )
    fury.shaders.shader_to_actor(utah, "fragment", decl_code=fragment_shader_code_decl)
    fury.shaders.shader_to_actor(
        utah, "fragment", impl_code=fragment_shader_code_impl, block="light"
    )


.. GENERATED FROM PYTHON SOURCE LINES 68-69

Let's create a scene.

.. GENERATED FROM PYTHON SOURCE LINES 69-75

.. code-block:: Python


    scene = fury.window.Scene()

    global timer
    timer = 0


.. GENERATED FROM PYTHON SOURCE LINES 76-77

The timer will call this user defined callback every 30 milliseconds.

.. GENERATED FROM PYTHON SOURCE LINES 77-86

.. code-block:: Python



    def timer_callback(obj, event):
        global timer
        timer += 1.0
        showm.render()
        scene.azimuth(5)



.. GENERATED FROM PYTHON SOURCE LINES 87-89

The shader callback will update the color of our utah pot via the update of
the timer variable.

.. GENERATED FROM PYTHON SOURCE LINES 89-102

.. code-block:: Python



    def shader_callback(_caller, _event, calldata=None):
        program = calldata
        global timer
        if program is not None:
            try:
                program.SetUniformf("time", timer)
            except ValueError:
                pass


    fury.shaders.add_shader_callback(utah, shader_callback)

.. GENERATED FROM PYTHON SOURCE LINES 103-104

Let's add a textblock to the scene with a custom message

.. GENERATED FROM PYTHON SOURCE LINES 104-108

.. code-block:: Python


    tb = fury.ui.TextBlock2D()
    tb.message = "Hello Shaders"


.. GENERATED FROM PYTHON SOURCE LINES 109-113

Show Manager

Now that all the elements have been initialised, we add them to the show
manager.

.. GENERATED FROM PYTHON SOURCE LINES 113-128

.. code-block:: Python


    current_size = (1024, 720)
    showm = fury.window.ShowManager(scene=scene, size=current_size, reset_camera=False)


    showm.add_timer_callback(True, 30, timer_callback)

    scene.add(utah)
    scene.add(tb)

    interactive = False
    if interactive:
        showm.start()

    fury.window.record(scene=showm.scene, size=current_size, out_path="viz_shader.png")


.. _sphx_glr_download_auto_examples_13_shaders_viz_shader.py:

.. only:: html

  .. container:: sphx-glr-footer sphx-glr-footer-example

    .. container:: sphx-glr-download sphx-glr-download-jupyter

      :download:`Download Jupyter notebook: viz_shader.ipynb <viz_shader.ipynb>`

    .. container:: sphx-glr-download sphx-glr-download-python

      :download:`Download Python source code: viz_shader.py <viz_shader.py>`

    .. container:: sphx-glr-download sphx-glr-download-zip

      :download:`Download zipped: viz_shader.zip <viz_shader.zip>`


.. only:: html

 .. rst-class:: sphx-glr-signature

    `Gallery generated by Sphinx-Gallery <https://sphinx-gallery.github.io>`_