-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathscreen_root.cpp
128 lines (102 loc) · 4.11 KB
/
screen_root.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
#include "screen_root.h"
#include "glm/gtc/random.hpp"
#include "shader_manager.h"
#include "work_queue.h"
#include "shaders.h"
#include <camera.h>
ScreenRoot::ScreenRoot(ShaderManager * shaderManager, GLuint number):numberOfStars(number) {
generatePoints(numberOfStars);
vector<string> uniforms;
uniforms.push_back(SHADER_UNIFORM_PROJECTION_MATRIX);
vector<string> attribs;
attribs.push_back(SHADER_ATTRIBUTE_POSITION);
shader = shaderManager->createShader(getRelativeLocation("","/shaders/stars.vert"),getRelativeLocation("","/shaders/stars.frag"),attribs,uniforms);
xDeg = 0.0f;
yDeg = 0.0f;
}
void ScreenRoot::generatePoints(GLuint number) {
GLfloat * pointVec = new GLfloat[number * 3];
for (int i = 0; i < number; i++ ) {
glm::vec3 currentNumber(glm::vec3(glm::ballRand(2.5f)));
pointVec[i * 3 ] = currentNumber.x;
pointVec[(i * 3) + 1] = currentNumber.y;
pointVec[(i * 3) + 2] = currentNumber.z-3;
}
GLushort * shortBuffer = new GLushort[number];
for ( size_t i = 0; i < number; i++ ) {
shortBuffer[i]=(GLushort) i;
}
glGenBuffers(1, &vbo);
ALOGI("Creating buffer: %d %d\n", number, vbo);
glBindBuffer(GL_ARRAY_BUFFER, vbo);
glBufferData(GL_ARRAY_BUFFER, number * 3 * sizeof(GLfloat), pointVec, GL_STATIC_DRAW);
delete [] pointVec;
glGenBuffers(1, &indexBuffer);
ALOGI("index buffer: %d\n", indexBuffer);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, indexBuffer);
glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(GLushort) * number, shortBuffer, GL_STATIC_DRAW);
delete [] shortBuffer;
}
void ScreenRoot::drawNode(meow_time_t time, ShaderManager *shaderManager, const glm::mat4 &model,
const glm::mat4 &view, const glm::mat4 &projectionView, const glm::vec3 &eyePos,
const glm::vec3 &lookAt) {
glUseProgram(shaderManager->getShaderProgram(shader));
glDisable(GL_DEPTH_TEST);
GLint attribPosition = shaderManager->getAttrib(shader,SHADER_ATTRIBUTE_POSITION);
glBindBuffer(GL_ARRAY_BUFFER, vbo);
glVertexAttribPointer(attribPosition, 3, GL_FLOAT, GL_FALSE, sizeof(GLfloat) * 3,(GLvoid * ) 0);
checkGlError("attribPosition->glVertexAttribPointer");
glEnableVertexAttribArray(attribPosition);
checkGlError("attribPosition_root->glEnableVertexAttribArray");
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, indexBuffer);
glDrawElements(GL_POINTS, numberOfStars, GL_UNSIGNED_SHORT, (void*)0);
clearBoundBuffers();
glEnable(GL_DEPTH_TEST);
}
void ScreenRoot::drawAfter(meow_time_t time, ShaderManager * shaderManager, const glm::mat4 & model, const glm::mat4 & view, const glm::mat4 & projectionView, const glm::vec3 & eyePos) {
// if (hasLine) {
// glUseProgram(shaderManager->getShaderProgram(shader));
// GLint attribPosition = shaderManager->getAttrib(shader,"a_Position");
//
// glBindBuffer(GL_ARRAY_BUFFER,lineBuffer);
// glVertexAttribPointer(attribPosition, 3, GL_FLOAT, GL_FALSE, 0, 0);
// glDrawArrays(GL_LINES,0,2);
//
// clearBoundBuffers();
// }
}
void ScreenRoot::rotateScene(GLfloat x, GLfloat y) {
xDeg = x;
yDeg = y;
}
void ScreenRoot::setLine(glm::vec3 vecStart, glm::vec3 vecEnd) {
if ( hasLine ) {
glDeleteBuffers(1, &lineBuffer);
}
hasLine = GL_TRUE;
GLfloat position[6];
position[0] = vecStart.x;
position[1] = vecStart.y;
position[2] = vecStart.z;
position[3] = vecEnd.x;
position[4] = vecEnd.y;
position[5] = vecEnd.z;
glGenBuffers(1, &lineBuffer);
glBindBuffer(GL_ARRAY_BUFFER, lineBuffer);
glBufferData(GL_ARRAY_BUFFER, 2 * 3 * sizeof(GLfloat), position, GL_STATIC_DRAW);
}
glm::mat4 ScreenRoot::transformModelView(const glm::mat4 & model) const {
return model * glm::orientate4(glm::vec3((float) xDeg / 5.0f,(float) yDeg / 5.0f,0.0f));
}
ScreenRoot::~ScreenRoot() {
glDeleteBuffers(1,&vbo);
glDeleteBuffers(1,&indexBuffer);
}
void ScreenRoot::setCamera(Camera *camera) {
addNode(camera);
this->camera = camera;
}
void ScreenRoot::processNode(meow_time_t time, engine * gameEngine) {
UNUSED(gameEngine);
UNUSED(time);
}