more removal of immediate mode

This commit is contained in:
ZappoMan 2015-01-06 14:14:13 -08:00
parent 0d63391be8
commit 1bfce7d876
5 changed files with 44 additions and 27 deletions

View file

@ -986,10 +986,16 @@ int Avatar::parseDataAtOffset(const QByteArray& packet, int offset) {
return bytesRead;
}
int Avatar::_jointConesID = GeometryCache::UNKNOWN_ID;
// render a makeshift cone section that serves as a body part connecting joint spheres
void Avatar::renderJointConnectingCone(glm::vec3 position1, glm::vec3 position2, float radius1, float radius2) {
GeometryCache::SharedPointer geometryCache = DependencyManager::get<GeometryCache>();
glBegin(GL_TRIANGLES);
if (_jointConesID == GeometryCache::UNKNOWN_ID) {
_jointConesID = geometryCache->allocateID();
}
glm::vec3 axis = position2 - position1;
float length = glm::length(axis);
@ -1004,6 +1010,7 @@ void Avatar::renderJointConnectingCone(glm::vec3 position1, glm::vec3 position2,
float anglea = 0.0f;
float angleb = 0.0f;
QVector<glm::vec3> points;
for (int i = 0; i < NUM_BODY_CONE_SIDES; i ++) {
@ -1022,16 +1029,14 @@ void Avatar::renderJointConnectingCone(glm::vec3 position1, glm::vec3 position2,
glm::vec3 p2a = position2 + perpSin * sa * radius2 + perpCos * ca * radius2;
glm::vec3 p2b = position2 + perpSin * sb * radius2 + perpCos * cb * radius2;
glVertex3f(p1a.x, p1a.y, p1a.z);
glVertex3f(p1b.x, p1b.y, p1b.z);
glVertex3f(p2a.x, p2a.y, p2a.z);
glVertex3f(p1b.x, p1b.y, p1b.z);
glVertex3f(p2a.x, p2a.y, p2a.z);
glVertex3f(p2b.x, p2b.y, p2b.z);
points << p1a << p1b << p2a << p1b << p2a << p2b;
}
// TODO: this is really inefficient constantly recreating these vertices buffers. It would be
// better if the avatars cached these buffers for each of the joints they are rendering
geometryCache->updateVertices(_jointConesID, points);
geometryCache->renderVertices(GL_TRIANGLES, _jointConesID);
}
glEnd();
}
void Avatar::updateCollisionGroups() {

View file

@ -244,6 +244,8 @@ private:
void renderBillboard();
float getBillboardSize() const;
static int _jointConesID;
};
#endif // hifi_Avatar_h

View file

@ -31,6 +31,7 @@ enum StandingFootState {
SkeletonModel::SkeletonModel(Avatar* owningAvatar, QObject* parent) :
Model(parent),
_triangleFanID(DependencyManager::get<GeometryCache>()->allocateID()),
_owningAvatar(owningAvatar),
_boundingShape(),
_boundingShapeLocalOffset(0.0f),
@ -38,7 +39,8 @@ SkeletonModel::SkeletonModel(Avatar* owningAvatar, QObject* parent) :
_defaultEyeModelPosition(glm::vec3(0.0f, 0.0f, 0.0f)),
_standingFoot(NO_FOOT),
_standingOffset(0.0f),
_clampedFootPosition(0.0f) {
_clampedFootPosition(0.0f)
{
}
SkeletonModel::~SkeletonModel() {
@ -336,6 +338,9 @@ void SkeletonModel::renderJointConstraints(int jointIndex) {
float fanScale = directionSize * 0.75f;
glScalef(fanScale, fanScale, fanScale);
const int AXIS_COUNT = 3;
GeometryCache::SharedPointer geometryCache = DependencyManager::get<GeometryCache>();
for (int i = 0; i < AXIS_COUNT; i++) {
if (joint.rotationMin[i] <= -PI + EPSILON && joint.rotationMax[i] >= PI - EPSILON) {
continue; // unconstrained
@ -350,16 +355,20 @@ void SkeletonModel::renderJointConstraints(int jointIndex) {
otherAxis.x = 1.0f;
}
glColor4f(otherAxis.r, otherAxis.g, otherAxis.b, 0.75f);
glBegin(GL_TRIANGLE_FAN);
glVertex3f(0.0f, 0.0f, 0.0f);
QVector<glm::vec3> points;
points << glm::vec3(0.0f, 0.0f, 0.0f);
const int FAN_SEGMENTS = 16;
for (int j = 0; j < FAN_SEGMENTS; j++) {
glm::vec3 rotated = glm::angleAxis(glm::mix(joint.rotationMin[i], joint.rotationMax[i],
(float)j / (FAN_SEGMENTS - 1)), axis) * otherAxis;
glVertex3f(rotated.x, rotated.y, rotated.z);
points << rotated;
}
glEnd();
// TODO: this is really inefficient constantly recreating these vertices buffers. It would be
// better if the skeleton model cached these buffers for each of the joints they are rendering
geometryCache->updateVertices(_triangleFanID, points);
geometryCache->renderVertices(GL_TRIANGLE_FAN, _triangleFanID);
}
glPopMatrix();

View file

@ -152,6 +152,7 @@ private:
int _right;
};
QHash<int, OrientationLineIDs> _jointOrientationLines;
int _triangleFanID;
/// \param jointIndex index of joint in model
/// \param position position of joint in model-frame

View file

@ -523,11 +523,11 @@ void GeometryCache::renderGrid(int x, int y, int width, int height, int rows, in
Vec3Pair& lastKey = _lastRegisteredGrid[id];
if (lastKey != key) {
buffer.destroy();
#if 1// def WANT_DEBUG
#ifdef WANT_DEBUG
qDebug() << "renderGrid()... RELEASING REGISTERED";
#endif // def WANT_DEBUG
}
#if 1// def WANT_DEBUG
#ifdef WANT_DEBUG
else {
qDebug() << "renderGrid()... REUSING PREVIOUSLY REGISTERED";
}
@ -575,7 +575,7 @@ void GeometryCache::renderGrid(int x, int y, int width, int height, int rows, in
buffer.allocate(vertexData, vertices * 2 * sizeof(GLfloat));
delete[] vertexData;
#if 1 //def WANT_DEBUG
#ifdef WANT_DEBUG
if (id == UNKNOWN_ID) {
qDebug() << "new grid buffer made -- _alternateGridBuffers.size():" << _alternateGridBuffers.size();
} else {
@ -602,7 +602,7 @@ void GeometryCache::updateVertices(int id, const QVector<glm::vec2>& points) {
if (details.buffer.isCreated()) {
details.buffer.destroy();
#if 1// def WANT_DEBUG
#ifdef WANT_DEBUG
qDebug() << "updateVertices()... RELEASING REGISTERED";
#endif // def WANT_DEBUG
}
@ -625,7 +625,7 @@ void GeometryCache::updateVertices(int id, const QVector<glm::vec2>& points) {
details.buffer.allocate(vertexData, details.vertices * FLOATS_PER_VERTEX * sizeof(GLfloat));
delete[] vertexData;
#if 1 //def WANT_DEBUG
#ifdef WANT_DEBUG
qDebug() << "new registered vertices buffer made -- _registeredVertices.size():" << _registeredVertices.size();
#endif
}
@ -635,7 +635,7 @@ void GeometryCache::updateVertices(int id, const QVector<glm::vec3>& points) {
if (details.buffer.isCreated()) {
details.buffer.destroy();
#if 1// def WANT_DEBUG
#ifdef WANT_DEBUG
qDebug() << "updateVertices()... RELEASING REGISTERED";
#endif // def WANT_DEBUG
}
@ -659,7 +659,7 @@ void GeometryCache::updateVertices(int id, const QVector<glm::vec3>& points) {
details.buffer.allocate(vertexData, details.vertices * FLOATS_PER_VERTEX * sizeof(GLfloat));
delete[] vertexData;
#if 1 //def WANT_DEBUG
#ifdef WANT_DEBUG
qDebug() << "new registered linestrip buffer made -- _registeredVertices.size():" << _registeredVertices.size();
#endif
}
@ -1326,7 +1326,7 @@ void GeometryCache::renderDashedLine(const glm::vec3& start, const glm::vec3& en
if (_lastRegisteredDashedLines[id] != key) {
details.buffer.destroy();
_lastRegisteredDashedLines[id] = key;
#if 1// def WANT_DEBUG
#ifdef WANT_DEBUG
qDebug() << "renderDashedLine()... RELEASING REGISTERED";
#endif // def WANT_DEBUG
}
@ -1379,7 +1379,7 @@ void GeometryCache::renderDashedLine(const glm::vec3& start, const glm::vec3& en
details.buffer.allocate(vertexData, details.vertices * FLOATS_PER_VERTEX * sizeof(GLfloat));
delete[] vertexData;
#if 1 //def WANT_DEBUG
#ifdef WANT_DEBUG
if (registered) {
qDebug() << "new registered dashed line buffer made -- _registeredVertices:" << _registeredDashedLines.size();
} else {
@ -1494,11 +1494,11 @@ void GeometryCache::renderLine(const glm::vec2& p1, const glm::vec2& p2, int id)
glDeleteBuffers(1, &vbo.first);
glDeleteBuffers(1, &vbo.second);
vbo.first = vbo.second = 0;
#if 1 // def WANT_DEBUG
#ifdef WANT_DEBUG
qDebug() << "renderLine() 2D... RELEASING REGISTERED line";
#endif // def WANT_DEBUG
}
#if 1 // def WANT_DEBUG
#ifdef WANT_DEBUG
else {
qDebug() << "renderLine() 2D... REUSING PREVIOUSLY REGISTERED line";
}
@ -1544,7 +1544,7 @@ void GeometryCache::renderLine(const glm::vec2& p1, const glm::vec2& p2, int id)
glBufferData(GL_ELEMENT_ARRAY_BUFFER, indices * NUM_BYTES_PER_INDEX, indexData, GL_STATIC_DRAW);
delete[] indexData;
#if 1 // def WANT_DEBUG
#ifdef WANT_DEBUG
if (id == UNKNOWN_ID) {
qDebug() << "new renderLine() 2D VBO made -- _line2DVBOs.size():" << _line2DVBOs.size();
} else {