const Matrix& Matrix::operator*=( const Matrix &rhs ) { cairo_matrix_t r; cairo_matrix_multiply( &r, &getCairoMatrix(), &rhs.getCairoMatrix() ); init( r.xx, r.yx, r.xy, r.yy, r.x0, r.y0 ); return *this; }
void ofCairoRenderer::scale(float xAmnt, float yAmnt, float zAmnt ){ if(!surface || !cr) return; cairo_matrix_scale(getCairoMatrix(),xAmnt,yAmnt); setCairoMatrix(); if(!b3D) return; modelView.glScale(xAmnt,yAmnt,zAmnt); }
void ofCairoRenderer::rotateZ(float degrees){ if(!surface || !cr) return; cairo_matrix_rotate(getCairoMatrix(),degrees*DEG_TO_RAD); setCairoMatrix(); if(!b3D) return; modelView.glRotate(180,0,0,1); }
void ofCairoRenderer::draw(vector<ofPoint> & vertexData, ofPrimitiveMode drawMode){ if(vertexData.size()==0) return; pushMatrix(); cairo_matrix_init_identity(getCairoMatrix()); cairo_new_path(cr); //if(indices.getNumIndices()){ int i = 1; ofVec3f v = transform(vertexData[0]); ofVec3f v2; cairo_move_to(cr,v.x,v.y); if(drawMode==OF_PRIMITIVE_TRIANGLE_STRIP){ v = transform(vertexData[1]); cairo_line_to(cr,v.x,v.y); v = transform(vertexData[2]); cairo_line_to(cr,v.x,v.y); i=2; } for(; i<(int)vertexData.size(); i++){ v = transform(vertexData[i]); switch(drawMode){ case(OF_PRIMITIVE_TRIANGLES): if((i+1)%3==0){ cairo_line_to(cr,v.x,v.y); v2 = transform(vertexData[i-2]); cairo_line_to(cr,v2.x,v2.y); cairo_move_to(cr,v.x,v.y); }else if((i+3)%3==0){ cairo_move_to(cr,v.x,v.y); }else{ cairo_line_to(cr,v.x,v.y); } break; case(OF_PRIMITIVE_TRIANGLE_STRIP): v2 = transform(vertexData[i-2]); cairo_line_to(cr,v.x,v.y); cairo_line_to(cr,v2.x,v2.y); cairo_move_to(cr,v.x,v.y); break; case(OF_PRIMITIVE_TRIANGLE_FAN): /*triangles.addIndex((GLuint)0); triangles.addIndex((GLuint)1); triangles.addIndex((GLuint)2); for(int i = 2; i < primitive.getNumVertices()-1;i++){ triangles.addIndex((GLuint)0); triangles.addIndex((GLuint)i); triangles.addIndex((GLuint)i+1); }*/ break; default:break; } } cairo_move_to(cr,vertexData[vertexData.size()-1].x,vertexData[vertexData.size()-1].y); cairo_stroke( cr ); popMatrix(); }
void ofCairoRenderer::translate(float x, float y, float z ){ if(!surface || !cr) return; cairo_matrix_translate(getCairoMatrix(),x,y); setCairoMatrix(); if(!b3D) return; modelView.glTranslate(ofVec3f(x,y,z)); }
void ofCairoRenderer::rotate(float degrees, float vecX, float vecY, float vecZ){ if(!surface || !cr) return; // we can only do Z-axis rotations via cairo_matrix_rotate. if(vecZ == 1.0f) { cairo_matrix_rotate(getCairoMatrix(),degrees*DEG_TO_RAD); setCairoMatrix(); } if(!b3D) return; modelView.glRotate(degrees,vecX,vecY,vecZ); }
void ofCairoRenderer::loadIdentityMatrix (void){ if(!surface || !cr) return; if(currentMatrixMode==OF_MATRIX_MODELVIEW){ cairo_matrix_init_identity(getCairoMatrix()); setCairoMatrix(); } if(!b3D) return; if(currentMatrixMode==OF_MATRIX_MODELVIEW){ modelView.makeIdentityMatrix(); }else if(currentMatrixMode==OF_MATRIX_PROJECTION){ projection.makeIdentityMatrix(); } }
void ofCairoRenderer::draw(ofMesh & primitive, bool useColors, bool useTextures, bool useNormals){ if(primitive.getNumVertices() == 0){ return; } if(primitive.getNumIndices() == 0){ ofMesh indexedMesh = primitive; indexedMesh.setupIndicesAuto(); draw(indexedMesh, useColors, useTextures, useNormals); return; } pushMatrix(); cairo_matrix_init_identity(getCairoMatrix()); cairo_new_path(cr); int i = 1; ofVec3f v = transform(primitive.getVertex(primitive.getIndex(0))); ofVec3f v2; cairo_move_to(cr,v.x,v.y); if(primitive.getMode()==OF_PRIMITIVE_TRIANGLE_STRIP){ v = transform(primitive.getVertex(primitive.getIndex(1))); cairo_line_to(cr,v.x,v.y); v = transform(primitive.getVertex(primitive.getIndex(2))); cairo_line_to(cr,v.x,v.y); i=2; } for(; i<primitive.getNumIndices(); i++){ v = transform(primitive.getVertex(primitive.getIndex(i))); switch(primitive.getMode()){ case(OF_PRIMITIVE_TRIANGLES): if((i+1)%3==0){ cairo_line_to(cr,v.x,v.y); v2 = transform(primitive.getVertex(primitive.getIndex(i-2))); cairo_line_to(cr,v2.x,v2.y); cairo_move_to(cr,v.x,v.y); }else if((i+3)%3==0){ cairo_move_to(cr,v.x,v.y); }else{ cairo_line_to(cr,v.x,v.y); } break; case(OF_PRIMITIVE_TRIANGLE_STRIP): v2 = transform(primitive.getVertex(primitive.getIndex(i-2))); cairo_line_to(cr,v.x,v.y); cairo_line_to(cr,v2.x,v2.y); cairo_move_to(cr,v.x,v.y); break; case(OF_PRIMITIVE_TRIANGLE_FAN): /*triangles.addIndex((GLuint)0); triangles.addIndex((GLuint)1); triangles.addIndex((GLuint)2); for(int i = 2; i < primitive.getNumVertices()-1;i++){ triangles.addIndex((GLuint)0); triangles.addIndex((GLuint)i); triangles.addIndex((GLuint)i+1); }*/ break; default:break; } } cairo_move_to(cr,primitive.getVertex(primitive.getIndex(primitive.getNumIndices()-1)).x,primitive.getVertex(primitive.getIndex(primitive.getNumIndices()-1)).y); if(ofGetStyle().lineWidth>0){ cairo_stroke( cr ); } popMatrix(); }
Vec2f Matrix::transformDistance( const Vec2f &v ) const { double x = v.x, y = v.y; cairo_matrix_transform_distance( &getCairoMatrix(), &x, &y ); return Vec2f( (float)x, (float)y ); }
int32_t Matrix::invert() { return static_cast<int32_t>( cairo_matrix_invert( &getCairoMatrix() ) ); }
void Matrix::rotate( double radians ) { cairo_matrix_rotate( &getCairoMatrix(), radians ); }
void Matrix::scale( double sx, double sy ) { cairo_matrix_scale( &getCairoMatrix(), sx, sy ); }
void Matrix::translate( double tx, double ty ) { cairo_matrix_translate( &getCairoMatrix(), tx, ty ); }
void Matrix::initIdentity() { cairo_matrix_init_identity( &getCairoMatrix() ); }
void ofCairoRenderer::draw(ofPrimitive & primitive){ if(primitive.getNumVertices()==0) return; pushMatrix(); cairo_matrix_init_identity(getCairoMatrix()); cairo_new_path(cr); //if(indices.getNumIndices()){ int i = 1; ofVec3f v = transform(primitive.getVertex(primitive.getIndex(0))); ofVec3f v2; cairo_move_to(cr,v.x,v.y); if(primitive.getMode()==OF_TRIANGLE_STRIP_MODE){ v = transform(primitive.getVertex(primitive.getIndex(1))); cairo_line_to(cr,v.x,v.y); v = transform(primitive.getVertex(primitive.getIndex(2))); cairo_line_to(cr,v.x,v.y); i=2; } for(; i<primitive.getNumIndices(); i++){ v = transform(primitive.getVertex(primitive.getIndex(i))); switch(primitive.getMode()){ case(OF_TRIANGLES_MODE): if((i+1)%3==0){ cairo_line_to(cr,v.x,v.y); v2 = transform(primitive.getVertex(primitive.getIndex(i-2))); cairo_line_to(cr,v2.x,v2.y); cairo_move_to(cr,v.x,v.y); }else if((i+3)%3==0){ cairo_move_to(cr,v.x,v.y); }else{ cairo_line_to(cr,v.x,v.y); } break; case(OF_TRIANGLE_STRIP_MODE): v2 = transform(primitive.getVertex(primitive.getIndex(i-2))); cairo_line_to(cr,v.x,v.y); cairo_line_to(cr,v2.x,v2.y); cairo_move_to(cr,v.x,v.y); break; case(OF_TRIANGLE_FAN_MODE): /*triangles.addIndex((GLuint)0); triangles.addIndex((GLuint)1); triangles.addIndex((GLuint)2); for(int i = 2; i < primitive.getNumVertices()-1;i++){ triangles.addIndex((GLuint)0); triangles.addIndex((GLuint)i); triangles.addIndex((GLuint)i+1); }*/ break; default:break; } } cairo_move_to(cr,primitive.getVertex(primitive.getIndex(primitive.getNumIndices()-1)).x,primitive.getVertex(primitive.getIndex(primitive.getNumIndices()-1)).y); if(ofGetStyle().lineWidth>0){ cairo_stroke( cr ); } popMatrix(); }