[Bf-blender-cvs] [f5be775] opensubdiv-modifier: OpenSubdiv: Made textured view totally ready for UV maps
Sergey Sharybin
noreply at git.blender.org
Tue Jul 22 14:58:10 CEST 2014
Commit: f5be7753af563a390c0a8de372a48622a9fc72e1
Author: Sergey Sharybin
Date: Tue Jul 22 17:38:55 2014 +0600
Branches: opensubdiv-modifier
https://developer.blender.org/rBf5be7753af563a390c0a8de372a48622a9fc72e1
OpenSubdiv: Made textured view totally ready for UV maps
===================================================================
M intern/opensubdiv/gpu_shader_opensubd_display.glsl
M intern/opensubdiv/opensubdiv_gpu_capi.cc
M source/blender/blenkernel/intern/subsurf_ccg.c
===================================================================
diff --git a/intern/opensubdiv/gpu_shader_opensubd_display.glsl b/intern/opensubdiv/gpu_shader_opensubd_display.glsl
index 609d1c4..d407c88 100644
--- a/intern/opensubdiv/gpu_shader_opensubd_display.glsl
+++ b/intern/opensubdiv/gpu_shader_opensubd_display.glsl
@@ -215,6 +215,7 @@ uniform float shininess;
uniform sampler2D texture_buffer;
uniform bool use_color_material;
+uniform bool use_texture_2d;
in block {
VertexData v;
@@ -313,11 +314,12 @@ void main()
/* Compute diffuse color. */
float alpha;
-#ifdef USE_TEXTURE
- L_diffuse *= texture2D(texture_buffer, inpt.v.uv).rgb;
-#else
- L_diffuse *= diffuse.rgb;
-#endif
+ if (use_texture_2d) {
+ L_diffuse *= texture2D(texture_buffer, inpt.v.uv).rgb;
+ }
+ else {
+ L_diffuse *= diffuse.rgb;
+ }
alpha = diffuse.a;
/* Sum lighting. */
diff --git a/intern/opensubdiv/opensubdiv_gpu_capi.cc b/intern/opensubdiv/opensubdiv_gpu_capi.cc
index 02824ea..4b4b681 100644
--- a/intern/opensubdiv/opensubdiv_gpu_capi.cc
+++ b/intern/opensubdiv/opensubdiv_gpu_capi.cc
@@ -287,11 +287,9 @@ GLuint linkProgram(const char *define)
glGetUniformBlockIndex(program, "Lighting"),
0);
-#if 0 /* Used for textured view */
glProgramUniform1i(program,
glGetUniformLocation(program, "texture_buffer"),
0); /* GL_TEXTURE0 */
-#endif
glProgramUniform1i(program,
glGetUniformLocation(program, "FVarDataBuffer"),
@@ -325,12 +323,15 @@ void bindProgram(PartitionedGLMeshInterface *mesh,
glBindBufferBase(GL_UNIFORM_BUFFER, 0, g_lighting_ub);
/* Color */
- GLboolean use_lighting, use_color_material;
+ GLboolean use_lighting, use_color_material, use_texture_2d;
glGetBooleanv(GL_LIGHTING, &use_lighting);
glGetBooleanv(GL_COLOR_MATERIAL, &use_color_material);
+ glGetBooleanv(GL_TEXTURE_2D, &use_texture_2d);
glUniform1i(glGetUniformLocation(program, "use_color_material"),
use_color_material);
+ glUniform1i(glGetUniformLocation(program, "use_texture_2d"),
+ use_texture_2d);
if (use_lighting) {
float color[4];
diff --git a/source/blender/blenkernel/intern/subsurf_ccg.c b/source/blender/blenkernel/intern/subsurf_ccg.c
index afc68b5..190f960 100644
--- a/source/blender/blenkernel/intern/subsurf_ccg.c
+++ b/source/blender/blenkernel/intern/subsurf_ccg.c
@@ -2444,27 +2444,53 @@ static void ccgDM_drawFacesTex_common(DerivedMesh *dm,
#ifdef WITH_OPENSUBDIV
if (ccgdm->useGpuBackend) {
- int mat_nr;
- bool drawSmooth;
- MTFace tmp_tf = {{{0}}};
+ MTexPoly *mtexpoly = CustomData_get_layer_n(&ccgdm->dm.polyData,
+ CD_MTEXPOLY,
+ 0);
- if (faceFlags) {
- drawSmooth = (lnors || (faceFlags[0].flag & ME_SMOOTH));
- mat_nr = faceFlags[0].mat_nr;
- }
- else {
- drawSmooth = 1;
- mat_nr = 0;
+ CCGFaceIterator *fi;
+
+ /* TODO(sergey): Face-by-face for now, in order to optimize
+ * this we'll need to pass proper compareDrawOptions.
+ */
+
+ /* If it happens we've got compare callback let us know. */
+ BLI_assert(compareDrawOptions == NULL);
+
+ if (ccgSubSurf_prepareGLMesh(ss, true) == false) {
+ return;
}
- glShadeModel(drawSmooth ? GL_SMOOTH : GL_FLAT);
+ for (fi = ccgSubSurf_getFaceIterator(ss), i = 0;
+ !ccgFaceIterator_isStopped(fi);
+ ccgFaceIterator_next(fi), ++i)
+ {
+ CCGFace *f = ccgFaceIterator_getCurrent(fi);
+ int index = GET_INT_FROM_POINTER(ccgSubSurf_getFaceFaceHandle(f));
+ MTFace tmp_tf;
+ int mat_nr;
+ bool drawSmooth;
- if (drawParams != NULL)
- drawParams(&tmp_tf, (mcol != NULL), mat_nr);
+ ME_MTEXFACE_CPY(&tmp_tf, &mtexpoly[index]);
- if (ccgSubSurf_prepareGLMesh(ss, true)) {
- ccgSubSurf_drawGLMesh(ss, true, -1, -1);
+ if (faceFlags) {
+ drawSmooth = (lnors || (faceFlags[0].flag & ME_SMOOTH));
+ mat_nr = faceFlags[0].mat_nr;
+ }
+ else {
+ drawSmooth = 1;
+ mat_nr = 0;
+ }
+
+ glShadeModel(drawSmooth ? GL_SMOOTH : GL_FLAT);
+
+ if (drawParams != NULL)
+ drawParams(&tmp_tf, (mcol != NULL), mat_nr);
+
+ ccgSubSurf_drawGLMesh(ss, true, i, 1);
}
+ ccgFaceIterator_free(fi);
+
return;
}
#endif
@@ -4096,7 +4122,10 @@ static CCGDerivedMesh *getCCGDerivedMesh(CCGSubSurf *ss,
}
else {
DM_from_template(&ccgdm->dm, dm, DM_TYPE_CCGDM,
- 0, 0, 0, 0, 0);
+ 0, 0, 0, 0, dm->getNumPolys(dm));
+ CustomData_copy_data(&dm->polyData,
+ &ccgdm->dm.polyData,
+ 0, 0, dm->getNumPolys(dm));
}
set_default_ccgdm_callbacks(ccgdm);
More information about the Bf-blender-cvs
mailing list