private void cleanUp() {
    // System.err.println( "VolumeImageViewerPoint dispose()" );
    if (m_kHistogramPoints2D != null) {
      m_pkRenderer.ReleaseResources(m_kHistogramPoints2D);
      m_kHistogramPoints2D.dispose();
      m_kHistogramPoints2D = null;
    }
    if (m_kEntropyPoints2D != null) {
      m_pkRenderer.ReleaseResources(m_kEntropyPoints2D);
      m_kEntropyPoints2D.dispose();
      m_kEntropyPoints2D = null;
    }
    if (m_kImagePointsDual != null) {
      m_kImagePointsDual.DetachAllEffects();
      m_pkRenderer.ReleaseResources(m_kImagePointsDual);
      m_kImagePointsDual.dispose();
      m_kImagePointsDual = null;
    }

    if (m_kHistogramOutput != null) {
      m_kHistogramOutput.GetTarget(0).GetImage().dispose();
      m_kHistogramOutput.GetTarget(0).dispose();
      m_kHistogramOutput.TerminateBuffer();
      m_kHistogramOutput.dispose();
    }
    if (m_kHistogramOutputB != null) {
      m_kHistogramOutputB.GetTarget(0).GetImage().dispose();
      m_kHistogramOutputB.GetTarget(0).dispose();
      m_kHistogramOutputB.TerminateBuffer();
      m_kHistogramOutputB.dispose();
    }
    if (m_kEntropyOut != null) {
      m_kEntropyOut.GetTarget(0).GetImage().dispose();
      m_kEntropyOut.GetTarget(0).dispose();
      m_kEntropyOut.TerminateBuffer();
      m_kEntropyOut.dispose();
    }
    if (m_akImageReduceEntropy != null) {
      m_pkRenderer.ReleaseResources(m_akImageReduceEntropy);
      m_akImageReduceEntropy.dispose();
    }
    if (m_akCollapse2D != null) {
      m_pkRenderer.ReleaseResources(m_akCollapse2D);
      m_akCollapse2D.dispose();
    }
    if (m_akCollapseColumns != null) {
      m_pkRenderer.ReleaseResources(m_akCollapseColumns);
      m_akCollapseColumns.dispose();
    }
    if (m_akCollapseRows != null) {
      m_pkRenderer.ReleaseResources(m_akCollapseRows);
      m_akCollapseRows.dispose();
    }
  }
  protected void CreateScene(GLAutoDrawable arg0) {
    int iWidth = m_iWidth;
    int iHeight = m_iHeight;

    int iDepth = m_kImageA.nDims == 3 ? m_kImageA.extents[2] : 1;
    m_kHistogramOutput = CreateRenderTarget(arg0, "Histogram2D", iWidth, iHeight);
    m_kHistogramOutputB = CreateRenderTarget(arg0, "Histogram2DB", iWidth, iHeight);
    m_kEntropyOut = CreateRenderTarget(arg0, "EntropyOut", 1, 1);

    if (CreateImageMesh(m_kImageA.extents[0], m_kImageA.extents[1], iDepth) == null) {
      CreateImageMesh(m_kImageA.extents[0], m_kImageA.extents[1], 1);
      m_iRenderLoops = iDepth;
      System.err.println("Switching to 2.5D");
    }
    m_kImagePointsDual.AttachEffect(m_kImageEffectDual);
    m_kImageEffectDual.SetImageSize(m_kImageA.extents[0], m_kImageA.extents[1], iDepth);

    CreateHistogramMesh(m_iWidth, m_iHeight);
    m_akCollapse2D =
        new VolumeHistogramEffect(m_kHistogramOutput.GetTarget(0), VolumeHistogramEffect.NONE);
    m_akCollapseColumns =
        new VolumeHistogramEffect(
            m_kHistogramOutput.GetTarget(0), VolumeHistogramEffect.COLLAPSE_COLUMNS);
    m_akCollapseRows =
        new VolumeHistogramEffect(
            m_kHistogramOutput.GetTarget(0), VolumeHistogramEffect.COLLAPSE_ROWS);

    m_kHistogramPoints2D.AttachEffect(m_akCollapse2D);
    AlphaState pkAState = m_akCollapse2D.GetBlending(0);
    pkAState.BlendEnabled = true;
    pkAState.SrcBlend = AlphaState.SrcBlendMode.SBF_ONE;
    pkAState.DstBlend = AlphaState.DstBlendMode.DBF_ONE;

    m_kHistogramPoints2D.AttachEffect(m_akCollapseColumns);
    pkAState = m_akCollapseColumns.GetBlending(0);
    pkAState.BlendEnabled = true;
    pkAState.SrcBlend = AlphaState.SrcBlendMode.SBF_ONE;
    pkAState.DstBlend = AlphaState.DstBlendMode.DBF_ONE;

    m_kHistogramPoints2D.AttachEffect(m_akCollapseRows);
    pkAState = m_akCollapseRows.GetBlending(0);
    pkAState.BlendEnabled = true;
    pkAState.SrcBlend = AlphaState.SrcBlendMode.SBF_ONE;
    pkAState.DstBlend = AlphaState.DstBlendMode.DBF_ONE;

    double dSize = m_kImageA.dataSize;
    m_akImageReduceEntropy = new ImageReduceEffect(m_kHistogramOutputB.GetTarget(0), dSize);
    m_kEntropyPoints2D.AttachEffect(m_akImageReduceEntropy);
    /*
          m_kImageLineMinPass2a = new LineMinimizationEffect( m_kBracketOut.GetTarget(0), m_kEntropyOut.GetTarget(0), m_fMinDist, (float)dSize, m_kImageA.nDims  );
          m_kImageLineMinDual.SetImageSize( m_kImageA.extents[0],m_kImageA.extents[1],iDepth );
    */
  }
  private void calcEntropy(ModelSimpleImage kImage, double dNumSamples) {
    m_kImagePointsDual.DetachAllEffects();
    m_kImagePointsDual.AttachEffect(m_kImageEffectDual);
    m_pkRenderer.Resize(
        m_kHistogramOutput.GetTarget(0).GetImage().GetBound(0),
        m_kHistogramOutput.GetTarget(0).GetImage().GetBound(1));
    m_kHistogramOutput.Enable();
    m_pkRenderer.ClearColorDepth();
    // m_pkRenderer.ClearBuffers();
    int iDepth = m_kImageA.nDims == 3 ? m_kImageA.extents[2] : 1;
    float fInv2 = 1.0f / (iDepth);
    float fW;
    for (int i = 0; i < m_iRenderLoops; i++) {
      if (m_iRenderLoops == 1) {
        m_kImageEffectDual.ZSlice(0f);
      } else {
        fW = i * fInv2;
        m_kImageEffectDual.ZSlice(((2.0f * fW - 1.0f)));
        m_kImageEffectDual.UseZSlice();
      }
      m_pkRenderer.Draw(m_kImagePointsDual);
    }
    // writeImage();
    m_kHistogramOutput.Disable();
    // printTarget( "HistoOut" , m_kHistogramOutput.GetTarget(0) );

    m_pkRenderer.Resize(
        m_kHistogramOutputB.GetTarget(0).GetImage().GetBound(0),
        m_kHistogramOutputB.GetTarget(0).GetImage().GetBound(1));
    m_kHistogramOutputB.Enable();
    m_pkRenderer.ClearColorDepth();
    // m_pkRenderer.ClearBuffers();

    // m_kHistogramPoints2D.DetachAllEffects();
    // m_kHistogramPoints2D.AttachEffect(m_akCollapse2D);
    m_pkRenderer.Draw(m_kHistogramPoints2D);

    // m_kHistogramPoints2D.DetachAllEffects();
    // m_kHistogramPoints2D.AttachEffect(m_akCollapseColumns);
    // m_pkRenderer.Draw(m_kHistogramPoints2D);

    // m_kHistogramPoints2D.DetachAllEffects();
    // m_kHistogramPoints2D.AttachEffect(m_akCollapseRows);
    // m_pkRenderer.Draw(m_kHistogramPoints2D);

    // m_pkRenderer.Draw(m_kHistogramPoints2D);
    m_kHistogramOutputB.Disable();
    // printTarget( "HistoOut" , m_kHistogramOutputB.GetTarget(0) );
    ReduceDualA(dNumSamples);
  }
  public void setTransform(TransMatrixd kTransform) {
    if (kTransform.getDim() == 3) {
      m_kImageTransformd.MakeIdentity();
      m_kImageTransformd.M00 = kTransform.M00;
      m_kImageTransformd.M01 = kTransform.M01;
      m_kImageTransformd.M02 = 0;
      m_kImageTransformd.M03 = kTransform.M02;

      m_kImageTransformd.M10 = kTransform.M10;
      m_kImageTransformd.M11 = kTransform.M11;
      m_kImageTransformd.M12 = 0;
      m_kImageTransformd.M13 = kTransform.M12;
    } else {
      m_kImageTransformd.Copy(kTransform);
    }
    if (m_kImageEffectDual != null) {
      /*
      Matrix4f toOrigin = new Matrix4f(false);
      Matrix4f fromOrigin = new Matrix4f(false);
      toOrigin.M03 = -m_kImageA.extents[0]/2.0f;
      toOrigin.M13 = -m_kImageA.extents[1]/2.0f;
      fromOrigin.M03 = m_kImageA.extents[0]/2.0f;
      fromOrigin.M13 = m_kImageA.extents[1]/2.0f;
      TransMatrix kMat = new TransMatrix(4,4);
      kMat.setTransform(0,0,0,0,0,15,1,1,1,0,0,0);
      m_kImageTransform.Copy(kMat);
      System.err.println( "captureImage" + m_iScreenCaptureCounter + " " + m_kImageTransform.ToString() );

      m_kImageTransform.MakeIdentity();
      m_kImageTransform.M00 = 0.9666009f;
      m_kImageTransform.M01 = -0.25924882f;
      m_kImageTransform.M02 = 0f;
      m_kImageTransform.M03 = 74.82431f;
      m_kImageTransform.M10 = 0.25845572f;
      m_kImageTransform.M11 = 0.9654881f;
      m_kImageTransform.M12 = 0f;
      m_kImageTransform.M13 = -57.23043f;
      System.err.println( m_kImageTransform.ToString() );
      m_kImageTransform.Inverse();
      System.err.println( m_kImageTransform.ToString() );

      m_kImageTransform.MakeIdentity();
      m_kImageTransform.M00 = 0.9652507f;
      m_kImageTransform.M01 = 0.25918508f;
      m_kImageTransform.M02 = 0f;
      m_kImageTransform.M03 = -56.043213f;
      m_kImageTransform.M10 = -0.25839218f;
      m_kImageTransform.M11 = 0.96636325f;
      m_kImageTransform.M12 = 0f;
      m_kImageTransform.M13 = 72.88661f;
      */
      // m_kImageTransform.MultLeft( m_kToOriginInv );
      // m_kImageTransform.Mult( m_kFromOriginInv );

      // System.err.println( "setTransform " + m_kImageTransform.ToString() );

      // m_kImageTransform.Inverse();

      // m_kImageTransform.MultLeft( m_kToOrigin );
      // m_kImageTransform.Mult( m_kFromOrigin );

      // m_kImageTransform.MultLeft(fromOrigin);
      // m_kImageTransform.Mult(toOrigin);
      m_kImageEffectDual.SetTransform(m_kImageTransformd);
      // System.err.println( m_kImageTransform.ToString() );
    }
  }
  public void dispose(GLAutoDrawable arg0) {

    cleanUp();
    if (m_kTextureA != null) {
      m_kTextureA.Release();
      m_kTextureA.GetImage().dispose();
      m_kTextureA.dispose();
      m_kTextureA = null;
    }
    if (m_kTextureB != null) {
      m_kTextureB.Release();
      m_kTextureB.GetImage().dispose();
      m_kTextureB.dispose();
      m_kTextureB = null;
    }

    if (m_kBracketPoints != null) {
      m_pkRenderer.ReleaseResources(m_kBracketPoints);
      m_kBracketPoints.dispose();
      m_kBracketPoints = null;
    }
    if (m_kTransformPoints != null) {
      m_pkRenderer.ReleaseResources(m_kTransformPoints);
      m_kTransformPoints.dispose();
      m_kTransformPoints = null;
    }

    if (m_kImageEffectDual != null) {
      m_pkRenderer.ReleaseResources(m_kImageEffectDual);
      m_kImageEffectDual.dispose();
    }
    if (m_kImageLineMinDual != null) {
      m_pkRenderer.ReleaseResources(m_kImageLineMinDual);
      m_kImageLineMinDual.dispose();
    }
    if (m_kCalcTransform != null) {
      m_pkRenderer.ReleaseResources(m_kCalcTransform);
      m_kCalcTransform.dispose();
    }

    if (m_kBracketOut != null) {
      m_kBracketOut.GetTarget(0).GetImage().dispose();
      m_kBracketOut.GetTarget(0).dispose();
      m_kBracketOut.TerminateBuffer();
      m_kBracketOut.dispose();
    }
    if (m_kTransformOut != null) {
      m_kTransformOut.GetTarget(0).GetImage().dispose();
      m_kTransformOut.GetTarget(0).dispose();
      m_kTransformOut.TerminateBuffer();
      m_kTransformOut.dispose();
    }
    if (m_kBracketNewOut != null) {
      m_kBracketNewOut.GetTarget(0).GetImage().dispose();
      m_kBracketNewOut.GetTarget(0).dispose();
      m_kBracketNewOut.TerminateBuffer();
      m_kBracketNewOut.dispose();
    }

    ImageCatalog.GetActive().dispose();
    VertexProgramCatalog.GetActive().dispose();
    PixelProgramCatalog.GetActive().dispose();
    CompiledProgramCatalog.GetActive().dispose();

    super.dispose();
  }