History

first draft of factorizing the rendering traversal for both sides in stereo

Sam Gateau committed 12 years ago

Commit 642f4361 parent c3f764012 files · +160 −134Browse files

Showing the changes to interface/src/renderer/Model.cpp (1 of 12 files). Show all

Unified · Split

interface/src/renderer/Model.cpp+120−112
@@ -1484,8 +1484,10 @@ void Model::deleteGeometry() { · 1483 unmodified lines
14841484 // Scene rendering support
14851485 QVector<Model*> Model::_modelsInScene;
14861486 gpu::Batch Model::_sceneRenderBatch;
1487−void Model::startScene() {
1488− _modelsInScene.clear();
1487+void Model::startScene(RenderArgs::RenderSide renderSide) {
1488+ if (renderSide != RenderArgs::STEREO_RIGHT) {
1489+ _modelsInScene.clear();
1490+ }
14891491 }
14901492
14911493 void Model::setupBatchTransform(gpu::Batch& batch) {
@@ -1503,146 +1505,152 @@ void Model::setupBatchTransform(gpu::Batch& batch) { · 11 unmodified lines
15031505 void Model::endScene(RenderMode mode, RenderArgs* args) {
15041506 PROFILE_RANGE(__FUNCTION__);
15051507
1506− // Let's introduce a gpu::Batch to capture all the calls to the graphics api
1507− _sceneRenderBatch.clear();
1508− gpu::Batch& batch = _sceneRenderBatch;
1508+ auto side = RenderArgs::MONO;
1509+ if (args) side = args->_renderSide;
15091510
1510− GLBATCH(glDisable)(GL_COLOR_MATERIAL);
1511+ if (side != RenderArgs::STEREO_RIGHT) {
1512+ // Let's introduce a gpu::Batch to capture all the calls to the graphics api
1513+ _sceneRenderBatch.clear();
1514+ gpu::Batch& batch = _sceneRenderBatch;
1515+
1516+ GLBATCH(glDisable)(GL_COLOR_MATERIAL);
15111517
1512− if (mode == DIFFUSE_RENDER_MODE || mode == NORMAL_RENDER_MODE) {
1513− GLBATCH(glDisable)(GL_CULL_FACE);
1514− } else {
1515− GLBATCH(glEnable)(GL_CULL_FACE);
1516− if (mode == SHADOW_RENDER_MODE) {
1517− GLBATCH(glCullFace)(GL_FRONT);
1518+ if (mode == DIFFUSE_RENDER_MODE || mode == NORMAL_RENDER_MODE) {
1519+ GLBATCH(glDisable)(GL_CULL_FACE);
1520+ } else {
1521+ GLBATCH(glEnable)(GL_CULL_FACE);
1522+ if (mode == SHADOW_RENDER_MODE) {
1523+ GLBATCH(glCullFace)(GL_FRONT);
1524+ }
15181525 }
1519− }
15201526
1521− // render opaque meshes with alpha testing
1527+ // render opaque meshes with alpha testing
15221528
1523− GLBATCH(glDisable)(GL_BLEND);
1524− GLBATCH(glEnable)(GL_ALPHA_TEST);
1529+ GLBATCH(glDisable)(GL_BLEND);
1530+ GLBATCH(glEnable)(GL_ALPHA_TEST);
15251531
1526− if (mode == SHADOW_RENDER_MODE) {
1527− GLBATCH(glAlphaFunc)(GL_EQUAL, 0.0f);
1528− }
1532+ if (mode == SHADOW_RENDER_MODE) {
1533+ GLBATCH(glAlphaFunc)(GL_EQUAL, 0.0f);
1534+ }
15291535
15301536
1531− /*Application::getInstance()->getTextureCache()->setPrimaryDrawBuffers(
1532− mode == DEFAULT_RENDER_MODE || mode == DIFFUSE_RENDER_MODE,
1533− mode == DEFAULT_RENDER_MODE || mode == NORMAL_RENDER_MODE,
1534− mode == DEFAULT_RENDER_MODE);
1535− */
1536− {
1537− GLenum buffers[3];
1538− int bufferCount = 0;
1539− if (mode == DEFAULT_RENDER_MODE || mode == DIFFUSE_RENDER_MODE) {
1540− buffers[bufferCount++] = GL_COLOR_ATTACHMENT0;
1541− }
1542− if (mode == DEFAULT_RENDER_MODE || mode == NORMAL_RENDER_MODE) {
1543− buffers[bufferCount++] = GL_COLOR_ATTACHMENT1;
1544− }
1545− if (mode == DEFAULT_RENDER_MODE) {
1546− buffers[bufferCount++] = GL_COLOR_ATTACHMENT2;
1537+ /*Application::getInstance()->getTextureCache()->setPrimaryDrawBuffers(
1538+ mode == DEFAULT_RENDER_MODE || mode == DIFFUSE_RENDER_MODE,
1539+ mode == DEFAULT_RENDER_MODE || mode == NORMAL_RENDER_MODE,
1540+ mode == DEFAULT_RENDER_MODE);
1541+ */
1542+ {
1543+ GLenum buffers[3];
1544+ int bufferCount = 0;
1545+ if (mode == DEFAULT_RENDER_MODE || mode == DIFFUSE_RENDER_MODE) {
1546+ buffers[bufferCount++] = GL_COLOR_ATTACHMENT0;
1547+ }
1548+ if (mode == DEFAULT_RENDER_MODE || mode == NORMAL_RENDER_MODE) {
1549+ buffers[bufferCount++] = GL_COLOR_ATTACHMENT1;
1550+ }
1551+ if (mode == DEFAULT_RENDER_MODE) {
1552+ buffers[bufferCount++] = GL_COLOR_ATTACHMENT2;
1553+ }
1554+ GLBATCH(glDrawBuffers)(bufferCount, buffers);
15471555 }
1548− GLBATCH(glDrawBuffers)(bufferCount, buffers);
1549− }
15501556
1551− const float DEFAULT_ALPHA_THRESHOLD = 0.5f;
1557+ const float DEFAULT_ALPHA_THRESHOLD = 0.5f;
15521558
1553− int opaqueMeshPartsRendered = 0;
1559+ int opaqueMeshPartsRendered = 0;
15541560
1555− // now, for each model in the scene, render the mesh portions
1556− opaqueMeshPartsRendered += renderMeshesForModelsInScene(batch, mode, false, DEFAULT_ALPHA_THRESHOLD, false, false, false, args);
1557− opaqueMeshPartsRendered += renderMeshesForModelsInScene(batch, mode, false, DEFAULT_ALPHA_THRESHOLD, false, false, true, args);
1558− opaqueMeshPartsRendered += renderMeshesForModelsInScene(batch, mode, false, DEFAULT_ALPHA_THRESHOLD, false, true, false, args);
1559− opaqueMeshPartsRendered += renderMeshesForModelsInScene(batch, mode, false, DEFAULT_ALPHA_THRESHOLD, false, true, true, args);
1560− opaqueMeshPartsRendered += renderMeshesForModelsInScene(batch, mode, false, DEFAULT_ALPHA_THRESHOLD, true, false, false, args);
1561− opaqueMeshPartsRendered += renderMeshesForModelsInScene(batch, mode, false, DEFAULT_ALPHA_THRESHOLD, true, false, true, args);
1562− opaqueMeshPartsRendered += renderMeshesForModelsInScene(batch, mode, false, DEFAULT_ALPHA_THRESHOLD, true, true, false, args);
1563− opaqueMeshPartsRendered += renderMeshesForModelsInScene(batch, mode, false, DEFAULT_ALPHA_THRESHOLD, true, true, true, args);
1561+ // now, for each model in the scene, render the mesh portions
1562+ opaqueMeshPartsRendered += renderMeshesForModelsInScene(batch, mode, false, DEFAULT_ALPHA_THRESHOLD, false, false, false, args);
1563+ opaqueMeshPartsRendered += renderMeshesForModelsInScene(batch, mode, false, DEFAULT_ALPHA_THRESHOLD, false, false, true, args);
1564+ opaqueMeshPartsRendered += renderMeshesForModelsInScene(batch, mode, false, DEFAULT_ALPHA_THRESHOLD, false, true, false, args);
1565+ opaqueMeshPartsRendered += renderMeshesForModelsInScene(batch, mode, false, DEFAULT_ALPHA_THRESHOLD, false, true, true, args);
1566+ opaqueMeshPartsRendered += renderMeshesForModelsInScene(batch, mode, false, DEFAULT_ALPHA_THRESHOLD, true, false, false, args);
1567+ opaqueMeshPartsRendered += renderMeshesForModelsInScene(batch, mode, false, DEFAULT_ALPHA_THRESHOLD, true, false, true, args);
1568+ opaqueMeshPartsRendered += renderMeshesForModelsInScene(batch, mode, false, DEFAULT_ALPHA_THRESHOLD, true, true, false, args);
1569+ opaqueMeshPartsRendered += renderMeshesForModelsInScene(batch, mode, false, DEFAULT_ALPHA_THRESHOLD, true, true, true, args);
15641570
1565− // render translucent meshes afterwards
1566− //Application::getInstance()->getTextureCache()->setPrimaryDrawBuffers(false, true, true);
1567− {
1568− GLenum buffers[2];
1569− int bufferCount = 0;
1570− buffers[bufferCount++] = GL_COLOR_ATTACHMENT1;
1571− buffers[bufferCount++] = GL_COLOR_ATTACHMENT2;
1572− GLBATCH(glDrawBuffers)(bufferCount, buffers);
1573− }
1571+ // render translucent meshes afterwards
1572+ //Application::getInstance()->getTextureCache()->setPrimaryDrawBuffers(false, true, true);
1573+ {
1574+ GLenum buffers[2];
1575+ int bufferCount = 0;
1576+ buffers[bufferCount++] = GL_COLOR_ATTACHMENT1;
1577+ buffers[bufferCount++] = GL_COLOR_ATTACHMENT2;
1578+ GLBATCH(glDrawBuffers)(bufferCount, buffers);
1579+ }
15741580
1575− int translucentParts = 0;
1576− const float MOSTLY_OPAQUE_THRESHOLD = 0.75f;
1577− translucentParts += renderMeshesForModelsInScene(batch, mode, true, MOSTLY_OPAQUE_THRESHOLD, false, false, false, args);
1578− translucentParts += renderMeshesForModelsInScene(batch, mode, true, MOSTLY_OPAQUE_THRESHOLD, false, false, true, args);
1579− translucentParts += renderMeshesForModelsInScene(batch, mode, true, MOSTLY_OPAQUE_THRESHOLD, false, true, false, args);
1580− translucentParts += renderMeshesForModelsInScene(batch, mode, true, MOSTLY_OPAQUE_THRESHOLD, false, true, true, args);
1581− translucentParts += renderMeshesForModelsInScene(batch, mode, true, MOSTLY_OPAQUE_THRESHOLD, true, false, false, args);
1582− translucentParts += renderMeshesForModelsInScene(batch, mode, true, MOSTLY_OPAQUE_THRESHOLD, true, false, true, args);
1583− translucentParts += renderMeshesForModelsInScene(batch, mode, true, MOSTLY_OPAQUE_THRESHOLD, true, true, false, args);
1584− translucentParts += renderMeshesForModelsInScene(batch, mode, true, MOSTLY_OPAQUE_THRESHOLD, true, true, true, args);
1581+ int translucentParts = 0;
1582+ const float MOSTLY_OPAQUE_THRESHOLD = 0.75f;
1583+ translucentParts += renderMeshesForModelsInScene(batch, mode, true, MOSTLY_OPAQUE_THRESHOLD, false, false, false, args);
1584+ translucentParts += renderMeshesForModelsInScene(batch, mode, true, MOSTLY_OPAQUE_THRESHOLD, false, false, true, args);
1585+ translucentParts += renderMeshesForModelsInScene(batch, mode, true, MOSTLY_OPAQUE_THRESHOLD, false, true, false, args);
1586+ translucentParts += renderMeshesForModelsInScene(batch, mode, true, MOSTLY_OPAQUE_THRESHOLD, false, true, true, args);
1587+ translucentParts += renderMeshesForModelsInScene(batch, mode, true, MOSTLY_OPAQUE_THRESHOLD, true, false, false, args);
1588+ translucentParts += renderMeshesForModelsInScene(batch, mode, true, MOSTLY_OPAQUE_THRESHOLD, true, false, true, args);
1589+ translucentParts += renderMeshesForModelsInScene(batch, mode, true, MOSTLY_OPAQUE_THRESHOLD, true, true, false, args);
1590+ translucentParts += renderMeshesForModelsInScene(batch, mode, true, MOSTLY_OPAQUE_THRESHOLD, true, true, true, args);
15851591
1586− GLBATCH(glDisable)(GL_ALPHA_TEST);
1587− GLBATCH(glEnable)(GL_BLEND);
1588− GLBATCH(glDepthMask)(false);
1589− GLBATCH(glDepthFunc)(GL_LEQUAL);
1592+ GLBATCH(glDisable)(GL_ALPHA_TEST);
1593+ GLBATCH(glEnable)(GL_BLEND);
1594+ GLBATCH(glDepthMask)(false);
1595+ GLBATCH(glDepthFunc)(GL_LEQUAL);
15901596
1591− //Application::getInstance()->getTextureCache()->setPrimaryDrawBuffers(true);
1592− {
1593− GLenum buffers[1];
1594− int bufferCount = 0;
1595− buffers[bufferCount++] = GL_COLOR_ATTACHMENT0;
1596− GLBATCH(glDrawBuffers)(bufferCount, buffers);
1597− }
1597+ //Application::getInstance()->getTextureCache()->setPrimaryDrawBuffers(true);
1598+ {
1599+ GLenum buffers[1];
1600+ int bufferCount = 0;
1601+ buffers[bufferCount++] = GL_COLOR_ATTACHMENT0;
1602+ GLBATCH(glDrawBuffers)(bufferCount, buffers);
1603+ }
15981604
1599− if (mode == DEFAULT_RENDER_MODE || mode == DIFFUSE_RENDER_MODE) {
1600− const float MOSTLY_TRANSPARENT_THRESHOLD = 0.0f;
1601− translucentParts += renderMeshesForModelsInScene(batch, mode, true, MOSTLY_TRANSPARENT_THRESHOLD, false, false, false, args);
1602− translucentParts += renderMeshesForModelsInScene(batch, mode, true, MOSTLY_TRANSPARENT_THRESHOLD, false, false, true, args);
1603− translucentParts += renderMeshesForModelsInScene(batch, mode, true, MOSTLY_TRANSPARENT_THRESHOLD, false, true, false, args);
1604− translucentParts += renderMeshesForModelsInScene(batch, mode, true, MOSTLY_TRANSPARENT_THRESHOLD, false, true, true, args);
1605− translucentParts += renderMeshesForModelsInScene(batch, mode, true, MOSTLY_TRANSPARENT_THRESHOLD, true, false, false, args);
1606− translucentParts += renderMeshesForModelsInScene(batch, mode, true, MOSTLY_TRANSPARENT_THRESHOLD, true, false, true, args);
1607− translucentParts += renderMeshesForModelsInScene(batch, mode, true, MOSTLY_TRANSPARENT_THRESHOLD, true, true, false, args);
1608− translucentParts += renderMeshesForModelsInScene(batch, mode, true, MOSTLY_TRANSPARENT_THRESHOLD, true, true, true, args);
1609− }
1605+ if (mode == DEFAULT_RENDER_MODE || mode == DIFFUSE_RENDER_MODE) {
1606+ const float MOSTLY_TRANSPARENT_THRESHOLD = 0.0f;
1607+ translucentParts += renderMeshesForModelsInScene(batch, mode, true, MOSTLY_TRANSPARENT_THRESHOLD, false, false, false, args);
1608+ translucentParts += renderMeshesForModelsInScene(batch, mode, true, MOSTLY_TRANSPARENT_THRESHOLD, false, false, true, args);
1609+ translucentParts += renderMeshesForModelsInScene(batch, mode, true, MOSTLY_TRANSPARENT_THRESHOLD, false, true, false, args);
1610+ translucentParts += renderMeshesForModelsInScene(batch, mode, true, MOSTLY_TRANSPARENT_THRESHOLD, false, true, true, args);
1611+ translucentParts += renderMeshesForModelsInScene(batch, mode, true, MOSTLY_TRANSPARENT_THRESHOLD, true, false, false, args);
1612+ translucentParts += renderMeshesForModelsInScene(batch, mode, true, MOSTLY_TRANSPARENT_THRESHOLD, true, false, true, args);
1613+ translucentParts += renderMeshesForModelsInScene(batch, mode, true, MOSTLY_TRANSPARENT_THRESHOLD, true, true, false, args);
1614+ translucentParts += renderMeshesForModelsInScene(batch, mode, true, MOSTLY_TRANSPARENT_THRESHOLD, true, true, true, args);
1615+ }
16101616
1611− GLBATCH(glDepthMask)(true);
1612− GLBATCH(glDepthFunc)(GL_LESS);
1613− GLBATCH(glDisable)(GL_CULL_FACE);
1617+ GLBATCH(glDepthMask)(true);
1618+ GLBATCH(glDepthFunc)(GL_LESS);
1619+ GLBATCH(glDisable)(GL_CULL_FACE);
16141620
1615− if (mode == SHADOW_RENDER_MODE) {
1616− GLBATCH(glCullFace)(GL_BACK);
1617− }
1621+ if (mode == SHADOW_RENDER_MODE) {
1622+ GLBATCH(glCullFace)(GL_BACK);
1623+ }
16181624
1619− // deactivate vertex arrays after drawing
1620− GLBATCH(glDisableClientState)(GL_NORMAL_ARRAY);
1621− GLBATCH(glDisableClientState)(GL_VERTEX_ARRAY);
1622− GLBATCH(glDisableClientState)(GL_TEXTURE_COORD_ARRAY);
1623− GLBATCH(glDisableClientState)(GL_COLOR_ARRAY);
1624− GLBATCH(glDisableVertexAttribArray)(gpu::Stream::TANGENT);
1625− GLBATCH(glDisableVertexAttribArray)(gpu::Stream::SKIN_CLUSTER_INDEX);
1626− GLBATCH(glDisableVertexAttribArray)(gpu::Stream::SKIN_CLUSTER_WEIGHT);
1625+ // deactivate vertex arrays after drawing
1626+ GLBATCH(glDisableClientState)(GL_NORMAL_ARRAY);
1627+ GLBATCH(glDisableClientState)(GL_VERTEX_ARRAY);
1628+ GLBATCH(glDisableClientState)(GL_TEXTURE_COORD_ARRAY);
1629+ GLBATCH(glDisableClientState)(GL_COLOR_ARRAY);
1630+ GLBATCH(glDisableVertexAttribArray)(gpu::Stream::TANGENT);
1631+ GLBATCH(glDisableVertexAttribArray)(gpu::Stream::SKIN_CLUSTER_INDEX);
1632+ GLBATCH(glDisableVertexAttribArray)(gpu::Stream::SKIN_CLUSTER_WEIGHT);
16271633
1628− // bind with 0 to switch back to normal operation
1629− GLBATCH(glBindBuffer)(GL_ARRAY_BUFFER, 0);
1630− GLBATCH(glBindBuffer)(GL_ELEMENT_ARRAY_BUFFER, 0);
1631− GLBATCH(glBindTexture)(GL_TEXTURE_2D, 0);
1634+ // bind with 0 to switch back to normal operation
1635+ GLBATCH(glBindBuffer)(GL_ARRAY_BUFFER, 0);
1636+ GLBATCH(glBindBuffer)(GL_ELEMENT_ARRAY_BUFFER, 0);
1637+ GLBATCH(glBindTexture)(GL_TEXTURE_2D, 0);
1638+ if (args) {
1639+ args->_translucentMeshPartsRendered = translucentParts;
1640+ args->_opaqueMeshPartsRendered = opaqueMeshPartsRendered;
1641+ }
1642+
1643+ }
16321644
16331645 // Render!
16341646 {
16351647 PROFILE_RANGE("render Batch");
1636− ::gpu::GLBackend::renderBatch(batch);
1648+ ::gpu::GLBackend::renderBatch(_sceneRenderBatch);
16371649 }
16381650
16391651 // restore all the default material settings
16401652 Application::getInstance()->setupWorldLight();
16411653
1642− if (args) {
1643− args->_translucentMeshPartsRendered = translucentParts;
1644− args->_opaqueMeshPartsRendered = opaqueMeshPartsRendered;
1645− }
16461654 }
16471655
16481656 bool Model::renderInScene(float alpha, RenderArgs* args) {