Working on model rendering modes.

This commit is contained in:
Andrzej Kapolka 2014-04-04 11:45:03 -07:00
parent 38022d2440
commit a0c7e4d3cc
11 changed files with 50 additions and 37 deletions

View file

@ -183,7 +183,7 @@ Menu::Menu() :
#ifdef HAVE_QXMPP #ifdef HAVE_QXMPP
_chatAction = addActionToQMenuAndActionHash(toolsMenu, _chatAction = addActionToQMenuAndActionHash(toolsMenu,
MenuOption::Chat, MenuOption::Chat,
Qt::Key_Return, 0,
this, this,
SLOT(showChat())); SLOT(showChat()));

View file

@ -228,7 +228,7 @@ MetavoxelSystem::RenderVisitor::RenderVisitor() :
} }
bool MetavoxelSystem::RenderVisitor::visit(Spanner* spanner, const glm::vec3& clipMinimum, float clipSize) { bool MetavoxelSystem::RenderVisitor::visit(Spanner* spanner, const glm::vec3& clipMinimum, float clipSize) {
spanner->getRenderer()->render(1.0f, clipMinimum, clipSize); spanner->getRenderer()->render(1.0f, SpannerRenderer::DEFAULT_MODE, clipMinimum, clipSize);
return true; return true;
} }
@ -345,9 +345,9 @@ static void enableClipPlane(GLenum plane, float x, float y, float z, float w) {
glEnable(plane); glEnable(plane);
} }
void ClippedRenderer::render(float alpha, const glm::vec3& clipMinimum, float clipSize) { void ClippedRenderer::render(float alpha, Mode mode, const glm::vec3& clipMinimum, float clipSize) {
if (clipSize == 0.0f) { if (clipSize == 0.0f) {
renderUnclipped(alpha); renderUnclipped(alpha, mode);
return; return;
} }
enableClipPlane(GL_CLIP_PLANE0, -1.0f, 0.0f, 0.0f, clipMinimum.x + clipSize); enableClipPlane(GL_CLIP_PLANE0, -1.0f, 0.0f, 0.0f, clipMinimum.x + clipSize);
@ -357,7 +357,7 @@ void ClippedRenderer::render(float alpha, const glm::vec3& clipMinimum, float cl
enableClipPlane(GL_CLIP_PLANE4, 0.0f, 0.0f, -1.0f, clipMinimum.z + clipSize); enableClipPlane(GL_CLIP_PLANE4, 0.0f, 0.0f, -1.0f, clipMinimum.z + clipSize);
enableClipPlane(GL_CLIP_PLANE5, 0.0f, 0.0f, 1.0f, -clipMinimum.z); enableClipPlane(GL_CLIP_PLANE5, 0.0f, 0.0f, 1.0f, -clipMinimum.z);
renderUnclipped(alpha); renderUnclipped(alpha, mode);
glDisable(GL_CLIP_PLANE0); glDisable(GL_CLIP_PLANE0);
glDisable(GL_CLIP_PLANE1); glDisable(GL_CLIP_PLANE1);
@ -370,9 +370,9 @@ void ClippedRenderer::render(float alpha, const glm::vec3& clipMinimum, float cl
SphereRenderer::SphereRenderer() { SphereRenderer::SphereRenderer() {
} }
void SphereRenderer::render(float alpha, const glm::vec3& clipMinimum, float clipSize) { void SphereRenderer::render(float alpha, Mode mode, const glm::vec3& clipMinimum, float clipSize) {
if (clipSize == 0.0f) { if (clipSize == 0.0f) {
renderUnclipped(alpha); renderUnclipped(alpha, mode);
return; return;
} }
// slight performance optimization: don't render if clip bounds are entirely within sphere // slight performance optimization: don't render if clip bounds are entirely within sphere
@ -381,13 +381,13 @@ void SphereRenderer::render(float alpha, const glm::vec3& clipMinimum, float cli
for (int i = 0; i < Box::VERTEX_COUNT; i++) { for (int i = 0; i < Box::VERTEX_COUNT; i++) {
const float CLIP_PROPORTION = 0.95f; const float CLIP_PROPORTION = 0.95f;
if (glm::distance(sphere->getTranslation(), clipBox.getVertex(i)) >= sphere->getScale() * CLIP_PROPORTION) { if (glm::distance(sphere->getTranslation(), clipBox.getVertex(i)) >= sphere->getScale() * CLIP_PROPORTION) {
ClippedRenderer::render(alpha, clipMinimum, clipSize); ClippedRenderer::render(alpha, mode, clipMinimum, clipSize);
return; return;
} }
} }
} }
void SphereRenderer::renderUnclipped(float alpha) { void SphereRenderer::renderUnclipped(float alpha, Mode mode) {
Sphere* sphere = static_cast<Sphere*>(parent()); Sphere* sphere = static_cast<Sphere*>(parent());
const QColor& color = sphere->getColor(); const QColor& color = sphere->getColor();
glColor4f(color.redF(), color.greenF(), color.blueF(), color.alphaF() * alpha); glColor4f(color.redF(), color.greenF(), color.blueF(), color.alphaF() * alpha);
@ -435,7 +435,7 @@ void StaticModelRenderer::simulate(float deltaTime) {
_model->simulate(deltaTime); _model->simulate(deltaTime);
} }
void StaticModelRenderer::renderUnclipped(float alpha) { void StaticModelRenderer::renderUnclipped(float alpha, Mode mode) {
_model->render(alpha); _model->render(alpha);
} }

View file

@ -147,11 +147,11 @@ class ClippedRenderer : public SpannerRenderer {
public: public:
virtual void render(float alpha, const glm::vec3& clipMinimum, float clipSize); virtual void render(float alpha, Mode mode, const glm::vec3& clipMinimum, float clipSize);
protected: protected:
virtual void renderUnclipped(float alpha) = 0; virtual void renderUnclipped(float alpha, Mode mode) = 0;
}; };
/// Renders spheres. /// Renders spheres.
@ -162,11 +162,11 @@ public:
Q_INVOKABLE SphereRenderer(); Q_INVOKABLE SphereRenderer();
virtual void render(float alpha, const glm::vec3& clipMinimum, float clipSize); virtual void render(float alpha, Mode mode, const glm::vec3& clipMinimum, float clipSize);
protected: protected:
virtual void renderUnclipped(float alpha); virtual void renderUnclipped(float alpha, Mode mode);
}; };
/// Renders static models. /// Renders static models.
@ -184,7 +184,7 @@ public:
protected: protected:
virtual void renderUnclipped(float alpha); virtual void renderUnclipped(float alpha, Mode mode);
private slots: private slots:

View file

@ -179,8 +179,8 @@ void Head::relaxLean(float deltaTime) {
_deltaLeanForward *= relaxationFactor; _deltaLeanForward *= relaxationFactor;
} }
void Head::render(float alpha, bool forShadowMap) { void Head::render(float alpha, Model::RenderMode mode) {
if (_faceModel.render(alpha, forShadowMap) && _renderLookatVectors) { if (_faceModel.render(alpha, mode) && _renderLookatVectors) {
renderLookatVectors(_leftEyePosition, _rightEyePosition, _lookAtPosition); renderLookatVectors(_leftEyePosition, _rightEyePosition, _lookAtPosition);
} }
} }

View file

@ -37,7 +37,7 @@ public:
void init(); void init();
void reset(); void reset();
void simulate(float deltaTime, bool isMine, bool billboard = false); void simulate(float deltaTime, bool isMine, bool billboard = false);
void render(float alpha, bool forShadowMap); void render(float alpha, Model::RenderMode mode);
void setScale(float scale); void setScale(float scale);
void setPosition(glm::vec3 position) { _position = position; } void setPosition(glm::vec3 position) { _position = position; }
void setGravity(glm::vec3 gravity) { _gravity = gravity; } void setGravity(glm::vec3 gravity) { _gravity = gravity; }

View file

@ -281,7 +281,7 @@ bool Model::updateGeometry() {
return needFullUpdate; return needFullUpdate;
} }
bool Model::render(float alpha, bool forShadowMap) { bool Model::render(float alpha, RenderMode mode) {
// render the attachments // render the attachments
foreach (Model* attachment, _attachments) { foreach (Model* attachment, _attachments) {
attachment->render(alpha); attachment->render(alpha);
@ -305,20 +305,20 @@ bool Model::render(float alpha, bool forShadowMap) {
glDisable(GL_COLOR_MATERIAL); glDisable(GL_COLOR_MATERIAL);
glEnable(GL_CULL_FACE); // glEnable(GL_CULL_FACE);
// render opaque meshes with alpha testing // render opaque meshes with alpha testing
glEnable(GL_ALPHA_TEST); glEnable(GL_ALPHA_TEST);
glAlphaFunc(GL_GREATER, 0.5f * alpha); glAlphaFunc(GL_GREATER, 0.5f * alpha);
renderMeshes(alpha, forShadowMap, false); renderMeshes(alpha, mode, false);
glDisable(GL_ALPHA_TEST); glDisable(GL_ALPHA_TEST);
// render translucent meshes afterwards, with back face culling // render translucent meshes afterwards, with back face culling
renderMeshes(alpha, forShadowMap, true); renderMeshes(alpha, mode, true);
glDisable(GL_CULL_FACE); glDisable(GL_CULL_FACE);
@ -1112,7 +1112,7 @@ void Model::deleteGeometry() {
} }
} }
void Model::renderMeshes(float alpha, bool forShadowMap, bool translucent) { void Model::renderMeshes(float alpha, RenderMode mode, bool translucent) {
const FBXGeometry& geometry = _geometry->getFBXGeometry(); const FBXGeometry& geometry = _geometry->getFBXGeometry();
const QVector<NetworkMesh>& networkMeshes = _geometry->getMeshes(); const QVector<NetworkMesh>& networkMeshes = _geometry->getMeshes();
@ -1137,7 +1137,7 @@ void Model::renderMeshes(float alpha, bool forShadowMap, bool translucent) {
ProgramObject* program = &_program; ProgramObject* program = &_program;
ProgramObject* skinProgram = &_skinProgram; ProgramObject* skinProgram = &_skinProgram;
SkinLocations* skinLocations = &_skinLocations; SkinLocations* skinLocations = &_skinLocations;
if (forShadowMap) { if (mode == SHADOW_MAP_MODE) {
program = &_shadowProgram; program = &_shadowProgram;
skinProgram = &_skinShadowProgram; skinProgram = &_skinShadowProgram;
skinLocations = &_skinShadowLocations; skinLocations = &_skinShadowLocations;
@ -1175,7 +1175,7 @@ void Model::renderMeshes(float alpha, bool forShadowMap, bool translucent) {
} }
if (mesh.blendshapes.isEmpty()) { if (mesh.blendshapes.isEmpty()) {
if (!(mesh.tangents.isEmpty() || forShadowMap)) { if (!(mesh.tangents.isEmpty() || mode == SHADOW_MAP_MODE)) {
activeProgram->setAttributeBuffer(tangentLocation, GL_FLOAT, vertexCount * 2 * sizeof(glm::vec3), 3); activeProgram->setAttributeBuffer(tangentLocation, GL_FLOAT, vertexCount * 2 * sizeof(glm::vec3), 3);
activeProgram->enableAttributeArray(tangentLocation); activeProgram->enableAttributeArray(tangentLocation);
} }
@ -1185,7 +1185,7 @@ void Model::renderMeshes(float alpha, bool forShadowMap, bool translucent) {
(mesh.tangents.size() + mesh.colors.size()) * sizeof(glm::vec3))); (mesh.tangents.size() + mesh.colors.size()) * sizeof(glm::vec3)));
} else { } else {
if (!(mesh.tangents.isEmpty() || forShadowMap)) { if (!(mesh.tangents.isEmpty() || mode == SHADOW_MAP_MODE)) {
activeProgram->setAttributeBuffer(tangentLocation, GL_FLOAT, 0, 3); activeProgram->setAttributeBuffer(tangentLocation, GL_FLOAT, 0, 3);
activeProgram->enableAttributeArray(tangentLocation); activeProgram->enableAttributeArray(tangentLocation);
} }
@ -1214,7 +1214,7 @@ void Model::renderMeshes(float alpha, bool forShadowMap, bool translucent) {
continue; continue;
} }
// apply material properties // apply material properties
if (forShadowMap) { if (mode == SHADOW_MAP_MODE) {
glBindTexture(GL_TEXTURE_2D, 0); glBindTexture(GL_TEXTURE_2D, 0);
} else { } else {
@ -1255,7 +1255,7 @@ void Model::renderMeshes(float alpha, bool forShadowMap, bool translucent) {
glDisableClientState(GL_TEXTURE_COORD_ARRAY); glDisableClientState(GL_TEXTURE_COORD_ARRAY);
} }
if (!(mesh.tangents.isEmpty() || forShadowMap)) { if (!(mesh.tangents.isEmpty() || mode == SHADOW_MAP_MODE)) {
glActiveTexture(GL_TEXTURE1); glActiveTexture(GL_TEXTURE1);
glBindTexture(GL_TEXTURE_2D, 0); glBindTexture(GL_TEXTURE_2D, 0);
glActiveTexture(GL_TEXTURE0); glActiveTexture(GL_TEXTURE0);

View file

@ -57,7 +57,10 @@ public:
void init(); void init();
void reset(); void reset();
virtual void simulate(float deltaTime, bool fullUpdate = true); virtual void simulate(float deltaTime, bool fullUpdate = true);
bool render(float alpha = 1.0f, bool forShadowMap = false);
enum RenderMode { DEFAULT_MODE, SHADOW_MAP_MODE, DIFFUSE_MODE, NORMAL_MODE };
bool render(float alpha = 1.0f, RenderMode mode = DEFAULT_MODE);
/// Sets the URL of the model to render. /// Sets the URL of the model to render.
/// \param fallback the URL of a fallback model to render if the requested model fails to load /// \param fallback the URL of a fallback model to render if the requested model fails to load
@ -254,7 +257,7 @@ private:
void applyNextGeometry(); void applyNextGeometry();
void deleteGeometry(); void deleteGeometry();
void renderMeshes(float alpha, bool forShadowMap, bool translucent); void renderMeshes(float alpha, RenderMode mode, bool translucent);
QVector<JointState> createJointStates(const FBXGeometry& geometry); QVector<JointState> createJointStates(const FBXGeometry& geometry);
QSharedPointer<NetworkGeometry> _baseGeometry; ///< reference required to prevent collection of base QSharedPointer<NetworkGeometry> _baseGeometry; ///< reference required to prevent collection of base

View file

@ -569,7 +569,7 @@ void PlaceSpannerTool::render() {
} }
Spanner* spanner = static_cast<Spanner*>(_editor->getValue().value<SharedObjectPointer>().data()); Spanner* spanner = static_cast<Spanner*>(_editor->getValue().value<SharedObjectPointer>().data());
const float SPANNER_ALPHA = 0.25f; const float SPANNER_ALPHA = 0.25f;
spanner->getRenderer()->render(SPANNER_ALPHA, glm::vec3(), 0.0f); spanner->getRenderer()->render(SPANNER_ALPHA, SpannerRenderer::DEFAULT_MODE, glm::vec3(), 0.0f);
} }
bool PlaceSpannerTool::appliesTo(const AttributePointer& attribute) const { bool PlaceSpannerTool::appliesTo(const AttributePointer& attribute) const {
@ -773,6 +773,7 @@ int VoxelizationVisitor::visit(MetavoxelInfo& info) {
int y = qMax(qMin((int)glm::round(relative.y), images.color.height() - 1), 0); int y = qMax(qMin((int)glm::round(relative.y), images.color.height() - 1), 0);
float depth = 1.0f - images.depth.at(y * images.color.width() + x); float depth = 1.0f - images.depth.at(y * images.color.width() + x);
float distance = depth - relative.z; float distance = depth - relative.z;
float extent = images.scale.z * halfSize;
if (distance < 0.0f) { if (distance < 0.0f) {
info.outputValues[0] = AttributeValue(_outputs.at(0)); info.outputValues[0] = AttributeValue(_outputs.at(0));
return STOP_RECURSION; return STOP_RECURSION;
@ -838,8 +839,9 @@ void SetSpannerTool::applyEdit(const AttributePointer& attribute, const SharedOb
minima = glm::min(minima, rotated); minima = glm::min(minima, rotated);
maxima = glm::max(maxima, rotated); maxima = glm::max(maxima, rotated);
} }
int width = glm::round((maxima.x - minima.x) / spannerData->getVoxelizationGranularity()); float renderGranularity = spannerData->getVoxelizationGranularity() / 4.0f;
int height = glm::round((maxima.y - minima.y) / spannerData->getVoxelizationGranularity()); int width = glm::round((maxima.x - minima.x) / renderGranularity);
int height = glm::round((maxima.y - minima.y) / renderGranularity);
glViewport(0, 0, width, height); glViewport(0, 0, width, height);
glScissor(0, 0, width, height); glScissor(0, 0, width, height);
@ -857,7 +859,7 @@ void SetSpannerTool::applyEdit(const AttributePointer& attribute, const SharedOb
Application::getInstance()->updateUntranslatedViewMatrix(); Application::getInstance()->updateUntranslatedViewMatrix();
spannerData->getRenderer()->render(1.0f, glm::vec3(), 0.0f); spannerData->getRenderer()->render(1.0f, SpannerRenderer::DIFFUSE_MODE, glm::vec3(), 0.0f);
DirectionImages images = { QImage(width, height, QImage::Format_ARGB32), DirectionImages images = { QImage(width, height, QImage::Format_ARGB32),
QVector<float>(width * height), minima, maxima, glm::vec3(width / (maxima.x - minima.x), QVector<float>(width * height), minima, maxima, glm::vec3(width / (maxima.x - minima.x),
@ -866,6 +868,8 @@ void SetSpannerTool::applyEdit(const AttributePointer& attribute, const SharedOb
glReadPixels(0, 0, width, height, GL_DEPTH_COMPONENT, GL_FLOAT, images.depth.data()); glReadPixels(0, 0, width, height, GL_DEPTH_COMPONENT, GL_FLOAT, images.depth.data());
directionImages.append(images); directionImages.append(images);
images.color.save(QString::number(i) + ".png");
glMatrixMode(GL_PROJECTION); glMatrixMode(GL_PROJECTION);
} }
glPopMatrix(); glPopMatrix();

View file

@ -869,7 +869,11 @@ Bitstream& Bitstream::operator>(SharedObjectPointer& object) {
*this >> rawObject; *this >> rawObject;
} }
pointer = static_cast<SharedObject*>(rawObject); pointer = static_cast<SharedObject*>(rawObject);
pointer->setRemoteID(id); if (pointer) {
pointer->setRemoteID(id);
} else {
qDebug() << "Null object" << pointer << reference;
}
} }
object = static_cast<SharedObject*>(pointer.data()); object = static_cast<SharedObject*>(pointer.data());
return *this; return *this;

View file

@ -1527,7 +1527,7 @@ void SpannerRenderer::simulate(float deltaTime) {
// nothing by default // nothing by default
} }
void SpannerRenderer::render(float alpha, const glm::vec3& clipMinimum, float clipSize) { void SpannerRenderer::render(float alpha, Mode mode, const glm::vec3& clipMinimum, float clipSize) {
// nothing by default // nothing by default
} }

View file

@ -518,11 +518,13 @@ class SpannerRenderer : public QObject {
public: public:
enum Mode { DEFAULT_MODE, DIFFUSE_MODE, NORMAL_MODE };
Q_INVOKABLE SpannerRenderer(); Q_INVOKABLE SpannerRenderer();
virtual void init(Spanner* spanner); virtual void init(Spanner* spanner);
virtual void simulate(float deltaTime); virtual void simulate(float deltaTime);
virtual void render(float alpha, const glm::vec3& clipMinimum, float clipSize); virtual void render(float alpha, Mode mode, const glm::vec3& clipMinimum, float clipSize);
virtual bool findRayIntersection(const glm::vec3& origin, const glm::vec3& direction, virtual bool findRayIntersection(const glm::vec3& origin, const glm::vec3& direction,
const glm::vec3& clipMinimum, float clipSize, float& distance) const; const glm::vec3& clipMinimum, float clipSize, float& distance) const;
}; };