Local2Screen() is returning gibbersh



  • On 14/01/2014 at 08:34, xxxxxxxx wrote:

    User Information:
    Cinema 4D Version:   13 
    Platform:   Windows  ;   
    Language(s) :     C++  ;

    ---------
    Hi,
    I'm trying to get the width of the UI border around the editor window so I can subtract it from the mouse cursor position. So that I can get the mouse coordinates for just the editor window.
    BFM_INPUT_X & BFM_INPUT_Y include the border areas in their calculations. And GetCursorInfo() is not available in tag plugins.

    It works fine for me in python. But I can't get it to work in C++.

    Python

        mx = msg[c4d.BFM_INPUT_X]  
      my = msg[c4d.BFM_INPUT_Y]  
      
      bd = doc.GetActiveBaseDraw()  
      win = bd.GetEditorWindow()  
      wx, wy = win.Local2Screen()  
      print mx-wx   #<---- prints 41  
      print my-wy   #<---- prints 109
    

    C++

    Bool DrawTool::MouseInput(BaseDocument *doc, BaseContainer &data, BaseDraw *bd, EditorWindow *win, const BaseContainer &msg)  
    {  
      BaseContainer state;  
      while (GetInputState(BFM_INPUT_MOUSE, BFM_INPUT_MOUSELEFT, state)) //While the left mouse button is pressed  
      {  
          if (state.GetLong(BFM_INPUT_VALUE) == 0) break; // Break out of the loop when left mouse button is NOT pressed      
          LONG mx = state.GetLong(BFM_INPUT_X);  
          LONG my = state.GetLong(BFM_INPUT_Y);  
      
          LONG wx, wy;   
          bd->GetEditorWindow()->Screen2Local(&wx, &wy);  
          mx = mx-wx;  //<----Gibberish...memory addresses?   858991498  
          my = my-wy;  //<----Gibberish...memory addresses?   858991498  
          GePrint(LongToString(mx));  
      }  
      
      return TRUE;  
    }
    

    What am I doing wrong?
    Is there another way to get the mouse coordinates for just the editor window?
    Something that I can use in things like tag plugins that doesn't support GetCursorInfo().

    -ScottA



  • On 17/01/2014 at 18:56, xxxxxxxx wrote:

    Figured it out.
    The SDK has lots of functions that fill variables with data.
    But once in a while you run into one like this that doesn't fill the variables... It converts them.
    So asking the Screen2Local() function to convert unassigned variables is why I was getting gibberish values from it.

    Here's the C++ code that produces the correct values

    Bool DrawTool::MouseInput(BaseDocument *doc, BaseContainer &data, BaseDraw *bd, EditorWindow *win, const BaseContainer &msg)  
    {  
      BaseContainer state;  
      while (GetInputState(BFM_INPUT_MOUSE, BFM_INPUT_MOUSELEFT, state)) //While the left mouse button is pressed  
      {  
          if (state.GetLong(BFM_INPUT_VALUE) == 0) break; // Break out of the loop when left mouse button is NOT pressed      
          LONG mx = state.GetLong(BFM_INPUT_X);  
          LONG my = state.GetLong(BFM_INPUT_Y);  
      
          //This code gets the editor window's mouse coordinates(not including the UI border area around it)  
          LONG wx = mx;  
          LONG wy = my;   
          bd->GetEditorWindow()->Screen2Local(&wx, &wy);  
          GePrint(LongToString(wx) + " " +LongToString(wy));   
      }  
      
      return TRUE;  
    }
    

    -ScottA


Log in to reply