framework2

Форк
0
215 строк · 4.7 Кб
1
#include "ofVboMesh.h"
2
#include "ofGLBaseTypes.h"
3

4
#ifdef TARGET_ANDROID
5
#include "ofxAndroidUtils.h"
6
#endif
7

8
ofVboMesh::ofVboMesh(){
9
	usage= GL_STATIC_DRAW;
10
	vboNumIndices = 0;
11
	vboNumVerts = 0;
12
	vboNumColors = 0;
13
	vboNumTexCoords = 0;
14
	vboNumNormals = 0;
15
}
16

17
ofVboMesh::ofVboMesh(const ofMesh & mom)
18
:ofMesh(mom)
19
{
20
	usage= GL_STATIC_DRAW;
21
	vboNumIndices = 0;
22
	vboNumVerts = 0;
23
	vboNumColors = 0;
24
	vboNumTexCoords = 0;
25
	vboNumNormals = 0;
26
}
27

28
void ofVboMesh::operator=(const ofMesh & mom)
29
{
30
	(*(ofMesh*)this) = mom;
31
	getVertices();
32
	getColors();
33
	getTexCoords();
34
	getNormals();
35
	getIndices();
36
}
37

38
ofVboMesh::~ofVboMesh(){
39
#ifdef TARGET_ANDROID
40
	ofRemoveListener(ofxAndroidEvents().unloadGL,this,&ofVboMesh::unloadVbo);
41
#endif
42
}
43

44
void ofVboMesh::setUsage(int _usage){
45
	usage = _usage;
46
}
47

48
void ofVboMesh::enableColors(){
49
	vbo.enableColors();
50
}
51

52
void ofVboMesh::enableTextures(){
53
	vbo.enableTexCoords();
54
}
55

56
void ofVboMesh::enableNormals(){
57
	vbo.enableNormals();
58
}
59

60
void ofVboMesh::enableIndices(){
61
	vbo.enableIndices();
62
}
63

64
void ofVboMesh::disableColors(){
65
	vbo.disableColors();
66
}
67

68
void ofVboMesh::disableTextures(){
69
	vbo.disableTexCoords();
70
}
71

72
void ofVboMesh::disableNormals(){
73
	vbo.disableNormals();
74
}
75

76
void ofVboMesh::disableIndices(){
77
	vbo.disableIndices();
78
}
79

80
bool ofVboMesh::usingColors() const {
81
	return vbo.getUsingColors();
82
}
83

84
bool ofVboMesh::usingTextures() const {
85
	return vbo.getUsingTexCoords();
86
}
87

88
bool ofVboMesh::usingNormals() const {
89
	return vbo.getUsingNormals();
90
}
91

92
bool ofVboMesh::usingIndices() const {
93
	return vbo.getUsingIndices();
94
}
95

96
ofVbo & ofVboMesh::getVbo() {
97
	updateVbo();
98
	return vbo;
99
};
100

101
const ofVbo & ofVboMesh::getVbo() const{
102
	const_cast<ofVboMesh*>(this)->updateVbo();
103
	return vbo;
104
}
105

106
void ofVboMesh::drawInstanced(ofPolyRenderMode drawMode, int primCount) const{
107
	if(getNumVertices()==0) return;
108
	ofGetGLRenderer()->drawInstanced(*this,drawMode,primCount);
109
}
110

111
void ofVboMesh::draw(ofPolyRenderMode drawMode) const{
112
	if(getNumVertices()==0) return;
113
	drawInstanced(drawMode, 1);
114
}
115

116
void ofVboMesh::unloadVbo(){
117
	vbo.clear();
118
}
119

120
void ofVboMesh::updateVbo(){
121
	if(!vbo.getIsAllocated()){
122
		#ifdef TARGET_ANDROID
123
			ofAddListener(ofxAndroidEvents().unloadGL,this,&ofVboMesh::unloadVbo);
124
		#endif
125
		if(getNumVertices()){
126
			vbo.setVertexData(getVerticesPointer(),getNumVertices(),usage);
127
		}
128
		if(getNumColors()){
129
			vbo.setColorData(getColorsPointer(),getNumColors(),usage);
130
		}
131
		if(getNumNormals()){
132
			vbo.setNormalData(getNormalsPointer(),getNumNormals(),usage);
133
		}
134
		if(getNumTexCoords()){
135
			vbo.setTexCoordData(getTexCoordsPointer(),getNumTexCoords(),usage);
136
		}
137
		if(getNumIndices()){
138
			vbo.setIndexData(getIndexPointer(),getNumIndices(),usage);
139
		}
140
		vboNumIndices = getNumIndices();
141
		vboNumVerts = getNumVertices();
142
		vboNumColors = getNumColors();
143
		vboNumTexCoords = getNumTexCoords();
144
		vboNumNormals = getNumNormals();
145

146
		// we need to call these to reset the changed flags or else next frame
147
		// data will be updated again.
148
		haveVertsChanged();
149
		haveColorsChanged();
150
		haveNormalsChanged();
151
		haveTexCoordsChanged();
152
		haveIndicesChanged();
153
	}else{
154

155
		if(haveVertsChanged()){
156
			if(getNumVertices()==0){
157
				vbo.clearVertices();
158
				vboNumVerts = getNumVertices();
159
			}else if(vboNumVerts<getNumVertices()){
160
				vbo.setVertexData(getVerticesPointer(),getNumVertices(),usage);
161
				vboNumVerts = getNumVertices();
162
			}else{
163
				vbo.updateVertexData(getVerticesPointer(),getNumVertices());
164
			}
165
		}
166

167
		if(haveColorsChanged()){
168
			if(getNumColors()==0){
169
				vbo.clearColors();
170
				vboNumColors = getNumColors();
171
			}else if(vboNumColors<getNumColors()){
172
				vbo.setColorData(getColorsPointer(),getNumColors(),usage);
173
				vboNumColors = getNumColors();
174
			}else{
175
				vbo.updateColorData(getColorsPointer(),getNumColors());
176
			}
177
		}
178

179
		if(haveNormalsChanged()){
180
			if(getNumNormals()==0){
181
				vbo.clearNormals();
182
				vboNumNormals = getNumNormals();
183
			}else if(vboNumNormals<getNumNormals()){
184
				vbo.setNormalData(getNormalsPointer(),getNumNormals(),usage);
185
				vboNumNormals = getNumNormals();
186
			}else{
187
				vbo.updateNormalData(getNormalsPointer(),getNumNormals());
188
			}
189
		}
190

191
		if(haveTexCoordsChanged()){
192
			if(getNumTexCoords()==0){
193
				vbo.clearTexCoords();
194
				vboNumTexCoords = getNumTexCoords();
195
			}else if(vboNumTexCoords<getNumTexCoords()){
196
				vbo.setTexCoordData(getTexCoordsPointer(),getNumTexCoords(),usage);
197
				vboNumTexCoords = getNumTexCoords();
198
			}else{
199
				vbo.updateTexCoordData(getTexCoordsPointer(),getNumTexCoords());
200
			}
201
		}
202

203
		if(haveIndicesChanged()){
204
			if(getNumIndices()==0){
205
				vbo.clearIndices();
206
				vboNumIndices = getNumIndices();
207
			}else if(vboNumIndices<getNumIndices()){
208
				vbo.setIndexData(getIndexPointer(),getNumIndices(),usage);
209
				vboNumIndices = getNumIndices();
210
			}else{
211
				vbo.updateIndexData(getIndexPointer(),getNumIndices());
212
			}
213
		}
214
	}
215
}
216

Использование cookies

Мы используем файлы cookie в соответствии с Политикой конфиденциальности и Политикой использования cookies.

Нажимая кнопку «Принимаю», Вы даете АО «СберТех» согласие на обработку Ваших персональных данных в целях совершенствования нашего веб-сайта и Сервиса GitVerse, а также повышения удобства их использования.

Запретить использование cookies Вы можете самостоятельно в настройках Вашего браузера.