views:

41

answers:

1

My application is a vector drawing application. It works with OpenGL. I will be modifying it to instead use the Cairo 2D graphics library. The issue is with zooming. With openGL camera and scale factor sort of work like this:

 float scalediv = Current_Scene().camera.ScaleFactor / 2.0f;
 float cameraX = GetCameraX();
 float cameraY = GetCameraY();
 glMatrixMode(GL_PROJECTION);
 glLoadIdentity();

 float left = cameraX - ((float)controls.MainGlFrame.Dimensions.x) * scalediv;
 float right = cameraX + ((float)controls.MainGlFrame.Dimensions.x) * scalediv;
 float bottom = cameraY - ((float)controls.MainGlFrame.Dimensions.y) * scalediv;
 float top = cameraY + ((float)controls.MainGlFrame.Dimensions.y) * scalediv;

 glOrtho(left,
  right,
  bottom, 
  top,
  -0.01f,0.01f);

 // Set the model matrix as the current matrix
 glMatrixMode(GL_MODELVIEW);
 glLoadIdentity();

 hdc = BeginPaint(controls.MainGlContext.mhWnd,&ps);

Mouse position is obtained like this:

 POINT _mouse = controls.MainGlFrame.GetMousePos();
vector2f mouse = functions.ScreenToWorld(_mouse.x,_mouse.y,GetCameraX(),GetCameraY(),
             Current_Scene().camera.ScaleFactor,
            controls.MainGlFrame.Dimensions.x,
            controls.MainGlFrame.Dimensions.y );

vector2f CGlEngineFunctions::ScreenToWorld(int x, int y, float camx, float camy, float scale, int width, int height)
{
 // Move the given point to the origin, multiply by the zoom factor and
 // add the model coordinates of the center point (camera position)
 vector2f p;


 p.x =  (float)(x - width / 2.0f) * scale +
  camx;

 p.y = -(float)(y - height / 2.0f) * scale +
  camy;

 return p;
}

From there I draw the VBO's of triangles. This allows me to pan and zoom in. Given that Cairo only can draw based on coordinates, how can I make it so that a vertex is properly scaled and panned without using transformations. Basically GlOrtho sets the viewport usually but I dont think I could do this with Cairo.

Well GlOrtho is able to change the viewport matrix instead of modifying the verticies but how could I instead modify the verticies to get the same result?

Thanks

*Given vertex P, which was obtained from ScreenToWorld, how could I modify it so that it is scaled and panned accordng to the camera and scale factor? Because usually OpenGL would essentially do this

A: 

I think Cairo can do what you want ... see http://cairographics.org/matrix_transform/ . Does that solve your problem, and if not, why ?

Calvin1602
Well basically how could I get the transformation matrix to behave the same as what I was doing in GL which was telling it the topmost leftmost, rightmost and bottommost coordinates>
Milo
Well, you could use glgetfloatv to get the two matrices, multiply them, give the 3x3 upper left part to Cairo, and use the remaining rightmost column for translation (probably another function in the Cairo API ?)
Calvin1602