From 7b6630cf403aae27f39367b1ccb1a21789c5a83f Mon Sep 17 00:00:00 2001 From: Takahito Tejima Date: Thu, 9 May 2013 13:48:00 -0700 Subject: [PATCH] fix simpleCpu and ptexViewer to be compilable with new patch tables. --- examples/CMakeLists.txt | 4 +- examples/glViewer/viewer.cpp | 6 +- examples/ptexViewer/shader.glsl | 1 - examples/ptexViewer/viewer.cpp | 146 ++++++++------------ examples/simpleCpu/simpleCpuSubdivision.cpp | 8 +- opensubdiv/osd/drawContext.h | 5 + 6 files changed, 74 insertions(+), 96 deletions(-) diff --git a/examples/CMakeLists.txt b/examples/CMakeLists.txt index c077b78e..a3b5a75f 100644 --- a/examples/CMakeLists.txt +++ b/examples/CMakeLists.txt @@ -58,7 +58,7 @@ if( OPENGL_FOUND AND (GLEW_FOUND AND GLFW_FOUND) OR (APPLE AND GLFW_FOUND)) add_subdirectory(glViewer) # add_subdirectory(glBatchViewer) -# add_subdirectory(simpleCpu) + add_subdirectory(simpleCpu) # add_subdirectory(evalTest) # add_subdirectory(limitEval) if(NOT APPLE) @@ -67,7 +67,7 @@ if( OPENGL_FOUND AND (GLEW_FOUND AND GLFW_FOUND) OR (APPLE AND GLFW_FOUND)) endif() if(PTEX_FOUND AND (NOT APPLE)) # the ptexViewer example requires GL functionality not available on OSX -# add_subdirectory(ptexViewer) + add_subdirectory(ptexViewer) endif() else() set(MISSING "") diff --git a/examples/glViewer/viewer.cpp b/examples/glViewer/viewer.cpp index 261e8c61..c8fea074 100644 --- a/examples/glViewer/viewer.cpp +++ b/examples/glViewer/viewer.cpp @@ -1226,7 +1226,7 @@ display() { */ // patch drawing - int patchCount[10][5][4]; // [Type][Pattern][Rotation] (see far/patchTables.h) + int patchCount[10][6][4]; // [Type][Pattern][Rotation] (see far/patchTables.h) memset(patchCount, 0, sizeof(patchCount)); // primitive counting @@ -1329,9 +1329,7 @@ display() { glDisable(GL_CULL_FACE); } - int numIndices = patch.GetNumPatches() * patch.GetDescriptor().GetNumControlVertices(); - - glDrawElements(primType, numIndices, GL_UNSIGNED_INT, + glDrawElements(primType, patch.GetNumIndices(), GL_UNSIGNED_INT, (void *)(patch.GetVertIndex() * sizeof(unsigned int))); if (g_wire == 0) { glEnable(GL_CULL_FACE); diff --git a/examples/ptexViewer/shader.glsl b/examples/ptexViewer/shader.glsl index 33c81d91..dea67a17 100644 --- a/examples/ptexViewer/shader.glsl +++ b/examples/ptexViewer/shader.glsl @@ -59,7 +59,6 @@ //-------------------------------------------------------------- // Common //-------------------------------------------------------------- -uniform isamplerBuffer g_ptexIndicesBuffer; uniform int nonAdaptiveLevel; uniform float displacementScale = 1.0; uniform float bumpScale = 1.0; diff --git a/examples/ptexViewer/viewer.cpp b/examples/ptexViewer/viewer.cpp index 02e89605..97bb1835 100644 --- a/examples/ptexViewer/viewer.cpp +++ b/examples/ptexViewer/viewer.cpp @@ -699,7 +699,7 @@ union Effect { } }; -typedef std::pair EffectDesc; +typedef std::pair EffectDesc; class EffectDrawRegistry : public OpenSubdiv::OsdGLDrawRegistry { @@ -732,16 +732,7 @@ EffectDrawRegistry::_CreateDrawSourceConfig(DescType const & desc) #endif bool quad = true; - if (desc.first.type != OpenSubdiv::kNonPatch) { - - quad = false; - sconfig->tessEvalShader.source = g_shaderSource + sconfig->tessEvalShader.source; - sconfig->tessEvalShader.version = glslVersion; - if (effect.displacement and (not effect.normal)) - sconfig->geometryShader.AddDefine("FLAT_NORMALS"); - if (effect.displacement) - sconfig->tessEvalShader.AddDefine("USE_PTEX_DISPLACEMENT"); - } else { + if (desc.first.GetType() == OpenSubdiv::FarPatchTables::QUADS) { sconfig->vertexShader.source = g_shaderSource; sconfig->vertexShader.version = glslVersion; sconfig->vertexShader.AddDefine("VERTEX_SHADER"); @@ -749,6 +740,14 @@ EffectDrawRegistry::_CreateDrawSourceConfig(DescType const & desc) sconfig->geometryShader.AddDefine("USE_PTEX_DISPLACEMENT"); sconfig->geometryShader.AddDefine("FLAT_NORMALS"); } + } else { + quad = false; + sconfig->tessEvalShader.source = g_shaderSource + sconfig->tessEvalShader.source; + sconfig->tessEvalShader.version = glslVersion; + if (effect.displacement and (not effect.normal)) + sconfig->geometryShader.AddDefine("FLAT_NORMALS"); + if (effect.displacement) + sconfig->tessEvalShader.AddDefine("USE_PTEX_DISPLACEMENT"); } assert(sconfig); @@ -829,11 +828,8 @@ EffectDrawRegistry::_CreateDrawConfig( if ((loc = glGetUniformLocation(config->program, "g_QuadOffsetBuffer")) != -1) { glProgramUniform1i(config->program, loc, 2); // GL_TEXTURE2 } - if ((loc = glGetUniformLocation(config->program, "g_patchLevelBuffer")) != -1) { - glProgramUniform1i(config->program, loc, 3); // GL_TEXTURE3 - } if ((loc = glGetUniformLocation(config->program, "g_ptexIndicesBuffer")) != -1) { - glProgramUniform1i(config->program, loc, 4); // GL_TEXTURE4 + glProgramUniform1i(config->program, loc, 3); // GL_TEXTURE3 } #else glUseProgram(config->program); @@ -846,11 +842,8 @@ EffectDrawRegistry::_CreateDrawConfig( if ((loc = glGetUniformLocation(config->program, "g_QuadOffsetBuffer")) != -1) { glUniform1i(loc, 2); // GL_TEXTURE2 } - if ((loc = glGetUniformLocation(config->program, "g_patchLevelBuffer")) != -1) { - glUniform1i(loc, 3); // GL_TEXTURE3 - } if ((loc = glGetUniformLocation(config->program, "g_ptexIndicesBuffer")) != -1) { - glUniform1i(loc, 4); // GL_TEXTURE4 + glUniform1i(loc, 4); // GL_TEXTURE3 } #endif @@ -860,11 +853,9 @@ EffectDrawRegistry::_CreateDrawConfig( EffectDrawRegistry effectRegistry; EffectDrawRegistry::ConfigType * -getInstance(Effect effect, OpenSubdiv::OsdPatchDescriptor const & patchDesc) { +getInstance(Effect effect, OpenSubdiv::OsdDrawContext::PatchDescriptor const & patchDesc) { - EffectDesc desc; - desc.first = patchDesc; - desc.second = effect; + EffectDesc desc(patchDesc, effect); EffectDrawRegistry::ConfigType * config = effectRegistry.GetDrawConfig(desc); @@ -1244,9 +1235,9 @@ applyImageShader() { //------------------------------------------------------------------------------ static GLuint -bindProgram(Effect effect, OpenSubdiv::OsdPatchArray const & patch) +bindProgram(Effect effect, OpenSubdiv::OsdDrawContext::PatchArray const & patch) { - OpenSubdiv::OsdPatchDescriptor const & desc = patch.desc; + OpenSubdiv::OsdDrawContext::PatchDescriptor const & desc = patch.GetDescriptor(); EffectDrawRegistry::ConfigType * config = getInstance(effect, desc); @@ -1390,24 +1381,24 @@ drawModel() { g_mesh->BindVertexBuffer(); #endif - OpenSubdiv::OsdPatchArrayVector const & patches = g_mesh->GetDrawContext()->patchArrays; + OpenSubdiv::OsdDrawContext::PatchArrayVector const & patches = g_mesh->GetDrawContext()->patchArrays; GLenum primType = GL_LINES_ADJACENCY; glBindVertexArray(g_vao); // patch drawing for (int i=0; i<(int)patches.size(); ++i) { - OpenSubdiv::OsdPatchArray const & patch = patches[i]; + OpenSubdiv::OsdDrawContext::PatchArray const & patch = patches[i]; #if defined(GL_ARB_tessellation_shader) || defined(GL_VERSION_4_0) - OpenSubdiv::OsdPatchType patchType = patch.desc.type; - int patchPattern = patch.desc.pattern; - //int patchRotation = patch.desc.rotation; + OpenSubdiv::OsdDrawContext::PatchDescriptor desc = patch.GetDescriptor(); + OpenSubdiv::FarPatchTables::Type patchType = desc.GetType(); + int patchPattern = desc.GetPattern() - 1; if (g_mesh->GetDrawContext()->IsAdaptive()) { primType = GL_PATCHES; - glPatchParameteri(GL_PATCH_VERTICES, patch.desc.GetPatchSize()); + glPatchParameteri(GL_PATCH_VERTICES, desc.GetNumControlVertices()); if (g_mesh->GetDrawContext()->vertexTextureBuffer) { glActiveTexture(GL_TEXTURE0); @@ -1427,20 +1418,15 @@ drawModel() { glBindTexture(GL_TEXTURE_BUFFER, g_mesh->GetDrawContext()->quadOffsetTextureBuffer); } - if (g_mesh->GetDrawContext()->patchLevelTextureBuffer) { - glActiveTexture(GL_TEXTURE3); - glBindTexture(GL_TEXTURE_BUFFER, - g_mesh->GetDrawContext()->patchLevelTextureBuffer); - } if (g_mesh->GetDrawContext()->ptexCoordinateTextureBuffer) { - glActiveTexture(GL_TEXTURE4); + glActiveTexture(GL_TEXTURE3); glBindTexture(GL_TEXTURE_BUFFER, g_mesh->GetDrawContext()->ptexCoordinateTextureBuffer); } glActiveTexture(GL_TEXTURE0); } else { if (g_mesh->GetDrawContext()->ptexCoordinateTextureBuffer) { - glActiveTexture(GL_TEXTURE4); + glActiveTexture(GL_TEXTURE3); glBindTexture(GL_TEXTURE_BUFFER, g_mesh->GetDrawContext()->ptexCoordinateTextureBuffer); } @@ -1488,50 +1474,40 @@ drawModel() { #if defined(GL_ARB_tessellation_shader) || defined(GL_VERSION_4_0) GLuint overrideColorEnable = glGetUniformLocation(program, "overrideColorEnable"); GLuint overrideColor = glGetUniformLocation(program, "overrideColor"); - switch(patchType) { - case OpenSubdiv::kRegular: - glProgramUniform4f(program, overrideColor, 1.0f, 1.0f, 1.0f, 1); - break; - case OpenSubdiv::kBoundary: - glProgramUniform4f(program, overrideColor, 0.8f, 0.0f, 0.0f, 1); - break; - case OpenSubdiv::kCorner: - glProgramUniform4f(program, overrideColor, 0, 1.0, 0, 1); - break; - case OpenSubdiv::kGregory: - glProgramUniform4f(program, overrideColor, 1.0f, 1.0f, 0.0f, 1); - break; - case OpenSubdiv::kBoundaryGregory: - glProgramUniform4f(program, overrideColor, 1.0f, 0.5f, 0.0f, 1); - break; - case OpenSubdiv::kTransitionRegular: - switch (patchPattern) { - case 0: - glProgramUniform4f(program, overrideColor, 0, 1.0f, 1.0f, 1); - break; - case 1: - glProgramUniform4f(program, overrideColor, 0, 0.5f, 1.0f, 1); - break; - case 2: - glProgramUniform4f(program, overrideColor, 0, 0.5f, 0.5f, 1); - break; - case 3: - glProgramUniform4f(program, overrideColor, 0.5f, 0, 1.0f, 1); - break; - case 4: - glProgramUniform4f(program, overrideColor, 1.0f, 0.5f, 1.0f, 1); - break; + + GLfloat patchColor[10][4] = { + { 1.0f, 1.0f, 1.0f, 1.0f }, // NON_PATCH + { 1.0f, 1.0f, 1.0f, 1.0f }, // POLYGON + { 1.0f, 1.0f, 1.0f, 1.0f }, // QUADS + { 1.0f, 1.0f, 1.0f, 1.0f }, // TRIANGLES + { 1.0f, 1.0f, 1.0f, 1.0f }, // LOOP + { 1.0f, 1.0f, 1.0f, 1.0f }, // REGULAR + { 0.8f, 0.0f, 0.0f, 1.0f }, // BOUNDARY + { 0.0f, 1.0f, 0.0f, 1.0f }, // CORNER + { 1.0f, 1.0f, 0.0f, 1.0f }, // GREGORY + { 1.0f, 0.5f, 0.0f, 1.0f }, // GREGORY_BOUNDARY + }; + GLfloat regularTransitionColor[6][4] = { + { 1.0f, 1.0f, 1.0f, 1.0f }, // NON_TRANSITION + { 0.0f, 1.0f, 1.0f, 1.0f }, // PATTERN0 + { 0.0f, 0.5f, 1.0f, 1.0f }, // PATTERN1 + { 0.0f, 0.5f, 0.5f, 1.0f }, // PATTERN2 + { 0.5f, 0.0f, 1.0f, 1.0f }, // PATTERN3 + { 1.0f, 0.5f, 1.0f, 1.0f }, // PATTERN4 + }; + + if (patchPattern == OpenSubdiv::FarPatchTables::NON_TRANSITION) { + glProgramUniform4fv(program, overrideColor, 1, patchColor[patchType]); + } else { + if (patchType == OpenSubdiv::FarPatchTables::REGULAR) { + glProgramUniform4fv(program, overrideColor, 1, regularTransitionColor[patchPattern]); + } else if (patchType == OpenSubdiv::FarPatchTables::BOUNDARY) { + glProgramUniform4f(program, overrideColor, 0, 0, 0.5f, 1); + } else if (patchType == OpenSubdiv::FarPatchTables::CORNER) { + glProgramUniform4f(program, overrideColor, 0, 0, 0.5f, 1); + } else { + glProgramUniform4f(program, overrideColor, 0.4f, 0.4f, 0.8f, 1); } - break; - case OpenSubdiv::kTransitionBoundary: - glProgramUniform4f(program, overrideColor, 0, 0, 0.5f, 1); - break; - case OpenSubdiv::kTransitionCorner: - glProgramUniform4f(program, overrideColor, 0, 0, 0.5f, 1); - break; - default: - glProgramUniform4f(program, overrideColor, 0.4f, 0.4f, 0.8f, 1); - break; } if (g_displayPatchColor or g_wire == 2) { @@ -1548,12 +1524,12 @@ drawModel() { GLuint uniformGregoryQuadOffset = glGetUniformLocation(program, "GregoryQuadOffsetBase"); GLuint uniformLevelBase = glGetUniformLocation(program, "LevelBase"); - glProgramUniform1i(program, uniformGregoryQuadOffset, patch.gregoryQuadOffsetBase); - glProgramUniform1i(program, uniformLevelBase, patch.levelBase); + glProgramUniform1i(program, uniformGregoryQuadOffset, patch.GetQuadOffsetIndex()); + glProgramUniform1i(program, uniformLevelBase, patch.GetPatchIndex()); glDrawElements(primType, - patch.numIndices, GL_UNSIGNED_INT, - (void *)(patch.firstIndex * sizeof(unsigned int))); + patch.GetNumIndices(), GL_UNSIGNED_INT, + (void *)(patch.GetVertIndex() * sizeof(unsigned int))); if (g_wire == 0) { glEnable(GL_CULL_FACE); } diff --git a/examples/simpleCpu/simpleCpuSubdivision.cpp b/examples/simpleCpu/simpleCpuSubdivision.cpp index 5157158c..c859f863 100644 --- a/examples/simpleCpu/simpleCpuSubdivision.cpp +++ b/examples/simpleCpu/simpleCpuSubdivision.cpp @@ -544,16 +544,16 @@ display() // glBindBuffer(GL_ARRAY_BUFFER, g_vertexBuffer->BindVBO()); - OpenSubdiv::OsdPatchArrayVector const & patches = g_drawContext->patchArrays; + OpenSubdiv::OsdDrawContext::PatchArrayVector const & patches = g_drawContext->patchArrays; for (int i=0; i<(int)patches.size(); ++i) { - OpenSubdiv::OsdPatchArray const & patch = patches[i]; + OpenSubdiv::OsdDrawContext::PatchArray const & patch = patches[i]; // // Bind the solid shaded program and draw elements based on the buffer contents // bindProgram(g_quadFillProgram); - glDrawElements(GL_LINES_ADJACENCY, patch.numIndices, + glDrawElements(GL_LINES_ADJACENCY, patch.GetNumIndices(), GL_UNSIGNED_INT, NULL); // @@ -562,7 +562,7 @@ display() bindProgram(g_quadLineProgram); glUniform4f(glGetUniformLocation(g_quadLineProgram, "fragColor"), 0, 0, 0.5, 1); - glDrawElements(GL_LINES_ADJACENCY, patch.numIndices, + glDrawElements(GL_LINES_ADJACENCY, patch.GetNumIndices(), GL_UNSIGNED_INT, NULL); } diff --git a/opensubdiv/osd/drawContext.h b/opensubdiv/osd/drawContext.h index 1a550b43..589f95b8 100644 --- a/opensubdiv/osd/drawContext.h +++ b/opensubdiv/osd/drawContext.h @@ -157,6 +157,11 @@ public: return _range.npatches; } + /// Returns the number of patch indices in the array + unsigned int GetNumIndices() const { + return _range.npatches * _desc.GetNumControlVertices(); + } + unsigned int GetQuadOffsetIndex() const { return _range.quadOffsetIndex; }