Login  Register

Re: 3D Viewer: Universes synchronization

Posted by Juanjo Vega on Jun 14, 2010; 9:54am
URL: http://imagej.273.s1.nabble.com/3D-Viewer-Universes-synchronization-tp3687928p3687929.html

Hi,

Finally I managed to fix my problem synchronizing universes in a
different thread like:

    public void transformationUpdated(final View view) {
        // Synchronizes both universes in a different thread to avoid
locks.
        new Thread(new Runnable() {

            public void run() {
                synchronizeUniverses(view);
            }
        }).start();
    }

Thanks anyway,

Sincerelly,

Juanjo Vega.


On Fri, 2010-06-11 at 11:54 +0200, Juanjo Vega wrote:

> Hi,
>
> After I got 3D viewer sources, I have spent some time debugging my
> plugin. It hangs when I forward events between two universes, and so far
> I found the point where it hangs.
>
> To get you in context:
>
> The main class implements "UniverseListener" interface (thanks Johannes
> for pointing this out), which has three methods that I implement in the
> following way:
>
>     public void transformationStarted(View view) {
>     }
>
>     public void transformationUpdated(View view) {
>         synchronizeUniverses(view);
>     }
>
>     public void transformationFinished(View view) {
>         synchronizeUniverses(view);
>     }
>
> I register the listener for both universes:
>
> Image3DUniverse universe.addUniverseListener(this);
>
> So, whenever a transformation is made in one of them, the
> "synchronizeUniverses" method will be invoked:
>
>
> private void synchronizeUniverses(View view) {
>         if (!dispatched) {
>             dispatched = true;  // Avoids infinite events forwarding
>
>             if (view == universeVolume.getCanvas().getView()) {
>                 universeVolume.getGlobalTransform(gt);
>                 universeSphere.setGlobalTransform(gt);
>             } else {
>                 universeSphere.getGlobalTransform(gt);
>                 universeVolume.setGlobalTransform(gt);
>             }
>
>             dispatched = false; // Reactivate events.
>         }
>     }
>
> Notice that the "dispatched" variable should avoid infinite events
> forwarding. Unluckily it doesn't work.
>
> There are two universes, so when events come from "universeVolume", it
> gets it's global transform to sets it at "universeSphere" and vice
> versa.
>
> When I drag one of the universes, it locks, but if I remove the
> "transformationUpdated", so only the transform will be updated when
> mouse is released, it works.
>
> Debugging inside 3D_Viewer sources I found that it hangs at
> "frameBehavior.wait()", where it stays locked forever.
>
>     public void waitForNextFrame() {
>         if (win == null) {
>             return;
>         }
>         frameBehavior.postId(WaitForNextFrameBehavior.TRIGGER_ID);
>         synchronized (frameBehavior) {
>             try {
>                 frameBehavior.wait();
>             } catch (Exception e) {
>             }
>         }
>     }
>
> I think it's a problem related to the "synchronized" part, because I
> tried to set the wait for 1 second and then infinite event forwarding
> appeared, but I can't manage how to fix that.
>
> Any help will be welcome, as this is the only remaining issue to finish
> my plugin :)
>
> Sincerelly,
>
> Juanjo Vega.