framework2
215 строк · 4.7 Кб
1#include "ofVboMesh.h"
2#include "ofGLBaseTypes.h"
3
4#ifdef TARGET_ANDROID
5#include "ofxAndroidUtils.h"
6#endif
7
8ofVboMesh::ofVboMesh(){
9usage= GL_STATIC_DRAW;
10vboNumIndices = 0;
11vboNumVerts = 0;
12vboNumColors = 0;
13vboNumTexCoords = 0;
14vboNumNormals = 0;
15}
16
17ofVboMesh::ofVboMesh(const ofMesh & mom)
18:ofMesh(mom)
19{
20usage= GL_STATIC_DRAW;
21vboNumIndices = 0;
22vboNumVerts = 0;
23vboNumColors = 0;
24vboNumTexCoords = 0;
25vboNumNormals = 0;
26}
27
28void ofVboMesh::operator=(const ofMesh & mom)
29{
30(*(ofMesh*)this) = mom;
31getVertices();
32getColors();
33getTexCoords();
34getNormals();
35getIndices();
36}
37
38ofVboMesh::~ofVboMesh(){
39#ifdef TARGET_ANDROID
40ofRemoveListener(ofxAndroidEvents().unloadGL,this,&ofVboMesh::unloadVbo);
41#endif
42}
43
44void ofVboMesh::setUsage(int _usage){
45usage = _usage;
46}
47
48void ofVboMesh::enableColors(){
49vbo.enableColors();
50}
51
52void ofVboMesh::enableTextures(){
53vbo.enableTexCoords();
54}
55
56void ofVboMesh::enableNormals(){
57vbo.enableNormals();
58}
59
60void ofVboMesh::enableIndices(){
61vbo.enableIndices();
62}
63
64void ofVboMesh::disableColors(){
65vbo.disableColors();
66}
67
68void ofVboMesh::disableTextures(){
69vbo.disableTexCoords();
70}
71
72void ofVboMesh::disableNormals(){
73vbo.disableNormals();
74}
75
76void ofVboMesh::disableIndices(){
77vbo.disableIndices();
78}
79
80bool ofVboMesh::usingColors() const {
81return vbo.getUsingColors();
82}
83
84bool ofVboMesh::usingTextures() const {
85return vbo.getUsingTexCoords();
86}
87
88bool ofVboMesh::usingNormals() const {
89return vbo.getUsingNormals();
90}
91
92bool ofVboMesh::usingIndices() const {
93return vbo.getUsingIndices();
94}
95
96ofVbo & ofVboMesh::getVbo() {
97updateVbo();
98return vbo;
99};
100
101const ofVbo & ofVboMesh::getVbo() const{
102const_cast<ofVboMesh*>(this)->updateVbo();
103return vbo;
104}
105
106void ofVboMesh::drawInstanced(ofPolyRenderMode drawMode, int primCount) const{
107if(getNumVertices()==0) return;
108ofGetGLRenderer()->drawInstanced(*this,drawMode,primCount);
109}
110
111void ofVboMesh::draw(ofPolyRenderMode drawMode) const{
112if(getNumVertices()==0) return;
113drawInstanced(drawMode, 1);
114}
115
116void ofVboMesh::unloadVbo(){
117vbo.clear();
118}
119
120void ofVboMesh::updateVbo(){
121if(!vbo.getIsAllocated()){
122#ifdef TARGET_ANDROID
123ofAddListener(ofxAndroidEvents().unloadGL,this,&ofVboMesh::unloadVbo);
124#endif
125if(getNumVertices()){
126vbo.setVertexData(getVerticesPointer(),getNumVertices(),usage);
127}
128if(getNumColors()){
129vbo.setColorData(getColorsPointer(),getNumColors(),usage);
130}
131if(getNumNormals()){
132vbo.setNormalData(getNormalsPointer(),getNumNormals(),usage);
133}
134if(getNumTexCoords()){
135vbo.setTexCoordData(getTexCoordsPointer(),getNumTexCoords(),usage);
136}
137if(getNumIndices()){
138vbo.setIndexData(getIndexPointer(),getNumIndices(),usage);
139}
140vboNumIndices = getNumIndices();
141vboNumVerts = getNumVertices();
142vboNumColors = getNumColors();
143vboNumTexCoords = getNumTexCoords();
144vboNumNormals = getNumNormals();
145
146// we need to call these to reset the changed flags or else next frame
147// data will be updated again.
148haveVertsChanged();
149haveColorsChanged();
150haveNormalsChanged();
151haveTexCoordsChanged();
152haveIndicesChanged();
153}else{
154
155if(haveVertsChanged()){
156if(getNumVertices()==0){
157vbo.clearVertices();
158vboNumVerts = getNumVertices();
159}else if(vboNumVerts<getNumVertices()){
160vbo.setVertexData(getVerticesPointer(),getNumVertices(),usage);
161vboNumVerts = getNumVertices();
162}else{
163vbo.updateVertexData(getVerticesPointer(),getNumVertices());
164}
165}
166
167if(haveColorsChanged()){
168if(getNumColors()==0){
169vbo.clearColors();
170vboNumColors = getNumColors();
171}else if(vboNumColors<getNumColors()){
172vbo.setColorData(getColorsPointer(),getNumColors(),usage);
173vboNumColors = getNumColors();
174}else{
175vbo.updateColorData(getColorsPointer(),getNumColors());
176}
177}
178
179if(haveNormalsChanged()){
180if(getNumNormals()==0){
181vbo.clearNormals();
182vboNumNormals = getNumNormals();
183}else if(vboNumNormals<getNumNormals()){
184vbo.setNormalData(getNormalsPointer(),getNumNormals(),usage);
185vboNumNormals = getNumNormals();
186}else{
187vbo.updateNormalData(getNormalsPointer(),getNumNormals());
188}
189}
190
191if(haveTexCoordsChanged()){
192if(getNumTexCoords()==0){
193vbo.clearTexCoords();
194vboNumTexCoords = getNumTexCoords();
195}else if(vboNumTexCoords<getNumTexCoords()){
196vbo.setTexCoordData(getTexCoordsPointer(),getNumTexCoords(),usage);
197vboNumTexCoords = getNumTexCoords();
198}else{
199vbo.updateTexCoordData(getTexCoordsPointer(),getNumTexCoords());
200}
201}
202
203if(haveIndicesChanged()){
204if(getNumIndices()==0){
205vbo.clearIndices();
206vboNumIndices = getNumIndices();
207}else if(vboNumIndices<getNumIndices()){
208vbo.setIndexData(getIndexPointer(),getNumIndices(),usage);
209vboNumIndices = getNumIndices();
210}else{
211vbo.updateIndexData(getIndexPointer(),getNumIndices());
212}
213}
214}
215}
216