framework2
705 строк · 17.4 Кб
1/*
2* ofRendererCollection.cpp
3*
4* Created on: Mar 30, 2013
5* Author: arturo
6*/
7
8#include "ofRendererCollection.h"9#include "ofGLRenderer.h"10#include "ofGLProgrammableRenderer.h"11
12const std::string ofRendererCollection::TYPE="collection";13
14std::shared_ptr<ofBaseGLRenderer> ofRendererCollection::getGLRenderer(){15for(auto renderer: renderers){16if(renderer->getType()=="GL" || renderer->getType()=="ProgrammableGL"){17return std::dynamic_pointer_cast<ofBaseGLRenderer>(renderer);18}19}20#ifndef TARGET_PROGRAMMABLE_GL21return std::shared_ptr<ofGLRenderer>();22#else23return std::shared_ptr<ofGLProgrammableRenderer>();24#endif25}
26
27bool ofRendererCollection::rendersPathPrimitives(){return true;}28
29void ofRendererCollection::startRender(){30for(auto renderer: renderers){31renderer->startRender();32}33}
34
35void ofRendererCollection::finishRender(){36for(auto renderer: renderers){37renderer->finishRender();38}39}
40
41void ofRendererCollection::draw(const ofPolyline & poly) const{42for(auto renderer: renderers){43renderer->draw(poly);44}45}
46void ofRendererCollection::draw(const ofPath & shape) const{47for(auto renderer: renderers){48renderer->draw(shape);49}50}
51
52void ofRendererCollection::draw(const ofMesh & vertexData, ofPolyRenderMode mode, bool useColors, bool useTextures, bool useNormals) const{53for(auto renderer: renderers){54renderer->draw(vertexData,mode,useColors,useTextures,useNormals);55}56}
57
58void ofRendererCollection::draw(const of3dPrimitive& model, ofPolyRenderMode renderType ) const {59for(auto renderer: renderers){60renderer->draw( model, renderType );61}62}
63
64void ofRendererCollection::draw(const ofNode& node) const {65for(auto renderer: renderers){66renderer->draw( node );67}68}
69
70void ofRendererCollection::draw(const ofImage & img, float x, float y, float z, float w, float h, float sx, float sy, float sw, float sh) const{71for(auto renderer: renderers){72renderer->draw(img,x,y,z,w,h,sx,sy,sw,sh);73}74}
75
76void ofRendererCollection::draw(const ofFloatImage & img, float x, float y, float z, float w, float h, float sx, float sy, float sw, float sh) const{77for(auto renderer: renderers){78renderer->draw(img,x,y,z,w,h,sx,sy,sw,sh);79}80}
81
82void ofRendererCollection::draw(const ofShortImage & img, float x, float y, float z, float w, float h, float sx, float sy, float sw, float sh) const{83for(auto renderer: renderers){84renderer->draw(img,x,y,z,w,h,sx,sy,sw,sh);85}86}
87
88void ofRendererCollection::draw(const ofBaseVideoDraws & video, float x, float y, float w, float h) const{89for(auto renderer: renderers){90renderer->draw(video,x,y,w,h);91}92}
93
94/*void bind(const ofBaseVideoDraws & video) const{
95for(int i=0;i<(int)renderers.size();i++){
96renderers[i]->bind(video);
97}
98}
99
100void unbind(const ofBaseVideoDraws & video) const{
101for(int i=0;i<(int)renderers.size();i++){
102renderers[i]->unbind(video);
103}
104}*/
105
106
107glm::mat4 ofRendererCollection::getCurrentMatrix(ofMatrixMode matrixMode_) const{108if (!renderers.empty()) {109return renderers.front()->getCurrentMatrix(matrixMode_);110} else {111ofLogWarning() << "No renderer in renderer collection, but current matrix requested. Returning identity matrix.";112return glm::mat4(1.0f);113}114}
115
116
117glm::mat4 ofRendererCollection::getCurrentOrientationMatrix() const{118if (!renderers.empty()) {119return renderers.front()->getCurrentOrientationMatrix();120} else {121ofLogWarning() << "No renderer in renderer collection, but current matrix requested. Returning identity matrix.";122return glm::mat4(1.0f);123}124}
125
126
127glm::mat4 ofRendererCollection::getCurrentNormalMatrix() const{128if (!renderers.empty()) {129return renderers.front()->getCurrentNormalMatrix();130} else {131ofLogWarning() << "No renderer in renderer collection, but current matrix requested. Returning identity matrix.";132return glm::mat4(1.0f);133}134}
135
136//--------------------------------------------
137// transformations
138void ofRendererCollection::pushView(){139for(auto renderer: renderers){140renderer->pushView();141}142}
143
144void ofRendererCollection::popView(){145for(auto renderer: renderers){146renderer->popView();147}148}
149
150// setup matrices and viewport (upto you to push and pop view before and after)
151// if width or height are 0, assume windows dimensions (ofGetWidth(), ofGetHeight())
152// if nearDist or farDist are 0 assume defaults (calculated based on width / height)
153void ofRendererCollection::viewport(ofRectangle viewport){154for(auto renderer: renderers){155renderer->viewport(viewport);156}157}
158
159void ofRendererCollection::viewport(float x, float y, float width, float height, bool vflip){160for(auto renderer: renderers){161renderer->viewport(x,y,width,height,vflip);162}163}
164
165void ofRendererCollection::setupScreenPerspective(float width, float height, float fov, float nearDist, float farDist){166for(auto renderer: renderers){167renderer->setupScreenPerspective(width,height,fov,nearDist,farDist);168}169}
170
171void ofRendererCollection::setupScreenOrtho(float width, float height, float nearDist, float farDist){172for(auto renderer: renderers){173renderer->setupScreenOrtho(width,height,nearDist,farDist);174}175}
176
177ofRectangle ofRendererCollection::getCurrentViewport() const{178if(renderers.size()){179return renderers[0]->getCurrentViewport();180}else{181return ofRectangle();182}183}
184
185ofRectangle ofRendererCollection::getNativeViewport() const{186if(renderers.size()){187return renderers[0]->getNativeViewport();188}else{189return ofRectangle();190}191}
192
193int ofRendererCollection::getViewportWidth() const{194if(renderers.size()){195return renderers[0]->getViewportWidth();196}else{197return 0;198}199}
200int ofRendererCollection::getViewportHeight() const{201if(renderers.size()){202return renderers[0]->getViewportHeight();203}else{204return 0;205}206}
207
208void ofRendererCollection::setCoordHandedness(ofHandednessType handedness){209for(auto renderer: renderers){210renderer->setCoordHandedness(handedness);211}212}
213ofHandednessType ofRendererCollection::getCoordHandedness() const{214if(renderers.size()){215return renderers[0]->getCoordHandedness();216}else{217return OF_LEFT_HANDED;218}219}
220
221//our openGL wrappers
222void ofRendererCollection::pushMatrix(){223for(auto renderer: renderers){224renderer->pushMatrix();225}226}
227void ofRendererCollection::popMatrix(){228for(auto renderer: renderers){229renderer->popMatrix();230}231}
232void ofRendererCollection::translate(float x, float y, float z){233for(auto renderer: renderers){234renderer->translate(x,y,z);235}236}
237void ofRendererCollection::translate(const glm::vec3 & p){238for(auto renderer: renderers){239renderer->translate(p);240}241}
242void ofRendererCollection::scale(float xAmnt, float yAmnt, float zAmnt){243for(auto renderer: renderers){244renderer->scale(xAmnt,yAmnt,zAmnt);245}246}
247
248void ofRendererCollection::rotateDeg(float degrees, float vecX, float vecY, float vecZ){249for(auto renderer: renderers){250renderer->rotateDeg(degrees,vecX,vecY,vecZ);251}252}
253void ofRendererCollection::rotateXDeg(float degrees){254for(auto renderer: renderers){255renderer->rotateXDeg(degrees);256}257}
258void ofRendererCollection::rotateYDeg(float degrees){259for(auto renderer: renderers){260renderer->rotateYDeg(degrees);261}262}
263void ofRendererCollection::rotateZDeg(float degrees){264for(auto renderer: renderers){265renderer->rotateZDeg(degrees);266}267}
268void ofRendererCollection::rotateDeg(float degrees){269for(auto renderer: renderers){270renderer->rotateDeg(degrees);271}272}
273
274void ofRendererCollection::rotateRad(float radians, float vecX, float vecY, float vecZ){275for(auto renderer: renderers){276renderer->rotateRad(radians,vecX,vecY,vecZ);277}278}
279void ofRendererCollection::rotateXRad(float radians){280for(auto renderer: renderers){281renderer->rotateXRad(radians);282}283}
284void ofRendererCollection::rotateYRad(float radians){285for(auto renderer: renderers){286renderer->rotateYRad(radians);287}288}
289void ofRendererCollection::rotateZRad(float radians){290for(auto renderer: renderers){291renderer->rotateZRad(radians);292}293}
294void ofRendererCollection::rotateRad(float radians){295for(auto renderer: renderers){296renderer->rotateRad(radians);297}298}
299
300void ofRendererCollection::loadIdentityMatrix (void){301for(auto renderer: renderers){302renderer->loadIdentityMatrix();303}304}
305
306void ofRendererCollection::loadMatrix (const glm::mat4 & m){307for(auto renderer: renderers){308renderer->loadMatrix( m );309}310}
311
312void ofRendererCollection::loadMatrix (const float * m){313for(auto renderer: renderers){314renderer->loadMatrix( m );315}316}
317
318void ofRendererCollection::multMatrix (const glm::mat4 & m){319for(auto renderer: renderers){320renderer->multMatrix( m );321}322}
323
324void ofRendererCollection::multMatrix (const float * m){325for(auto renderer: renderers){326renderer->multMatrix( m );327}328}
329
330void ofRendererCollection::setOrientation(ofOrientation orientation, bool vflip){331for(auto renderer: renderers){332renderer->setOrientation( orientation, vflip );333}334}
335
336bool ofRendererCollection::isVFlipped() const{337if(!renderers.empty()){338return renderers.front()->isVFlipped();339}else{340ofLogWarning() << "No renderer in renderer collection, but vflipped requested returning true.";341return true;342}343}
344
345void ofRendererCollection::matrixMode(ofMatrixMode mode){346for(auto renderer: renderers){347renderer->matrixMode( mode );348}349}
350
351void ofRendererCollection::loadViewMatrix(const glm::mat4& m){352for(auto renderer: renderers){353renderer->loadViewMatrix( m );354}355}
356
357void ofRendererCollection::multViewMatrix(const glm::mat4& m){358for(auto renderer: renderers){359renderer->multViewMatrix( m );360}361}
362
363glm::mat4 ofRendererCollection::getCurrentViewMatrix() const{364if(!renderers.empty()){365return renderers.front()->getCurrentViewMatrix();366}else{367ofLogWarning() << "No renderer in renderer collection, but current view matrix requested. Returning identity matrix.";368return glm::mat4(1.0);369}370}
371
372
373// screen coordinate things / default gl values
374void ofRendererCollection::setupGraphicDefaults(){375for(auto renderer: renderers){376renderer->setupGraphicDefaults();377}378path.setMode(ofPath::COMMANDS);379path.setUseShapeColor(false);380}
381
382void ofRendererCollection::setupScreen(){383for(auto renderer: renderers){384renderer->setupScreen();385}386}
387
388// color options
389void ofRendererCollection::setColor(int r, int g, int b){390for(auto renderer: renderers){391renderer->setColor(r,g,b);392}393}
394
395void ofRendererCollection::setColor(int r, int g, int b, int a){396for(auto renderer: renderers){397renderer->setColor(r,g,b,a);398}399}
400
401void ofRendererCollection::setColor(const ofColor & color){402for(auto renderer: renderers){403renderer->setColor(color);404}405}
406
407void ofRendererCollection::setColor(const ofColor & color, int _a){408for(auto renderer: renderers){409renderer->setColor(color,_a);410}411}
412
413void ofRendererCollection::setColor(int gray){414for(auto renderer: renderers){415renderer->setColor(gray);416}417}
418
419void ofRendererCollection::ofRendererCollection::setHexColor( int hexColor ){420for(auto renderer: renderers){421renderer->setHexColor(hexColor);422}423} // hex, like web 0xFF0033;424
425// bg color
426ofColor ofRendererCollection::getBackgroundColor(){427if(renderers.size()){428return renderers[0]->getBackgroundColor();429}else{430return ofColor(200);431}432}
433
434void ofRendererCollection::setBackgroundColor(const ofColor & color){435for(auto renderer: renderers){436renderer->setBackgroundColor(color);437}438}
439
440bool ofRendererCollection::getBackgroundAuto(){441if(renderers.size()){442return renderers[0]->getBackgroundAuto();443}else{444return true;445}446}
447
448void ofRendererCollection::background(const ofColor & c){449for(auto renderer: renderers){450renderer->background(c);451}452}
453
454void ofRendererCollection::background(float brightness){455for(auto renderer: renderers){456renderer->background(brightness);457}458}
459
460void ofRendererCollection::background(int hexColor, float _a){461for(auto renderer: renderers){462renderer->background(hexColor,_a);463}464}
465
466void ofRendererCollection::background(int r, int g, int b, int a){467for(auto renderer: renderers){468renderer->background(r,g,b,a);469}470}
471
472void ofRendererCollection::setBackgroundAuto(bool bManual){473for(auto renderer: renderers){474renderer->setBackgroundAuto(bManual);475}476}
477
478void ofRendererCollection::clear(){479for(auto renderer: renderers){480renderer->clear();481}482}
483
484void ofRendererCollection::clear(float r, float g, float b, float a){485for(auto renderer: renderers){486renderer->clear(r,g,b,a);487}488}
489
490void ofRendererCollection::clear(float brightness, float a){491for(auto renderer: renderers){492renderer->clear(brightness,a);493}494}
495
496void ofRendererCollection::clearAlpha(){497for(auto renderer: renderers){498renderer->clearAlpha();499}500}
501
502// drawing modes
503void ofRendererCollection::setRectMode(ofRectMode mode){504for(auto renderer: renderers){505renderer->setRectMode(mode);506}507}
508
509ofRectMode ofRendererCollection::getRectMode(){510if(renderers.empty()){511return OF_RECTMODE_CORNER;512}else{513return renderers[0]->getRectMode();514}515}
516
517void ofRendererCollection::setFillMode(ofFillFlag fill){518for(auto renderer: renderers){519renderer->setFillMode(fill);520}521if(fill==OF_FILLED){522path.setFilled(true);523path.setStrokeWidth(0);524}else{525path.setFilled(false);526path.setStrokeWidth(getStyle().lineWidth);527}528}
529
530ofFillFlag ofRendererCollection::getFillMode(){531if(renderers.empty()){532return OF_FILLED;533}else{534return renderers[0]->getFillMode();535}536}
537
538void ofRendererCollection::setLineWidth(float lineWidth){539for(auto renderer: renderers){540renderer->setLineWidth(lineWidth);541}542if(!getStyle().bFill){543path.setStrokeWidth(lineWidth);544}545}
546
547void ofRendererCollection::setDepthTest(bool depthTest) {548for(auto renderer: renderers){549renderer->setDepthTest(depthTest);550}551}
552
553void ofRendererCollection::setBlendMode(ofBlendMode blendMode){554for(auto renderer: renderers){555renderer->setBlendMode(blendMode);556}557}
558void ofRendererCollection::setLineSmoothing(bool smooth){559for(auto renderer: renderers){560renderer->setLineSmoothing(smooth);561}562}
563void ofRendererCollection::setCircleResolution(int res){564for(auto renderer: renderers){565renderer->setCircleResolution(res);566}567}
568void ofRendererCollection::enablePointSprites(){569for(auto renderer: renderers){570if(renderer->getType()=="GL" || renderer->getType()=="ProgrammableGL"){571std::dynamic_pointer_cast<ofBaseGLRenderer>(renderer)->enablePointSprites();572}573}574}
575void ofRendererCollection::disablePointSprites(){576for(auto renderer: renderers){577if(renderer->getType()=="GL" || renderer->getType()=="ProgrammableGL"){578std::dynamic_pointer_cast<ofBaseGLRenderer>(renderer)->disablePointSprites();579}580}581}
582
583void ofRendererCollection::enableAntiAliasing(){584for(auto renderer: renderers){585renderer->enableAntiAliasing();586}587}
588
589void ofRendererCollection::disableAntiAliasing(){590for(auto renderer: renderers){591renderer->disableAntiAliasing();592}593}
594
595void ofRendererCollection::setBitmapTextMode(ofDrawBitmapMode mode){596for(auto renderer: renderers){597renderer->setBitmapTextMode(mode);598}599}
600
601ofStyle ofRendererCollection::getStyle() const{602if(renderers.empty()){603return ofStyle();604}else{605return renderers[0]->getStyle();606}607}
608
609void ofRendererCollection::pushStyle(){610for(auto renderer: renderers){611renderer->pushStyle();612}613}
614
615void ofRendererCollection::popStyle(){616for(auto renderer: renderers){617renderer->popStyle();618}619}
620
621void ofRendererCollection::setStyle(const ofStyle & style){622for(auto renderer: renderers){623renderer->setStyle(style);624}625}
626
627void ofRendererCollection::setCurveResolution(int res){628for(auto renderer: renderers){629renderer->setCurveResolution(res);630}631path.setCurveResolution(res);632}
633
634void ofRendererCollection::setPolyMode(ofPolyWindingMode mode){635for(auto renderer: renderers){636renderer->setPolyMode(mode);637}638path.setPolyWindingMode(mode);639}
640
641// drawing
642void ofRendererCollection::drawLine(float x1, float y1, float z1, float x2, float y2, float z2) const{643for(auto renderer: renderers){644renderer->drawLine(x1,y1,z1,x2,y2,z2);645}646}
647
648void ofRendererCollection::drawRectangle(float x, float y, float z, float w, float h) const{649for(auto renderer: renderers){650renderer->drawRectangle(x,y,z,w,h);651}652}
653
654void ofRendererCollection::drawTriangle(float x1, float y1, float z1, float x2, float y2, float z2, float x3, float y3, float z3) const{655for(auto renderer: renderers){656renderer->drawTriangle(x1,y1,z1,x2,y2,z2,x3,y3,z3);657}658}
659
660void ofRendererCollection::drawCircle(float x, float y, float z, float radius) const{661for(auto renderer: renderers){662renderer->drawCircle(x,y,z,radius);663}664}
665
666void ofRendererCollection::drawEllipse(float x, float y, float z, float width, float height) const{667for(auto renderer: renderers){668renderer->drawEllipse(x,y,z,width,height);669}670}
671
672void ofRendererCollection::drawString(std::string text, float x, float y, float z) const{673for(auto renderer: renderers){674renderer->drawString(text, x,y,z);675}676}
677
678void ofRendererCollection::drawString(const ofTrueTypeFont & font, std::string text, float x, float y) const{679for(auto renderer: renderers){680renderer->drawString(font, text, x,y);681}682}
683
684void ofRendererCollection::bind(const ofCamera & camera, const ofRectangle & viewport){685for(auto renderer: renderers){686renderer->bind(camera, viewport);687}688}
689void ofRendererCollection::unbind(const ofCamera & camera){690for(auto renderer: renderers){691renderer->unbind(camera);692}693}
694
695const of3dGraphics & ofRendererCollection::get3dGraphics() const{696return graphics3d;697}
698
699of3dGraphics & ofRendererCollection::get3dGraphics(){700return graphics3d;701}
702
703ofPath & ofRendererCollection::getPath(){704return path;705}
706