<html>
  <head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
  </head>
  <body text="#000000" bgcolor="#FFFFFF">
    <p>Hello again, I have took another iteration and we still need your
      help to proceed:<br>
    </p>
    <br>
    <div class="moz-cite-prefix">On 17.5.2017 14:37, Nathan Goldbaum
      wrote:<br>
    </div>
    <blockquote type="cite"
cite="mid:CAJXewO=s8yyWFXfo6OPR4f3esNXb=8m9BwJ02ctJT1t2=xJ54w@mail.gmail.com">
      <div><br>
        <div class="gmail_quote">...
          <div><br>
          </div>
          <div>You will be using a VolumeSource in that case, not a
            MeshSource. There will still be a source to be rendered
            though.</div>
          <div><br>
          </div>
          <blockquote class="gmail_quote" style="margin:0 0 0
            .8ex;border-left:1px #ccc solid;padding-left:1ex">
            <div text="#000000" bgcolor="#FFFFFF">Would be the following
              snippet OK if I implement the MyCustomTF correctly?<br>
              <br>
              import scipy as sp<br>
              import yt<br>
              import yt.visualization.volume_rendering.api as vr_api<br>
              <br>
              trans = sp.rand(20, 40, 40)<br>
              color = sp.rand(20, 40, 40)<br>
              <br>
              ds = yt.load_uniform_grid(dict(color=color, trans=trans),<br>
                            color.shape)<br>
              <br>
              scene = vr_api.Scene()<br>
              <br>
              source = vr_api.VolumeSource(ds.all_data(), ["color",
              "trans"])<br>
              source.log_field = False<br>
              source.transfer_function = MyCustomTF(...)<br>
              scene.add_source(source)<br>
              <br>
              scene.add_camera()<br>
              scene.save('render.png')</div>
          </blockquote>
          <div><br>
          </div>
          <div>In principle yes.</div>
          <div><br>
          </div>
          <blockquote class="gmail_quote" style="margin:0 0 0
            .8ex;border-left:1px #ccc solid;padding-left:1ex">
            <div text="#000000" bgcolor="#FFFFFF"><br>
              <blockquote type="cite">
                <div>
                  <div class="gmail_extra">
                    <div class="gmail_quote">
                      <div>You are right that each source only renders a
                        single field. If you want to render more than
                        one field you will need to create multiple
                        sources.</div>
                      <div> </div>
                      <blockquote class="gmail_quote" style="margin:0px
                        0px 0px 0.8ex;border-left:1px solid
                        rgb(204,204,204);padding-left:1ex">If I am wrong
                        and it is meaningful and possible to construct a
                        source<br>
                        with multiple fields, could you please provide
                        an example?<br>
                      </blockquote>
                      <div><br>
                      </div>
                      <div>Here's an example:</div>
                      <div><br>
                      </div>
                      <div><a
href="https://github.com/yt-project/yt/blob/master/doc/source/cookbook/render_two_fields.py"
                          target="_blank" moz-do-not-send="true">https://github.com/yt-project/yt/blob/master/doc/source/cookbook/render_two_fields.py</a><br>
                      </div>
                      <div><br>
                      </div>
                      <div>That said, this is simply compositing two
                        separate volume renderings together. A bivariate
                        transfer function is a bit more complex than
                        this.</div>
                    </div>
                  </div>
                </div>
              </blockquote>
            </div>
            <div text="#000000" bgcolor="#FFFFFF"> Transfer function is
              a property of a volume source, isn't it? So if one source
              means one field, then how can a transfer function access
              multiple fields? At least PlanckTransferFunction uses
              multiple fields.<br>
            </div>
          </blockquote>
        </div>
      </div>
    </blockquote>
    <blockquote type="cite"
cite="mid:CAJXewO=s8yyWFXfo6OPR4f3esNXb=8m9BwJ02ctJT1t2=xJ54w@mail.gmail.com">
      <div>
        <div class="gmail_quote">
          <div>Good point. You may need to relax that assumption.</div>
        </div>
      </div>
    </blockquote>
    What do you mean by "relaxing that assumption"? Am I wrong when I
    think that the transfer function needs to use multiple fields?<br>
    Regarding the volume source, I have examined the source code
<a class="moz-txt-link-freetext" href="https://github.com/yt-project/yt/blob/master/yt/visualization/volume_rendering/render_source.py#L160">https://github.com/yt-project/yt/blob/master/yt/visualization/volume_rendering/render_source.py#L160</a>
    and although I can pass a dataset with a list of fields, the
    __init__ method completely forgets that there is more than one
    fields involved.<br>
    <br>
    I have tried to fiddle with the ColorTransferFunction by making my
    own CTF and changing all the field IDs in the code from 0 to 1 (see
<a class="moz-txt-link-freetext" href="https://github.com/yt-project/yt/blob/master/yt/visualization/volume_rendering/transfer_functions.py#L393">https://github.com/yt-project/yt/blob/master/yt/visualization/volume_rendering/transfer_functions.py#L393</a>),
    but although I have assigned the CTF to a supposedly two-field
    source, nothing came out (as opposed to the case when field IDs were
    flipped back to 0).<br>
    <br>
    <blockquote type="cite"
cite="mid:CAJXewO=s8yyWFXfo6OPR4f3esNXb=8m9BwJ02ctJT1t2=xJ54w@mail.gmail.com">
      <div>
        <div class="gmail_quote">
          <div text="#000000" bgcolor="#FFFFFF">
            <blockquote type="cite">
              <div>
                <div class="gmail_extra">
                  <div class="gmail_quote">
                    <blockquote class="gmail_quote" style="margin:0px
                      0px 0px 0.8ex;border-left:1px solid
                      rgb(204,204,204);padding-left:1ex"> 2. I have no
                      doubts that transfer functions work, but I was
                      unable to<br>
                      find out how are they involved in the integration
                      process. What I came<br>
                      across were the integration routines and they have
                      mentioned that the<br>
                      transfer function is not used:<br>
                      <a
href="https://github.com/yt-project/yt/blob/master/yt/utilities/lib/ray_integrators.pyx#L235"
                        rel="noreferrer" target="_blank"
                        moz-do-not-send="true">https://github.com/yt-project/yt/blob/master/yt/utilities/lib/ray_integrators.pyx#L235</a><br>
                      . This is really interesting, how is it in
                      reality?<br>
                    </blockquote>
                    <div><br>
                    </div>
                    <div>I believe the low-level routine you want to
                      look at in is yt/utlities/lib/image_samplers.pyx,
                      in particular the VolumeRenderSampler. The
                      PlaneVoxelIntegration class you linked to here is
                      experimental code that is not used elsewhere in
                      yt.</div>
                  </div>
                </div>
              </div>
            </blockquote>
          </div>
          <blockquote class="gmail_quote" style="margin:0 0 0
            .8ex;border-left:1px #ccc solid;padding-left:1ex">
            <div text="#000000" bgcolor="#FFFFFF"> okay, I am happy
              about this as the code was extremely hard to read. This
              one is somehow easier, although the code still doesn't
              reveal much intent and names of variables are difficult to
              understand for an outsider. Anyway, I will proceed and if
              I manage to understand it, I may be able to come up with
              some proposals.</div>
          </blockquote>
          <div><br>
          </div>
          <div>Feel free to ask questions as you have them.</div>
        </div>
      </div>
    </blockquote>
    I see, it is VolumeRenderSampler.sample and ImageSampler.__call__,
    walk_volume etc. There is some very impressive functionality in
    there, but I would have to study that for weeks just to get to some
    level of understanding, which I can't do. So I hope that we will be
    able to achieve this multimodal visualization without understanding
    those masterful, but also quite sophisticated low-level routines.<br>
    <br>
  </body>
</html>